2016-06-18 12 views
0

Ich verwende pdfbox-1.8.12, um Inhalte aus PDF zu lesen, um XFA zu erhalten. Ich konnte XFA für die meisten Dateien erfolgreich erhalten, ohne irgendwelche Feldwerte zu verpassen.XFA fehlen gefüllte Felder?

Das Problem ist mit einigen Dateien wie error.pdf. Ich habe viele der Felder, die keine Werte wie CIN haben, aber wenn ich die Akte in irgendeinem PDF-Zuschauer, Foxit oder Acrobat öffne, zeigt es dieses Feld an.

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; 
    } 
} 

Dann wird das Byte [] in String konvertiert.

This ist das xfa für diese Datei und wenn Sie in diesem nach 'U72300DL1996PLC075672' suchen, würde es fehlen.

Dies ist eine Datei, die alle Felder enthält.

Irgendwelche Ideen? Ich habe alles versucht, aber meine Vermutung ist, dass, da die Leser diesen Wert sehen können, ich auch in der Lage sein sollte.

EDIT: Sie müssen die Dateien herunterladen, Sie können sie möglicherweise nicht im Browser anzeigen.

Antwort

3

Es gibt mehrere Einträge von XFA-Inhalt innerhalb des Formulars, die die verschiedenen Zustände des Formulars vor dem Anwenden der verschiedenen Signaturen darstellen. Wie Sie

verwenden

PDDocument.load(file)

wird die PDF sequentiell analysiert und die meisten aktuellen XFA Inhalt nicht aufgenommen wird. Wenn Sie ändern, dass

zu

PDDocument.loadNonSeq(file,null)

die Xref Informationen verwendet wird und die meisten aktuellen XFA extrahiert die Informationen enthalten, die Sie suchen.

Beachten Sie, dass für PDFBox 1.8.x immer PDDocument.loadNonSeq verwendet werden sollte, um die PDF in Übereinstimmung mit der Spezifikation zu analysieren, d. H. Indem Sie der Xref-Information folgen. PDDocument.load sollte nur verwendet werden, um Dateien mit (Xref bezogenen) Parsing-Fehlern zu behandeln, bei denen ein sequentielles Parsing ein Fallback sein kann.

Für PDFBox 2.x PDDocument.load Parsing nach der Xref, d. H. Wie `PDDocument.loadNonSeq 'in 1.8 und sequenzielle Analyse wird hinter den Kulissen im Falle von Fehlern durchgeführt.

+0

Ich kann Ihnen nicht genug danken. Ich hatte alles versucht, was ich konnte, ich dachte, das wäre der Fehler beim Parsen. Ich habe stattdessen die Datei erneut gespeichert und dann analysiert. Danke noch einmal!! Prost!! – Mayank