如何从PDF文件中提取数据,同时跟踪其结构?

时间:2009-06-02 03:31:13

标签: pdf parsing extraction

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

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

  • 将PDF转换为文字。它对我不起作用,因为我丢失了图像和文档的结构。
  • 将PDF转换为HTML。我发现了一些帮助我的工具,目前为止最好的工具是pdftohtml。该工具非常好,但我无法成功解析HTML。
  • 将PDF转换为XML。与上述相同。

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

7 个答案:

答案 0 :(得分:10)

基本上没有简单的剪切和粘贴解决方案,因为PDF对结构并不是很感兴趣。这个网站上有许多其他答案会更详细地告诉你这些事情,但是这个答案应该给你一些要点:

If identifying text structure in PDF documents is so difficult, how do PDF readers do it so well?

如果你想在PDF本身(你可以对这个过程进行大部分控制)中这样做,你必须遍历页面上的所有文本并通过查看它们的文本属性来识别标题(使用的字体,相对于页面上的其他文本的大小等...)。

除此之外,您还必须通过查看文本片段的位置,页面上的空白区域,某些字母,单词和行的接近程度来识别段落... PDF本身甚至没有“单词”的概念,更不用说“行”或“段落”。

为了使事情复杂化,在页面上绘制文本的方式(以及它在PDF文件本身中出现的顺序)甚至不必是正确的阅读顺序(或者我们人类会考虑的内容)要正确的阅读顺序)。

答案 1 :(得分:2)

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

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

或者您可以使用能够完成此操作的ByteScout PDF Extractor SDK之类的商业工具:

  • 提取文本和图像以及分析文本的布局
  • XML或CSV,其中文本对象合并或拆分为虚拟布局网格内的段落
  • 通过特殊的API访问对象,可以通过其"虚拟"来解决每个对象。行和列索引,忽略它在原始PDF中的存储方式。

免责声明:我隶属于ByteScout

答案 2 :(得分:0)

除非它是标记内容,否则PDF没有结构......你必须“猜测”它是各种工具正在做什么。在http://blog.idrsolutions.com/2010/09/the-easy-way-to-discover-if-a-pdf-file-contains-structured-content/

上有一篇很好的博客文章解释了这些问题

答案 3 :(得分:0)

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

Grobid在github上作为开源提供。

https://github.com/kermitt2/grobid

答案 4 :(得分:0)

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

我制作了完整的教程,介绍如何在this article上使用tabula-py。只要安装了Java,您就可以在网络浏览器中建立表格。

答案 5 :(得分:0)

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

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

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

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

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

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

答案 6 :(得分:-4)

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

参考文献: PDFReader