PDFBox无法填写PDF表单

7
我有一个PDF文件,其中包含一些表单字段,我需要用Java代码填写这些字段。我使用PDFBox库进行操作,下面是相关代码:

PDDocument pdfDoc = PDDocument.load("C:\\Users\\igor\\Desktop\\test.pdf");
PDDocumentCatalog docCatalog = pdfDoc.getDocumentCatalog();
PDAcroForm acroForm = docCatalog.getAcroForm();
PDField field = acroForm.getField("applicationPrepaid[0].#pageSet[0].Pagina1[0].txtFirstName[0]");
if (field != null) {
    field.setValue("Milan");
} else {
    System.err.println("No field found with name:" + "applicationPrepaid[0].#pageSet[0].Pagina1[0].txtFirstName[0]");
}
pdfDoc.save("C:\\Users\\igor\\Desktop\\testout.pdf");
pdfDoc.close();

这份PDF不是我创建的,因此我不知道文件使用了什么类型的表单(如果我理解正确,有FDF和XFA表单)。由于这份PDF不是我创建的,我使用了这个工具 http://support.persits.com/pdf/demo_formfields.asp 来查找表单字段的名称,并得到了以下结果:

applicationPrepaid[0].#pageSet[0].Pagina1[0].txtFirstName[0]

当我使用这个长字段名称时,我没有收到任何错误信息,但生成的PDF文件不包含我放在字段中的值。我认为可能是字段名称有问题,所以我使用了Pdftk工具,它只给出了txtFirstName作为字段名称。但当我只使用这个名称时,我会收到找不到名称为:txtFirstName的字段的错误信息。帮帮我?

字段的名称暗示它是一个XFA字段。也许在PDFBox中你需要用不同的方式处理XFA字段?(我完全不了解PDFBox的API...) - mkl
1个回答

17

虽然我意识到这个问题现在已经很老了,但我偶然发现它并认为我应该发布我的解决方案。

您可以使用PDFBox查找PDF表单中字段的ID。 它具有非常丰富的API,只是不幸的是需要大量阅读才能弄清楚要做什么。

要获取表单字段的名称,您需要使用getFullyQualifiedName,它是PDField类的一部分。

不幸的是,您不能一次性从PDAcroform类获得所有文件名(据我所知),因此您可以简单地创建一个表单名称数组,然后循环遍历每个名称。

例如:

    // Load the pdfTemplate
    pdfTemplate = PDDocument.load(file);

    PDDocumentCatalog docCatalog = pdfTemplate.getDocumentCatalog();
    PDAcroForm acroForm = docCatalog.getAcroForm();

    // Get field names
    List<PDField> fieldList = acroForm.getFields();

    // String the object array
    String[] fieldArray = new String[fieldList.size()];
    int i = 0;
    for (PDField sField : fieldList) {
        fieldArray[i] = sField.getFullyQualifiedName();
        i++;
    }

    // Loop through each field in the array and do something
    for (String f : fieldArray) {
        PDField field = acroForm.getField(f);

        System.out.println("f is: " + f);
        if (f.contains("EXAMPLE FORM FIELD NAME")) {
            DO SOMETHING
                            String value = "example value";
            field.setValue(value);
            System.out.println("printed: " + value + " to: " + f);
        }
    }

    // Save edited file
    pdfTemplate.save(sPdfTemplate);
    pdfTemplate.close();

希望这能帮助到某些人。

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接