在java中从PDF中提取文本的最佳方法
Posted
技术标签:
【中文标题】在java中从PDF中提取文本的最佳方法【英文标题】:Best way to extract text from PDF in java 【发布时间】:2021-04-05 09:45:57 【问题描述】:我想制作一个能够读取 PDF 文件并解析其内容的程序。 因此我需要使用某种库来提取文本。我找到了 3 种方法。
-
OCR 库(如 Tesseract)
ScanPdf 库(如 iText)
从 PDF 到文本的转换器。
我无法理解它们之间的巨大差异,因为它们最终都会从 PDF 中生成一个文本文件。那么解决这个问题的最佳方法是什么?
【问题讨论】:
如果您想阅读 PDF 文件并提取内容,那么图书馆将是最合适的。如果您的源文档是从打印的文档或图像中扫描的,OCR 会更合适。 PDF 到文本转换器将首先解析 PDF 并将文本转储到某处。这在批处理场景中可能很有用。但是,使用像 Apache PDF Box 这样的好的库可以帮助您在程序中进行读取/解析/提取。 你的方式 2 和 3 到底有什么区别? 一个是库,所以一切都发生在我的程序中,另一个是在我挖掘数据处理数据之前运行的普通程序 【参考方案1】:PDF 是一种复杂的格式。如果您打开 PDF 并盯着一堆文本,那并不能告诉您太多信息。可能是您正盯着某人决定打包成 PDF 文件的图像文件。如果有人扫描了文档并告诉他们的扫描仪“扫描到 PDF”,这是 99% 以上的确定,如果您有 PNG 或 JPG 并“另存为 PDF”,或者尝试“ print to PDF' 这样的东西。
那么 PDF 中没有文本。有像素。
为了将像素转换为文本,这就是 OCR 库的用武之地。这就是他们所做的。这就是他们所做的一切。这是一个人工智能的财富,而且容易出错。没有保证。
然而,PDF 比这更复杂,它不像 PNG/JPG:它更像是 html。你可以把实际的文字放在那里。
不过,这有不同的问题。您可以放置文本块(即带有坐标的“矩形”,然后是应该进入内部的文本)。再次很像 HTML:您可以执行以下操作:
<p class="foo">
World!
</p>
<p class="bar">
Hello,
</p>
然后创建 CSS,使 foo
在 bar
块之后呈现(可以像 .foo, .bar display: block; .foo float: right
一样简单)。
将 HTML 转换为“World!Hello”并不是那么棘手。意识到在渲染过程中,您最终会看到“Hello, World!”,因此编写返回“Hello, World!”的代码,这要复杂得多。
同样的问题也适用于 PDF。对于简单的 PDF,提取其中的原始文本并不太难,但请注意,即使是稍微复杂的 PDF,文本也可能一团糟。
iText 试图给你足够的权力,至少,提供后者:给你一个完整的层次分解。它返回'这里是一个文本框,这里是它的定位,这里是里面的文本。现在这里是另一个文本框,等等'。它不会返回一个大字符串。
换句话说:答案很大程度上取决于您拥有哪些 PDF/您希望能够阅读哪些 PDF,以及它们的复杂程度。如果是扫描,则需要 OCR 库。如果它们很简单,一个基本的 pdf2text 转换器就可以了。如果您想尝试考虑带有内部表单和可以打开和关闭的“弹出窗口”的精美定位的 PDF,oof。可能所有这些工具都不够用,而且您注册的工作量需要花费很多人周的时间。
【讨论】:
【参考方案2】:肯定有嵌入文本的 PDF,它不仅仅是像素。
这取决于 PDF 是否为“真实”PDF(即您可以突出显示文本并将其复制并粘贴到其他位置)或 PDF 是否为扫描图像。
对于扫描的图像,您必须使用 OCR API。所有主要的云提供商都有 OCR API(即 Amazon Textract、Google Document AI、Microsoft Form Recognizer 等)。如果它是真正的 PDF,那么我发现 pdf.js 库 (https://mozilla.github.io/pdf.js/) 对直接提取文本很有帮助。
只要知道这样做只会让您获得页面上的文字,而且要以编程方式跨多个文档获取键/值数据字段还有很多工作要做。
如果您对更强大的东西感兴趣,这也是我的初创公司 (www.sensible.so/) 正在开发的东西!
【讨论】:
以上是关于在java中从PDF中提取文本的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章