簡體   English   中英

iText-PdfCopy中pagestamp的持久性

[英]iText - Persistence of pagestamp in PdfCopy

我正在使用iText 4.2.1生成我的pdf報告。 因此,基本上,我有一個PDF模板,其中包含封面,結束頁和內容頁(僅包含圖像標題)。

我正在使用PdfCopyPdfImportedPage復制模板,並使用PageStamp動態添加我的內容。

需要:我需要多次使用內容頁面:與報表中的內容頁面一樣多。

and to add some text the stamp persists over the next content pages. 問題:如果我使用添加一些文本,則戳記會保留在下一個內容頁面上。 因此,我的內容頁面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版本。 從而:

問題:如果我使用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而不必構建自己的中間結構。 如果使用案例不兼容,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM