首页 文章

iText - PdfCopy中页面戳的持久性

提问于
浏览
0

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

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

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

Problem: 如果我使用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:相同的结果 .

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

谢谢你的帮助 .

1 回答

  • 0

    @Bruno和@Amedee已经评论过使用版本4.2.1,所以我不需要谈论它 . 您问的问题仍然适用于当前的iText版本 . 从而:

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

    从而,

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

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

    PageStamps 表示一种非常轻量级的复制方式,它们只是操纵 PdfReader 而不必构建自己的中间结构 . 如果用例不兼容,

相关问题