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)
如第二行所述:此方法修改 PdfReader 实例。
因此,
I tried using a different PdfReader: it works but is this really the solution??
这是一种解决方案,但取决于源 PDF,这是一种资源密集型解决方案。另一种方法是在不使用 PageStamps
的情况下使用 PdfCopy
,并在单独的 PdfStamper
中应用您的更改。根据您的用例,还有其他的...
PageStamps
代表了一种非常轻量级的方式,在复制 时进行标记,因为 他们只是简单地操作 PdfReader
而不必构建自己的中间结构。在不兼容的用例的情况下,
我正在使用 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)
如第二行所述:此方法修改 PdfReader 实例。
因此,
I tried using a different PdfReader: it works but is this really the solution??
这是一种解决方案,但取决于源 PDF,这是一种资源密集型解决方案。另一种方法是在不使用 PageStamps
的情况下使用 PdfCopy
,并在单独的 PdfStamper
中应用您的更改。根据您的用例,还有其他的...
PageStamps
代表了一种非常轻量级的方式,在复制 时进行标记,因为 他们只是简单地操作 PdfReader
而不必构建自己的中间结构。在不兼容的用例的情况下,