Itext – 如何使用acrofields克隆页面?

我正在用Java编写一个打印宾果卡PDF文件的程序。 每页都是一张卡片。 为了方便我,我创建了一个带有acrofields的模板PDF文件,这样程序只需要创建这个模板的副本,用数字填充acrofields然后压平它。 截至目前,我可以制作1张宾果卡。 我想在一个PDF文件中有多个页面(因此,多个卡片)。 但我不知道如何做到这一点。 我读到的是PDFStamper与一个且只有一个PDFReader对象相关联。 有没有办法我可以做到这一点,而不需要创建多个PDF文件并将它们合并为一个(我上次这样做,我发现真的很慢)提前谢谢!

我花了一段时间才弄明白这一点。 这不是最有效的编码方式,但这里基本上是它的作用:

  • 创建一个文档
  • 对于每个具有acrofield的页面:
  • 复制你的模板
  • 填表格
  • 压扁表格
  • 添加页面

这是我的实现,您可以尝试和修改以满足您的需求:

private void createPdf() throws Exception { Document doc = new Document(); PdfSmartCopy copy = new PdfSmartCopy(doc, new FileOutputStream("result.pdf")); doc.open(); PdfReader reader; PdfStamper stamper; AcroFields form; ByteArrayOutputStream baos; for(int i = 0; i < getTotalPages(); i++) { copyPdf(i); reader = new PdfReader(String.format("%d%s", i, "template.pdf")); baos = new ByteArrayOutputStream(); stamper = new PdfStamper(reader, baos); form = stamper.getAcroFields(); //methods to fill forms stamper.setFormFlattening(true); stamper.close(); reader = new PdfReader(baos.toByteArray()); copy.addPage(copy.getImportedPage(reader, 1)); } doc.close(); } private void copyPdf(int currentPage) throws Exception { PdfReader reader = new PdfReader("timesheet.pdf"); Document doc = new Document(); File file = new File(String.format("%d%s", currentPage, "template.pdf")); file.deleteOnExit(); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(file)); stamper.close(); } 

copyPdf()方法创建临时文件,用于允许填写表单而不影响整个文档。 如果您找到更有效的方法,请告诉我。

此外,我发现在基于Intel的Mac和Windows计算机上,Mac可以更快地完成此任务。

如果你不反对获得iText的参考书,我会推荐Bruno Lowagie的“iText in Action,Second Edition”。 这是一本很棒的书,非常有帮助。

所以,这里的代码没有使用Zach的“copyPdf”方法,正如Mark Storer和MaxArt建议的那样:

 private void createPdf() throws Exception { Document doc = new Document(); PdfSmartCopy copy = new PdfSmartCopy(doc, new FileOutputStream("result.pdf")); doc.open(); PdfReader mainReader = new PdfReader("timesheet.pdf"); PdfReader reader; PdfStamper stamper; AcroFields form; ByteArrayOutputStream baos; for(int i = 0; i < getTotalPages(); i++) { reader = new PdfReader(mainReader); baos = new ByteArrayOutputStream(); stamper = new PdfStamper(reader, baos); AcroFields form = stamper.getAcroFields(); //methods to fill forms stamper.setFormFlattening(true); stamper.close(); reader = new PdfReader(baos.toByteArray()); copy.addPage(copy.getImportedPage(reader, 1)); } doc.close(); }