【问题标题】:can't find all field of a pdf (acroform)找不到pdf的所有字段(acroform)
【发布时间】:2019-08-29 08:12:03
【问题描述】:

考虑this pdf

使用这段代码,我除了检索所有字段,但我得到了一半:

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

这里有什么问题?似乎所有注解都没有在 acroform 引用中,将表单字段注解添加到 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)

【问题讨论】:

  • 请阅读两者的javadoc,它解释了这一点。
  • 已经这样做了,对我来说超出了范围,但是经过几次代码尝试后,我现在很清楚了!非常感谢@TilmanHausherr,让我用小代码示例回答我的问题,或者你更喜欢删除它?
  • 请自己回答:-)
  • 如果您认为应该将任何内容添加到 javadoc 中,请提及。
  • javadoc 似乎很清楚这里不能做得更好 ^^ 是我的错

标签: pdfbox


【解决方案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());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多