【问题标题】:iText opens PDF, unable to read contentiText 打开 PDF,无法阅读内容
【发布时间】:2019-12-23 02:58:57
【问题描述】:
PdfReader reader = new PdfReader("E:\\document\\6imm5562e.pdf");
PdfDocument doc = new PdfDocument(reader);
String textFromPage = PdfTextExtractor.getTextFromPage(doc.getPage(1));
System.out.println(textFromPage);

报错信息如下:

请稍等……

如果此消息最终没有被文档的正确内容替换,您的 PDF 查看器可能无法显示此类文档。

您可以通过访问http://www.adobe.com/go/reader_download 升级到适用于 Windows®、Mac 或 Linux® 的 Adob​​e Reader 的最新版本。

有关 Adob​​e Reader 的更多帮助,请访问http://www.adobe.com/go/acrreader

Windows 是 Microsoft Corporation 在美国和/或其他国家/地区的注册商标或商标。 Mac 是商标 苹果公司,在美国和其他国家注册。 Linux 是 Linus Torvalds 在美国和其他国家/地区的注册商标。

【问题讨论】:

  • 极有可能是 xfa 表单。纯 xfa 表单 pdf(与混合 xfa/acroform 表单 pdf 相比)通常确实将问题中引用的内容作为实际且仅 pdf 内容。仅作为 xfa 处理器的 pdf 处理器通过渲染 xfa 以显示文件来替换该 pdf 内容
  • 你还在 GitHub 上的 iText 7 存储库上打开了一个 Pull Request,但你的 PR 没有包含任何代码更改,你只是将 develop 合并到 master 中。我们将继续关闭您的 Pull Request,因为我们更喜欢使用 Stack Overflow 来获得社区支持。感谢您使用 iText!
  • 是的,它是 XFA 表单。所以你看到的文字就是真正的文字。如果要将XFA表单转换为文本,则必须使用itext的一些XFA相关方法。
  • 您要提取表单上的信息(由某人填写)还是从“静态”PDF 中提取?

标签: pdf itext


【解决方案1】:

目前还不是 100% 清楚您要提取哪些数据,所以我将提供两种选择:

1) 您想从 PDF 中提取 静态 文本(此解决方案需要 pdfXFA,使用 flatten method):

public void readXFA() throws IOException, InterruptedException {

    final XFAFlattener xfaFlattener = new XFAFlattener();
    xfaFlattener.flatten(new FileInputStream(INPUT_XFA),
            new FileOutputStream(FLATTENED));

    final PdfDocument doc = new PdfDocument(new PdfReader(FLATTENED));
    String textFromPage = PdfTextExtractor.getTextFromPage(doc.getPage(1));
    System.out.println(textFromPage);
}

此代码将首先展平您的表单,然后在展平的 PDF 文件上使用您的代码。

2) 您想要提取表单上填写的数据(为此,您只需要 iText 7 Core 和方法getXfaFieldValue):

public void readXFA() throws IOException {
        final String INPUT_XFA = "c:\\temp\\imm5562e.pdf";

        try (PdfDocument pdf = new PdfDocument(new PdfReader(INPUT_XFA))) {
            XfaForm xfaForm = PdfAcroForm.getAcroForm(pdf, false).getXfaForm();
            System.out.println(xfaForm.getXfaFieldValue("TextField2"));
        }
    }

我想从技术上讲,您可以使用第一种方法来提取这两种数据,但是您将失去 XFA 从表单中提取数据的能力。

【讨论】:

  • 这是 com.itextpdf: pdfxfa: 2.0.4?
  • System.out.println(xfaForm.getDomDocument()); ---> [#document: null]
  • 是的,这是使用 pdfXFA 2.0.4 的。你能发布你想要实现的完整代码吗?如果您使用我在您共享的 PDF 中发布的代码,它可以工作吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多