考虑this pdf
使用此代码,除了检索所有字段外,我得到了其中一半:
pdfOriginal.getDocumentCatalog().getAcroForm().getFields().forEach(field -> {
System.out.println(field.getValueAsString());
});
这是怎么了?似乎所有注释都不在acrocroform参考中,将表单字段注释添加到acroform对象中的正确方法是什么?
如果我尝试设置getAcroForm.getFields()
中未引用/找到的字段的值,这将是一件奇怪的事情:
doc.getDocumentCatalog().getAcroForm().getField("fieldNotInGetFields").setValue("a");
这有效
似乎使用doc.getDocumentCatalog().getAcroForm().getFieldTree()
检索所有字段。我不明白为什么doc.getDocumentCatalog().getAcroForm().getFields()
不是吗?
检索pdf acroform.getFieldTree()
或acroform.getFields()
的所有字段的正确方法是什么(我需要检索它们以将它们设置为partialValue)
答案 0 :(得分:1)
从方法public List<PDField> getFields()
的Java文档中,我们可以阅读:
一个字段可能具有作为字段(非终端字段)的子项,或者不具有作为字段(终端字段)的子项。
在我的情况下,某些字段包含非终止字段,因此要打印它们,我们需要检查是否位于PDNonTerminalField
中,例如:
document.getDocumentCatalog().getAcroForm().getFields().forEach(f -> {
listFields(f);
});
// loop over PDNonTerminalField otherwise print field value
public static void listFields(PDField f){
if(f instanceof PDNonTerminalField) {
((PDNonTerminalField) f).getChildren().forEach(ntf-> {
listFields(ntf);
});
}else {
System.out.println(f.getValueAsString());
}
}