我正在使用 iText 4.2.1生成我的pdf报告。 所以基本上我有一个PDF模板,其中包含封面,结束页面和内容页面(仅包含图像标题)。
我正在使用 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 :它有效,但这真的是解决方案吗?
感谢您的帮助。
答案 0 :(得分: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)
如第二行所述:此方法修改PdfReader实例。
因此,
我尝试使用不同的PdfReader:它可以工作,但这真的是解决方案吗?
这是一种解决方案,但取决于源PDF,资源密集型。另一个是使用PdfCopy
而不是PageStamps
,并将更改应用于单独的PdfStamper
。根据您的使用情况,还有其他的......
PageStamps
代表了一种非常轻量级的方式来复制,因为它们只是操纵PdfReader
而不必构建自己的中间结构。如果用例不兼容,