2016-06-18 166 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