iText - PdfCopy 中的 Pagestamp 持久性

iText - Persistence of pagestamp in PdfCopy

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

我正在使用 PdfCopy & PdfImportedPage 复制我的模板,并使用 PageStamp 添加我的动态内容。

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

问题: 如果我使用 pdfCopy.createPageStamp(importedPage)ColumnText.showTextAligned 添加一些文本,标记将持续存在于下一个内容页面中。因此,我的内容页面 n°2 包含第一个页面的文本(由 PageStamp 添加)和它自己的文本(由另一个 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();

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

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

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

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

感谢您的帮助。

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

Problem: If I use pdfCopy.createPageStamp(importedPage) and ColumnText.showTextAligned to add some text the stamp persists over the next content pages. Thus my content page n°2 contains the text of the 1st one (added by PageStamp) and its own text (added by another PageStamp).

这是预料之中的,因为这是记录在案的行为。查看 PdfCopy.createPageStamp JavaDocs:

/**
 * 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 实例。

因此,

I tried using a different PdfReader: it works but is this really the solution??

这是一种解决方案,但取决于源 PDF,这是一种资源密集型解决方案。另一种方法是在不使用 PageStamps 的情况下使用 PdfCopy,并在单独的 PdfStamper 中应用您的更改。根据您的用例,还有其他的...

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