32

我的目标是从 PDF 文件中提取文本和图像,同时解析其结构。解析结构的范围并不详尽;我只需要能够识别标题和段落。

我尝试了一些不同的东西,但我在其中的任何一个中都没有走得太远:

  • 将 PDF 转换为文本。它对我不起作用,因为我丢失了图像和文档的结构。
  • 将 PDF 转换为 HTML。我找到了一些可以帮助我解决这个问题的工具,迄今为止最好的工具是 pdftohtml。该工具在演示方面非常出色,但我无法成功解析 HTML。
  • 将 PDF 转换为 XML。和上面一样。

有人对如何解决这个问题有任何建议吗?

4

7 回答 7

22

本质上没有一个简单的剪切和粘贴解决方案,因为 PDF 对结构并不是很感兴趣。该站点上还有许多其他答案可以更详细地告诉您,但是这个答案应该为您提供要点:

如果识别 PDF 文档中的文本结构如此困难,那么 PDF 阅读器是如何做到如此出色的呢?

如果您想在 PDF 本身中执行此操作(您将拥有对该过程的大部分控制权),则必须遍历页面上的所有文本并通过查看其文本属性(使用的字体、相对于页面上的其他文本等...)。

最重要的是,您还必须通过查看文本片段的位置、页面上的空白、某些字母、单词和行的接近程度来识别段落...... PDF 本身甚至没有一个概念“单词”,更不用说“行”或“段落”了。

更复杂的是,文本在页面上的绘制方式(以及它在 PDF 文件本身中出现的顺序)甚至不必是正确的阅读顺序(或者我们人类认为正确的顺序)阅读顺序)。

于 2014-05-03T14:35:42.637 回答
4

您可以将以下方法与 iTextSharp 或其他开源库一起使用:

  • 使用iTextSharp或类似的开源工具读取 PDF 文件并将所有文本对象收集到一个数组中(或使用pdftohtml之类的工具将 PDF 转换为 HTML ,然后解析 HTML)
  • 按坐标对所有文本对象进行排序,以便将它们放在一起
  • 然后遍历对象并检查它们之间的距离,看看是否可以将 2 个或多个对象合并到一个段落中

或者您可以使用商业工具,例如ByteScout PDF Extractor SDK,它能够做到这一点:

  • 提取文本和图像以及分析文本的布局
  • XML 或 CSV,其中文本对象在虚拟布局网格内合并或拆分为段落
  • 通过特殊的 API 访问对象,这使得可以通过其“虚拟”行和列索引来处理每个对象,而不管它如何存储在原始 PDF 中。

免责声明:我隶属于 ByteScout

于 2015-02-16T10:07:19.830 回答
4

PDF 解析标题及其子内容确实非常困难(这并不意味着它不可能),因为 PDF 有多种格式。但我最近遇到了一个名为GROBID的工具,它可以在这种情况下提供帮助。我知道这并不完美,但如果我们提供适当的培训,它可以实现我们的目标。

Grobid 作为 github 上的开源提供。

https://github.com/kermitt2/grobid

于 2018-03-17T01:50:18.613 回答
3

PDF 文件可以用 tabula-py 或 tabula-java 解析。

我在这篇文章中做了一个关于如何使用 tabula-py 的完整教程。只要您安装了 Java,您也可以在 Web 浏览器中制作表格。

于 2019-02-09T03:05:49.987 回答
0

除非它是标记内容,否则 PDF 没有结构......您必须“猜测”它,这就是各种工具正在做的事情。有一篇很好的博客文章解释了 http://blog.idrsolutions.com/2010/09/the-easy-way-to-discover-if-a-pdf-file-contains-structured-content/上的问题

于 2009-06-02T07:11:14.693 回答
0

如上面的答案所述,PDF 不是很容易解析。但是,如果您有关于要解析的文本的某些附加信息,则可以将其关闭。

  1. 如果您的标题位于页面的特定部分,您可以解析 PDF 文件并按坐标对解析后的输出进行排序。

  2. 如果您事先了解标题和段落之间的间距,您还可以利用此信息来解析文件。

PDFBox是一个 PDF 解析工具,您可以使用它来提取文本和图像,您可以在其上定义自定义的解析规则。

但是,要解析 PDF,您需要先了解 PDF 文件的一般格式。您可以查看以下博客 文章文档解析以获取有关文档解析的更多信息。

免责声明:我参与了这篇博文的撰写。

于 2021-06-02T07:07:29.427 回答
-10

iText api: PdfReader pr=new PdfReader("C:\test.pdf");

参考资料:PDFReader

于 2018-02-23T10:01:05.587 回答