Java pdfBox:填写pdf表单,将其附加到pddocument,然后重复

安德鲁 :

我有一个pdf表格,我正在尝试使用pdfBox填写表格并打印文档。我的工作非常适合1页打印作业,但我不得不尝试修改多个页面。基本上,这是一个具有基本信息和内容列表的表格。好吧,如果内容大于表格所需要的空间,则必须将其设为多页文档。我最终得到一个文档,该文档的第一页很好,然后其余所有页面都是空白模板。我究竟做错了什么?

PDDocument finalDoc = new PDDocument();
File template = new File("path/to/template.pdf");

//Declare basic info to be put on every page
String name = "John Smith";
String phoneNum = "555-555-5555";
//Get list of contents for each page
List<List<Map<String, String>>> pageContents = methodThatReturnsMyInfo();

for (List<Map<String, String>> content : pageContents) {
    PDDocument doc = new PDDocument().load(template);
    PDDocumentCatlog docCatalog = doc.getDocumentCatalog();
    PDAcroForm acroForm = docCatalog.getAcroForm();

    acroForm.getField("name").setValue(name);
    acroForm.getField("phoneNum").setValue(phoneNum);

    for (int i=0; i<content.size(); i++) {
        acroForm.getField("qty"+i).setValue(content.get(i).get("qty"));
        acroForm.getField("desc"+i).setValue(content.get(i).get("desc"));
    }

    List<PDPage> pages = docCatalog.getAllPages();
    finalDoc.addPage(pages.get(0));
}

//Then prints/saves finalDoc
mkl:

您的代码中有两个主要问题:

  • PDF的AcroForm元素是文档级对象。您仅将填写的模板页面复制到中finalDoc因此,表单字段finalDoc仅作为其各自页面的注释添加,而没有添加到的AcroForm中finalDoc

    这在Adobe Reader中并不明显,但是表单填充服务通常会从文档级别AcroForm条目中识别可用字段,并且不会在页面上搜索其他表单字段。

  • 实际的显示限制器:您将具有相同名称的字段添加到PDF。但是PDF表单是文档范围的实体。也就是说,PDF中只能有一个具有给定名称的单个字段实体。(此字段实体可能具有多个可视化效果,也就是小部件,但这要求您使用多个孩子小部件构造单个字段对象。此外,这些小部件应显示相同的值,这不是您想要的值。)

    因此,您必须将字段唯一地重命名,然后才能将其添加到中finalDoc

下面是一个简化示例,该示例适用于仅具有一个字段“ SampleField”的模板:

byte[] template = generateSimpleTemplate();
Files.write(new File(RESULT_FOLDER,  "template.pdf").toPath(), template);

try (   PDDocument finalDoc = new PDDocument(); )
{
    List<PDField> fields = new ArrayList<PDField>();
    int i = 0;

    for (String value : new String[]{"eins", "zwei"})
    {
        PDDocument doc = new PDDocument().load(new ByteArrayInputStream(template));
        PDDocumentCatalog docCatalog = doc.getDocumentCatalog();
        PDAcroForm acroForm = docCatalog.getAcroForm();
        PDField field = acroForm.getField("SampleField");
        field.setValue(value);
        field.setPartialName("SampleField" + i++);
        List<PDPage> pages = docCatalog.getAllPages();
        finalDoc.addPage(pages.get(0));
        fields.add(field);
    }

    PDAcroForm finalForm = new PDAcroForm(finalDoc);
    finalDoc.getDocumentCatalog().setAcroForm(finalForm);
    finalForm.setFields(fields);

    finalDoc.save(new File(RESULT_FOLDER, "form-two-templates.pdf"));
}

如您所见,所有字段在添加到之前都已重命名finalForm

field.setPartialName("SampleField" + i++);

并将它们收集在fields最终添加到finalFormAcroForm 中的列表

    fields.add(field);
}
...
finalForm.setFields(fields);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

PDFBox:通过重复添加包含表单的一页模板来填写 PDF

Java PDFBox为PDF表单中的一些字段设置自定义字体

Android上的PDFBox无法打开和填写PDF表单

Java:附加到 XML 文件

如何附加到Java异常?

从图像转换为Pdf,然后将其作为响应发送而不保存在磁盘Java中

使用Apache Batik将SVG转换为PNG,然后使用PDFBox附加到PDF而不保存图像

使用Java PDFBox库编写俄语PDF

使用PDFBOX PreflightParser for PDDocument进行PDF验证

如果某个字段在 PDF 表单中出现多次,Java PDFBox 不会保持该字段的字体外观

使用 PDDocument 在 Java 中创建 PDF 文件会导致 PDF 文件损坏

Selenium WebDriver:我想覆盖字段中的值,而不是使用Java使用sendKeys将其附加到该值

如何使用Python Mechanize填写需要Java脚本的Web表单?

Selenium WebDriver Java-无法填写表单中的输入字段

附加到新对象的 Java 注释?

如何在Java中附加到DataOutputStream?

附加到Java中的链接列表

Java将文件附加到zip中

附加到正在运行的 Java 进程?

附加到Java进程时gdb挂起

Java:将值附加到属性键

附加到序列化文件 (Java)

如何在流期间编辑 pdf 并将其放入 zip 中,然后使用 IText 和 java 下载?

保留导入的文件,然后将其附加到电子邮件

构建IQueryable <T>,然后将其附加到DbSet <T>

从 shell 填写 PDF 表单

如果键重复但元素值必须附加到Java中的单个键,如何从列表中删除元素?

Java如何将多个类值添加到1个列表,然后使用重复的提示解析该列表?

将其附加到dom后如何专注于表单输入?