2016-06-18 257 views
0

我使用pdfbox-1.8.12从PDF阅读内容以获得XFA。 我已经能够成功获得大部分文件的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 []转换为String。

This是这个文件的xfa,如果你在这里搜索'U72300DL1996PLC075672',它将会丢失。

这是一个normal文件,它提供了所有的字段。

任何想法?我已经尝试了一切,但我的猜测是,由于读者可以看到这个价值,我应该也能够做到。

编辑: 你将不得不下载这些文件,你可能无法在浏览器中查看它们。

回答

3

表单中的XFA内容有多个条目,表示表单在应用不同签名之前表单所具有的不同状态。当您使用

PDDocument.load(file)

的PDF依次解析和最新XFA内容不被拾起。如果您更改到

PDDocument.loadNonSeq(file,null)

使用外部参照信息并提取最新XFA包含你正在寻找的信息。

请注意,对于PDFBox 1.8.x,应始终使用PDDocument.loadNonSeq来解析符合规范的PDF,即遵循外部参照信息。 PDDocument.load应该只有被用来处理文件与(外部参照相关)解析错误,其中顺序解析可以回落。

对于PDFBox 2.x PDDocument.load在Xref之后进行解析,即如1.8中的“PDDocument.loadNonSeq”,并且在出现错误的情况下在场景后面进行顺序解析。

+0

我不能够感谢你。我曾尝试过所有可能的事情,我认为这是解析错误。我反而保存该文件,然后解析它。再次感谢!!干杯!! – Mayank