当前位置: 首页 > 知识库问答 >
问题:

iText-PdfCopy中pagestamp的持久性

衡建中
2023-03-14

我正在使用iText4.2.1生成pdf报告。所以基本上我有一个PDF模板,它包含一个封面页,结束页和一个内容页(只包含一个图像头)。

我正在使用pdfcopy&pdfimportedpage复制我的模板,并使用pageStamp动态添加我的内容。

需要:我需要多次使用内容页:与报表中的内容页一样多。

下面是一个代码示例:


    // Init
    Document doc = new Document();
    PdfCopy pdfCopy = new PdfCopy( doc, new FileOutputStream( new File("Result.pdf") ) );
    doc.open();
    PdfReader pdfReader = new PdfReader( "pdf-template.pdf" );

    // Page 1
    PdfImportedPage importedPage1= pdfCopy.getImportedPage(pdfReader, 2);
    String text1= "Text of the first page - 1";
    PageStamp stamp1 = pdfCopy.createPageStamp( importedPage1 );
    ColumnText.showTextAligned( stamp.getOverContent(), Element.ALIGN_CENTER,
                                new Phrase(text1), 400, 500, 0 );
    stamp.alterContents();
    pdfCopy.addPage(importedPage1);

    // Page 2
    PdfImportedPage importedPage2= pdfCopy.getImportedPage(pdfReader, 2);
    String text2 = "Text of the second page - 2";
    PageStamp stamp2 = pdfCopy.createPageStamp( importedPage2 );
    ColumnText.showTextAligned( stamp2.getOverContent(), Element.ALIGN_CENTER, 
                                new Phrase(text2), 200, 700, 0 );
    stamp2.alterContents();
    pdfCopy.addPage(importedPage2);

    // Closing
    doc.close();

-->在第2页中,我将看到我的文本1和文本2

我尝试使用相同的pdfimportedpage:相同的结果。

谢谢你的帮助。

共有1个答案

戚弘和
2023-03-14

@Bruno和@Amedee已经评论了使用4.2.1版本,所以我不需要谈论这个。不过,您所问的问题对于当前的iText版本仍然有效。因此:

问题:如果我使用pdfcopy.createPageStamp(importedPage)和columntext.showtextaligned添加一些文本,那么标记将持续存在于下一个内容页面上。因此,我的内容页面N°2包含第一个页面的文本(由PageStamp添加)和它自己的文本(由另一个PageStamp添加)。

这是意料之中的,因为它是文档化的行为。请查看pdfcopy.createPageStampJavaDocs:

/**
 * Create a page stamp. New content and annotations, including new fields, are allowed.
 * The fields added cannot have parents in another pages. This method modifies the PdfReader instance.<p>
 * The general usage to stamp something in a page is:
 * <p>
 * <pre>
 * PdfImportedPage page = copy.getImportedPage(reader, 1);
 * PdfCopy.PageStamp ps = copy.createPageStamp(page);
 * ps.addAnnotation(PdfAnnotation.createText(copy, new Rectangle(50, 180, 70, 200), "Hello", "No Thanks", true, "Comment"));
 * PdfContentByte under = ps.getUnderContent();
 * under.addImage(img);
 * PdfContentByte over = ps.getOverContent();
 * over.beginText();
 * over.setFontAndSize(bf, 18);
 * over.setTextMatrix(30, 30);
 * over.showText("total page " + totalPage);
 * over.endText();
 * ps.alterContents();
 * copy.addPage(page);
 * </pre>
 * @param iPage an imported page
 * @return the <CODE>PageStamp</CODE>
 */
html" target="_blank">public PageStamp createPageStamp(PdfImportedPage iPage)

(PDFCopy.java)

正如它在第二行中所说的:这个方法修改了PdfReader实例。

我试着用一个不同的PDF阅读器:它可以工作,但这真的是解决方案吗??

这是一个解决方案,但取决于源PDF相当耗费资源。另一种方法是使用pdfcopy而不使用pageStamps并在单独的pdfstamper中应用更改。根据您的用例,还有其他的...

pageStamps表示一种非常轻量级的方式来在复制时进行盖章,因为它们只需操作PDFReader而不必构建自己的中间结构。如果用例不兼容,

 类似资料:
  • 我正在使用iText(特别是iTextSharp 4.1.6),我想通过组合现有PDF中的页面来创建一个PDF,但也要插入从图像创建的新页面。 我已经分别使用PdfCopy和PdfWriter实现了这两个部分的工作。从图像创建页面的代码如下所示: 现在,由于PdfCopy继承自PdfWriter,我想我可以使用相同的技术将这样的“图像页面”添加到我的PdfCopy对象中,但这不起作用(如果在上面的

  • 问题内容: 我正在尝试编写一个Java程序,该程序将自动下载并命名一些我最喜欢的网络漫画。由于我将请求来自同一域的多个对象,因此我希望有一个持久的http连接,在下载所有漫画之前,我可以一直保持打开状态。以下是我正在进行的工作。如何在不打开新的http连接的情况下从相同域但路径不同发出另一个请求? 问题答案: 根据此处的文档,HTTP持久性在Java中是透明处理的,尽管它提供了一些选项,也可以通过

  • 我有一个Kubernetes pod(让我们称之为POD-A),我希望它使用某个配置文件来使用k8s API执行一些操作。配置文件将是一个YAML或JSON,由POD中的应用程序解析。 配置文件由云上的应用服务器托管,它的最新版本可以根据触发器提取。配置文件包含k8s集群中所有部署的配置细节,并将用于使用POD-A中的k8s API更新部署。 现在我想的是将这个配置文件保存在配置映射中,每次拉出一

  • 问题内容: 保存Java applet状态的好方法是什么? 我可以处理文件的对象序列化/反序列化,但不知道应将其放置在什么地方,或者是否有一些“注册表”可以只保存几个用户设置。 这些设置取决于硬件,因此我想将其保存在客户端上。 对applet拥有完全许可。 问题答案: 保存Java applet状态的好方法是什么? 对于受信任的applet,有很多选择。 我可以处理对象从文件到文件的序列化/反序列

  • 我有疑问一条消息是否会在主题中持续存在,我从这篇文章中得到了大部分答案。 但是这种情况如何呢?假设代理重新开始,一些发布者已经开始向一个主题发送消息,现在将来一些持久订户将与该主题连接,但是当前没有持久订户,因此在代理重新开始的情况下,发布者到目前为止向该主题发送的所有消息都将丢失。 我尝试了上述情况,确实所有的信息都丢失了。此外,我尝试了这种情况——我有一个活跃的持久订阅者,它能够将消息推送到主