找不到pdf(acroform)的所有字段

时间:2019-04-08 08:20:27

标签: pdfbox

考虑this pdf

使用此代码,除了检索所有字段外,我得到了其中一半:

pdfOriginal.getDocumentCatalog().getAcroForm().getFields().forEach(field -> {
  System.out.println(field.getValueAsString());
});

这是怎么了?似乎所有注释都不在acrocroform参考中,将表单字段注释添加到acroform对象中的正确方法是什么?

更新1

如果我尝试设置getAcroForm.getFields()中未引用/找到的字段的值,这将是一件奇怪的事情:

doc.getDocumentCatalog().getAcroForm().getField("fieldNotInGetFields").setValue("a");

这有效

更新2

似乎使用doc.getDocumentCatalog().getAcroForm().getFieldTree()检索所有字段。我不明白为什么doc.getDocumentCatalog().getAcroForm().getFields()不是吗?

检索pdf acroform.getFieldTree()acroform.getFields()的所有字段的正确方法是什么(我需要检索它们以将它们设置为partialValue)

1 个答案:

答案 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());
    }
}