https://issues.apache.org/jira/browse/PDFBOX-2148
如果有多个副本具有相同的字段名称,则PDField对象列表中每个孩子的getFullyQualifiedName
将返回父级的名称,后跟.null
。因此,如果父字段被调用Button2
并且它有4个实例,则打印出所有名称的结果将是:
Button2.null
Button2.null
Button2.null
Button2.null
答案 0 :(得分:2)
根据对问题的评论,OP指的是PDFBox 2.0.x版本,特别是2.0.6。
类型
的方法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”名称。
因此,这个问题就消失了。
(来自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 可能是PDPushButton
,PDRadioButton
或PDCheckBox
。
注意:如果复选框字段有多个小部件,其中 状态不同,此复选框字段及其小部件就像一个单选按钮组! 不仅在理论上,我已经看到了带有这种复选框字段的PDF文件。
要确切了解字段的行为,您还应该比较给定复选框的所有小部件的 on 状态的名称。< / p>