对于类型PDField,方法getKids()未定义

时间:2017-06-29 06:26:39

标签: pdfbox

https://issues.apache.org/jira/browse/PDFBOX-2148

如果有多个副本具有相同的字段名称,则PDField对象列表中每个孩子的getFullyQualifiedName将返回父级的名称,后跟.null。因此,如果父字段被调用Button2并且它有4个实例,则打印出所有名称的结果将是:

Button2.null
Button2.null
Button2.null
Button2.null

1 个答案:

答案 0 :(得分:2)

根据对问题的评论,OP指的是PDFBox 2.0.x版本,特别是2.0.6。

getKids()

  

类型getKids()

的方法PDField未定义

在PDFBox 2.0.6中,有两个直接的子类PDField。前者(1.8.x)getKids()方法的不同变体在那里实现:

  • PDNonTerminalField - 检索此课程中的孩子的方法为getChildren(),并返回List<PDField>表单字段列表。
  • PDTerminalField - 检索此课程中的孩子的方法是getWidgets,并返回List<PDAnnotationWidget>,即小工具注释列表。

父级的名称,后跟.null

  

当有多个副本具有相同的字段名称时,getFullyQualifiedName对象列表中每个孩子的PDField将返回父级的名称,后跟.null

PDFBox 2.0.x中不是这种情况。

在附加到PDFBox问题的示例文档中,PDFBOX-2148 PDFBox现在只能正确找到一个名为“Button2”的字段。该字段是PDTerminalField,有4个小部件注释。后者的类PDAnnotationWidget没有getFullyQualifiedName方法,因此没有“.null”名称。

因此,这个问题就消失了。

重复字段的FQN

(来自OP的回复的评论“你的问题究竟是什么?”

  

如何在pdfbox中获取完全合格的重复字段名称

(有效)PDF 中没有重复字段,对于给定名称,最多只有一个字段可能包含多个小部件。 小部件没有单独的FQN

因此,您在示例文档中称为“重复字段”的实际上是单个字段,其中包含多个小部件;该字段的名称为“Button2”,可以使用getFullyQualifiedName()检索。

形成字段

的页面

(从OP对此答案的评论)

  

但是如何在pdfbox中获取当前页面没有...例如有3页,在页面2中有一个表单字段,那么如何才能获得哪个表单字段?

所有PDAnnotation个类PDAnnotationWidget都有一个getPage()方法返回PDPage个实例。

但是:正如ISO 32000-1中所指定的,注释(特别是表单字段小部件)不需要具有指向它们的页面的链接(除了与演绎操作相关联的屏幕注释))。

因此,上述方法getPage()可能会返回null(可能更常见)。

因此,要确定窗口小部件的相应页面,必须以相反的方式解决问题:遍历所有页面并在相应的注释数组中查找注释窗口小部件。

对于PDFBox 1.8.x,您可以找到示例代码in this stackoverflow answer。使用本答案前面部分中给出的信息,可以很容易地将代码移植到PDFBox 2.0.x。

复选框和单选按钮

(也是OP对这个答案的评论)

  

如果我使用复选框和单选按钮,则还有一个问题,那么field.getFieldType()输出对于两者都是Btn。怎么识别它?

您可以通过检查通过fields.getFieldFlags()检索的字段标记来识别它们:

  • 如果设置了按钮标记(PDButton.FLAG_PUSHBUTTON),则该字段是常规按钮
  • 否则,如果设置了无线电标志(FLAG_RADIO),则该字段为单选按钮
  • 否则,该字段是复选框

或者,您可以查看field对象的类别,其中 Btn 可能是PDPushButtonPDRadioButtonPDCheckBox

注意:如果复选框字段有多个小部件,其中 状态不同,此复选框字段及其小部件就像一个单选按钮组不仅在理论上,我已经看到了带有这种复选框字段的PDF文件。

要确切了解字段的行为,您还应该比较给定复选框的所有小部件的 on 状态的名称。< / p>