iText - 将内容添加到现有的 PDF 文件

2022-08-31 20:45:20

我想用 iText 执行以下操作:

(1) 解析现有 PDF 文件

(2)在文档的现有单页上添加一些数据(如时间戳)

(3)写出文档

我似乎无法弄清楚如何使用iText做到这一点。在伪代码中,我会这样做:

Document document = reader.read(input);
document.add(new Paragraph("my timestamp"));
writer.write(document, output);

但是由于某种原因,iText的API是如此令人生畏地复杂,以至于我无法理解它。PdfReader实际上保存了文档模型或其他东西(而不是吐出文档),您需要一个PdfWriter来读取其中的页面...啊?


答案 1

iText有多种方法可以做到这一点。该类是一个选项。但我发现最简单的方法是创建一个新的PDF文档,然后将现有文档中的单个页面导入到新的PDF中。PdfStamper

// Create output PDF
Document document = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
document.open();
PdfContentByte cb = writer.getDirectContent();

// Load existing PDF
PdfReader reader = new PdfReader(templateInputStream);
PdfImportedPage page = writer.getImportedPage(reader, 1); 

// Copy first page of existing PDF into output PDF
document.newPage();
cb.addTemplate(page, 0, 0);

// Add your new data / text here
// for example...
document.add(new Paragraph("my timestamp")); 

document.close();

这将以 PDF 格式从 中读取,并将其写出到 。这些可能是文件流或内存流或任何适合您的应用程序。templateInputStreamoutputStream


答案 2

Gutch 的代码很接近,但它只有在以下情况下才能正常工作:

  • 没有注释(链接,字段等),没有文档结构/标记内容,没有书签,没有文档级脚本,等等,等等......
  • 页面大小恰好是A.4(不错的几率,但它不适用于您碰巧遇到的任何PDF)
  • 您不介意丢失所有原始文档元数据(创建者,创建日期,可能是作者/标题/关键字),也可能是文档ID。您无法复制创建日期和文档ID,除非您在iText本身上进行一些非常深入的黑客攻击)。

批准的方法是以相反的方式进行。使用PdfStamper打开现有文档,并使用从getOverContent()返回的PdfContentByte将文本(以及您可能需要的任何其他内容)直接写入页面。无需第二份文件。

您可以使用 ColumnText 来处理布局等...无需使用 beginText(),setFontAndSize()、drawText()、drawText()...,endText() 来弄脏和弄脏。


推荐