【问题标题】:iText - Persistence of pagestamp in PdfCopyiText - PdfCopy 中页戳的持久性
【发布时间】:2016-08-06 06:12:24
【问题描述】:

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

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

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

问题: 如果我使用 pdfCopy.createPageStamp(importedPage)ColumnText.showTextAligned 添加一些文本,则戳记会保留在下一个内容上页。因此,我的内容页面 n°2 包含第一个的文本(由 PageStamp 添加)和它自己的文本(由另一个 PageStamp 添加)。

下面是代码示例:

// 在里面 文档文档 = 新文档(); PdfCopy pdfCopy = new PdfCopy( doc, new FileOutputStream( new File("Result.pdf") ) ); doc.open(); PdfReader pdfReader = new PdfReader("pdf-template.pdf"); // 第 1 页 PdfImportedPage importPage1= pdfCopy.getImportedPage(pdfReader, 2); String text1= "第一页的文字 - 1"; PageStamp stamp1 = pdfCopy.createPageStamp(importedPage1); ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, 新短语(文本 1)、400、500、0); stamp.alterContents(); pdfCopy.addPage(importedPage1); // 第2页 PdfImportedPage importPage2= pdfCopy.getImportedPage(pdfReader, 2); String text2 = "第二页的文字 - 2"; PageStamp stamp2 = pdfCopy.createPageStamp(importedPage2); ColumnText.showTextAligned( stamp2.getOverContent(), Element.ALIGN_CENTER, 新短语(文本 2)、200、700、0); stamp2.alterContents(); pdfCopy.addPage(importedPage2); // 关闭 doc.close();

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

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

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

我尝试使用不同的 PdfReader:它可以工作,但这真的是解决方案吗??

感谢您的帮助。

【问题讨论】:

  • 没有 iText 4.2.1 这样的东西。阅读this rogue version,你就会明白没有人真正知道iText 4.2.1 里面有什么。这是一个没有人认可的非官方版本。只要您使用比 iText 5 更早的版本,我认为没有人会帮助您。
  • 您应该得到创建该分叉的公司的支持。问题是,那家公司已经不存在了。或者问分叉的开发者,ymasory。问题是,他们可能不感兴趣。
  • @GuillaumeB 我的回答能回答你的问题吗?

标签: java pdf copy itext stamp


【解决方案1】:

@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 而不必构建自己的中间结构。在不兼容的用例的情况下,

【讨论】:

  • 你好 mkl。感谢您的回答。确实是的,我的大部分内容都是动态添加的(因为我在报告中添加了图表、图形、文本……),所以 PageStamp 似乎没用。我正在尝试用 PdfStamper 解决这个问题...
  • @GuillaumeB 在这种情况下,请接受我的回答(单击左上角的勾号)或自己写一个并接受。在问题实际上已经得到解决的情况下留下问题,在 stackoverflow 等问答网站上是不合适的。
  • 目前我还没有明确的解决方案。所以对我来说这个问题仍然悬而未决......我正在与 PdfStamper 合作以确定它的可能性。
  • 谢谢。好吧,现在应该回答您在此处发布的问题:PdfCopyPageStamps 根本不适合从同一 PdfReader 多次复制同一页面的用例,并且替代方案已经命名。如果没有深入了解您的用例,您的原始替代方法是为同一源文档打开多个 PdfReader 实例还是替代的两次通过方法更好。例如。如果源文档很小且架构简单,则多个阅读器可能没问题。
猜你喜欢
  • 2018-09-08
  • 2014-02-07
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
相关资源
最近更新 更多