PDFBOX 2.0.18 - 如何遍历 PDF 页面并检索特定字段
PDFBOX 2.0.18 - How to iterates through pages of a PDF and retrieve specific fields
我正在使用 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 ???
}
}
提前感谢您的回复!
当前页面没有 PDField
个对象列表; AcroForm 是文档范围的。因此,您问题的第一部分已经获得文档中的完整字段列表。 (Adobe PDF 规范中的 12.7.1)
字段可以具有相同的完全限定名称,但它们的值也必须相同。 (PDF 规范中的 12.7.3.2)
您的文档中可能发生的情况是字段的部分名称相同,但完全限定名称不同。完全限定名称是通过连接字段名称和祖先对象的名称形成的,如 "parent partial name"."child partial name"
.
所以基本上您必须使用完全限定名称来查找字段,或者您需要遍历字段列表以查找文档中的所有字段。
您可以找到显示特定字段的页面,因为字段使用注释(小部件注释)在页面上显示自己。这些注释确实存在于页面级别的 Annots
数组中。不知道pdfbox有没有方便的功能可以轻松做到这一点。
抱歉回复晚了...
谢谢@DavidvanDriessche。为了找到 fullyQualifiedName 的组成,我使用了一个小函数来列出所有字段及其子节点(如果有的话)。事实证明,对于文档的第二页,页码被指定为父部分名称。例如,第一页将“fieldNameExample.fieldNameExmaple”作为完全限定名称,第二页将“1.fieldNameExample”作为完全限定名称。所以我可以假设对于每个后续页面,页面 number.fieldNameExample 将作为完全限定名称。
感谢大家的帮助!
我正在使用 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 ???
}
}
提前感谢您的回复!
当前页面没有 PDField
个对象列表; AcroForm 是文档范围的。因此,您问题的第一部分已经获得文档中的完整字段列表。 (Adobe PDF 规范中的 12.7.1)
字段可以具有相同的完全限定名称,但它们的值也必须相同。 (PDF 规范中的 12.7.3.2)
您的文档中可能发生的情况是字段的部分名称相同,但完全限定名称不同。完全限定名称是通过连接字段名称和祖先对象的名称形成的,如 "parent partial name"."child partial name"
.
所以基本上您必须使用完全限定名称来查找字段,或者您需要遍历字段列表以查找文档中的所有字段。
您可以找到显示特定字段的页面,因为字段使用注释(小部件注释)在页面上显示自己。这些注释确实存在于页面级别的 Annots
数组中。不知道pdfbox有没有方便的功能可以轻松做到这一点。
抱歉回复晚了... 谢谢@DavidvanDriessche。为了找到 fullyQualifiedName 的组成,我使用了一个小函数来列出所有字段及其子节点(如果有的话)。事实证明,对于文档的第二页,页码被指定为父部分名称。例如,第一页将“fieldNameExample.fieldNameExmaple”作为完全限定名称,第二页将“1.fieldNameExample”作为完全限定名称。所以我可以假设对于每个后续页面,页面 number.fieldNameExample 将作为完全限定名称。
感谢大家的帮助!