0

我正在使用iText 4.2.1 来生成我的 pdf 报告。所以基本上我有一个 PDF 模板,其中包含封面页、结束页和内容页(仅包含图像标题)。

我正在使用PdfCopyPdfImportedPage来复制我的模板和PageStamp来动态添加我的内容。

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

问题:如果我使用pdfCopy.createPageStamp(importedPage)ColumnText.showTextAligned添加一些文本,则戳记会保留在下一个内容页面上。因此,我的内容页面 n°2 包含第一个的文本(由 PageStamp 添加)和它自己的文本(由另一个 PageStamp 添加)。

这是一个代码示例:

    // 在里面
    文档文档 = 新文档();
    PdfCopy pdfCopy = new PdfCopy( doc, new FileOutputStream( new File("Result.pdf") ) );
    doc.open();
    PdfReader pdfReader = new PdfReader("pdf-template.pdf");

    // 第 1 页
    PdfImportedPage importPage1= pdfCopy.getImportedPage(pdfReader, 2);
    String text1= "第一页的文字 - 1";
    PageStamp stamp1 = pdfCopy.createPageStamp(importedPage1);
    ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER,
                                新短语(文本 1)、400、500、0);
    stamp.alterContents();
    pdfCopy.addPage(importedPage1);

    // 第2页
    PdfImportedPage importPage2= pdfCopy.getImportedPage(pdfReader, 2);
    String text2 = "第二页的文字 - 2";
    PageStamp stamp2 = pdfCopy.createPageStamp(importedPage2);
    ColumnText.showTextAligned( stamp2.getOverContent(), Element.ALIGN_CENTER,
                                新短语(文本 2)、200、700、0);
    stamp2.alterContents();
    pdfCopy.addPage(importedPage2);

    // 关闭
    doc.close();

--> 在第二页我会看到我的 text1 和我的 text2

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

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

我尝试使用不同的 PdfReader:它有效,但这真的是解决方案吗?

谢谢你的帮助。

4

1 回答 1

0

@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>
 */
public PageStamp createPageStamp(PdfImportedPage iPage)

( PDFCopy.java )

正如第二行所说:此方法修改 PdfReader 实例。

因此,

我尝试使用不同的 PdfReader:它可以工作,但这真的是解决方案吗?

这是一种解决方案,但取决于源 PDF,这是一种资源密集型解决方案。另一种是使用PdfCopywithoutPageStamps并将您的更改应用到单独的PdfStamper. 根据您的用例,还有其他...

PageStamps代表了一种在复制时进行标记的非常轻量级的方式,因为它们只是简单地操作PdfReader而不需要构建自己的中间结构。在不兼容的用例的情况下,

于 2016-04-15T12:00:49.610 回答