0

我正在使用 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[] 转换为 String。

是此文件的 xfa,如果您在其中搜索“U72300DL1996PLC075672”,它将丢失。

这是一个普通文件,提供所有字段。

有任何想法吗?我已经尝试了一切,但我的猜测是,既然读者可以看到这个价值,我应该也可以。

编辑:您必须下载文件,您可能无法在浏览器中查看它们。

4

1 回答 1

3

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

PDDocument.load(file)

PDF 会按顺序解析,并且不会提取最新的 XFA 内容。如果您将其更改为

PDDocument.loadNonSeq(file,null)

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

请注意,对于 PDFBox 1.8.x,应始终使用PDDocument.loadNonSeq以按照规范解析 PDF,即遵循外部参照信息。PDDocument.load应用于处理具有(外部参照相关)解析错误的文件,其中顺序解析可以作为后备。

对于 PDFBox 2.xPDDocument.load解析遵循外部参照,即像 1.8 中的 `PDDocument.loadNonSeq' 和顺序解析在幕后完成,以防出现错误。

于 2016-06-19T06:48:52.600 回答