我有一个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 tool给了我txtFirstName
字段名称。但是当我使用它时,我得到No field found with name: txtFirstName
错误。帮助
答案 0 :(得分:15)
我意识到这个问题现在很老了,但我偶然发现了它,并认为我应该发布我的解决方案。
您可以使用PDFBox找到PDF表单中字段的ID。它有一个非常丰富的API,不幸的是需要大量的阅读来弄清楚你必须做什么。
要获取表单字段的名称,您希望使用属于getFullyQualifiedName
类的PDField
。
不幸的是,你无法从PDAcroform
类中一次性获取所有文件名(我可以告诉),因此您只需创建一个表单名称数组,然后遍历每个文件名。
e.g。
// 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();
希望这有助于某人。
干杯