当前位置: 首页 > 知识库问答 >
问题:

PDFBOX 2.0.18-如何遍历PDF页面并检索特定字段

辛建业
2023-03-14

我正在使用PDFBox读取pdf文档上的特定字段。实际上,我可以使用仅包含一页的pdf获取我想要的所有信息。PDF具有具有特定名称的字段,我可以获取所有字段并将其插入数据库。

我将此代码与AccroForm一起使用以访问字段

InputStream document = item.getInputStream();
pdf = PDDocument.load(new RandomAccessBufferedFileInputStream(document));
pdCatalog = pdf.getDocumentCatalog();
pdAcroForm = pdCatalog.getAcroForm();

String dateRapport = pdAcroForm.getField("import_Date01").getValueAsString();
String radioReason = pdAcroForm.getField("NoFlight").getValueAsString();
boolean hasdata = false;

if(radioRaison.length() > 0 && !radioRaison.equals("Off")) {
    if(radioRaison.equals("NR")) {
        rvhi.setRaison(obtenirRaison(raisons, "NR"));
    }else if(radioRaison.equals("WX")) {
        rvhi.setRaison(obtenirRaison(raisons, "ME"));
    }else if(radioRaison.equals("US")) {
        rvhi.setRaison(obtenirRaison(raisons, "BR"));
    }
}
if(pdAcroForm.getField("import_Hmn0"+indexEnString).getValueAsString().length() > 0) 
{
    hasdata = true
}

pdf.close();

return hasdata;

现在,我的问题是对一个pdf做同样的事情,它包含多个相同的页面,具有相同的字段名,但字段中的数据不同。我希望遍历每个页面,调用相同的方法并检索每个页面上的字段数据。

我使用下面的代码遍历pdf的页面,但我不知道如何获取当前页面上的字段......我不知道如何从PDPage对象中获取acroform字段?

PDPageTree nbPages = pdf.getPages();

if(nbPages.getCount() > 1) {
    for(PDPage page : nbPages) {
        ???? how to get fields Acroform from PDPage page ???
    }
}

提前感谢您的回复!

共有2个答案

叶修永
2023-03-14

很抱歉反应太晚。。。谢谢@davidvandriesche。为了找到fullyQualifiedName的组成,我使用了一个小函数来列出所有字段及其子节点(如果有)。事实证明,对于文档的第二页,页码被指定为父部分名称。例如,第一页有“fieldNameExample.fieldNameExmaple”作为完全限定名,第二页有“1.fieldNameExample”作为完全限定名。所以我可以假设,对于接下来的每一页,它都是页码。fieldNameExample作为完全限定名。

谢谢大家的帮助!

晏富
2023-03-14

当前页面没有PDField对象列表;AcroForm是文档范围的。因此,您问题的第一部分已经获取了文档中字段的完整列表。(Adobe的PDF规范中的12.7.1)

字段可以具有相同的完全限定名,但它们的值也必须相同。(PDF规范中的12.7.3.2)

您的文档中可能发生的情况是字段的部分名称相同,但完全限定的名称不相同。完全限定的名称是通过连接字段的名称和祖先对象的名称形成的,如“父部分名称”。“子部分名称”

因此,基本上,您必须使用完全限定名来查找字段,或者需要遍历字段列表来查找文档中的所有字段。

您可以找到显示特定字段的页面,因为字段使用注释(小部件注释)在页面上显示自己。这些注释确实存在于页面级别的Annots数组中。我不知道pdfbox中是否有一个方便的函数可以轻松地完成这项工作。

 类似资料:
  • 问题内容: 我有嵌套的字典: 给出的 -所有的一个像来。 导航到正确词典的最简单方法是什么? 就像如果给定的那样,它应该到达字典 非xml方法,请。 编辑(1): 筑巢之间到的水平,但我知道我之前解析嵌套。 Edit(2) :修复了代码。 编辑(3):再次修复了字符串值的代码。请原谅造成的混乱。我希望这是最终的:) 问题答案: 您的结构不规则。这是带有遍历子词典的 Visitor 函数的版本。 您

  • 问题内容: 我想访问以下网址的翻译结果 http://translate.google.com/translate?hl=zh- CN&sl=en&tl=ar&u=http%3A%2F%2Fwww.saltycrane.com%2Fblog%2F2008%2F10%2Fhow- escape-percent-encode-url-python% 2楼 翻译将显示在两个框架中底部的内容框架中。我有兴

  • 如何遍历不同类对象的ArrayList以搜索特定类? productionDate是在基类中实现的接口。 这是代码,但它不打印任何东西:)

  • 问题内容: 如何遍历Java中的字符串? 我正在尝试使用foreach样式进行循环 问题答案: 如果要使用增强循环,可以将字符串转换为charArray

  • 在WooCommerce结账页面上,我添加了一个客户必须输入才能结账的额外字段。 我想在woocommerce\u cart\u calculate\u fees操作挂钩中访问此字段的值。 通过使用woocommerce,我尝试了几种方法-

  • 问题内容: 我有一个Map如下所示的bean: 这ftqSet适合以下数据结构: 在我的测试JSP文件中,我一直在尝试使用来访问数据 : 但是它没有输出${f.feedId}。为什么会这样呢?我将如何访问该结构的各个元素,以便创建一个漂亮的表? 问题答案: 的每次迭代中给出了一个实例,它反过来又和getValue()方法。这与在普通Java中进行操作类似。 例如 在的情况下, 的回报, ,所以你需