我使用pdfbox-1.8.12读取PDF中的内容以获得XFA。我已经成功地获得了大多数文件的XFA,而没有遗漏任何字段值。
麻烦在于一些像error.pdf这样的文件。我有许多字段没有CIN这样的值,但是当我在任何PDF查看器、foxit或Acrobat中打开文件时,都会显示该字段。
public static byte[] getParsableXFAForm(File file) {
if (file == null)
return null;
PDDocument doc;
PDDocumentCatalog catalog;
PDAcroForm acroForm;
PDXFA xfa;
try {
doc = PDDocument.load(file);
catalog = doc.getDocumentCatalog();
acroForm = catalog.getAcroForm();
xfa = acroForm.getXFA();
byte[] xfaBytes = xfa.getBytes();
doc.close();
return xfaBytes;
} catch (IOException e) {
// handle IOException
// happens when the file is corrupt.
System.out.println("IOException");
return null;
}
}然后将byte[]转换为字符串。
这是这个文件的xfa,如果在这个文件中搜索'U72300DL1996PLC075672',它将丢失。
这是一个正常文件,提供所有字段。
有什么想法吗?我试过所有的东西,但我的猜测是,既然读者可以看到这种价值,我也应该能够看到。
编辑:您必须下载这些文件,您可能无法在浏览器中查看它们。
发布于 2016-06-19 06:48:52
表单中有多个XFA内容条目,表示表单在应用不同签名之前的不同状态。正如你所用的
PDDocument.load(file)
PDF是按顺序解析的,并且没有获取最新的XFA内容。如果你把它改成
PDDocument.loadNonSeq(file,null)
使用Xref信息,提取最新的XFA,其中包含您要查找的信息。
请注意,对于PDFBox 1.8.x,应该始终使用PDDocument.loadNonSeq来解析符合规范的PDF,即遵循Xref信息。PDDocument.load应该只使用来处理带有(与Xref相关的)解析错误的文件,在这些错误中,顺序解析可能会倒退。
对于PDFBox,2.x PDDocument.load解析遵循Xref,如1.8中的`PDDocument.loadNonSeq‘,然后在幕后进行顺序解析,以防出现错误。
https://stackoverflow.com/questions/37901050
复制相似问题