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

Jai*_*iro 8 java itext

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

Zac*_*ach 14

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

  • 创建一个文档
  • 对于每个具有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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 你根本不需要`copyPdf()`.即使你这样做,这也是一种从A到B复制文件(恰好是PDF)的极其低效的方式.你甚至可以为`PdfStamper`的所有不同实例使用相同的`PdfReader`,但这很可能是揭示错误.在同一个文件中使用多个阅读器,你肯定会很好. (3认同)