【问题标题】:Identify and extract table from pdf using java使用java从pdf中识别和提取表格
【发布时间】:2017-08-25 14:17:41
【问题描述】:

我有不同类型的 pdf,其中包含多种内容,例如文本、表格等。表格可能存在于 pdf 的任何位置(顶部、中间、底部)。 我只想使用 java 从该 pdf 中提取表数据(列数、行数和表中的数据)而不传递位置。

到目前为止我做了什么:-

1.我使用iText java API读取和提取。使用以下代码:-

PdfTextExtractor.getTextFromPage

但它只是以文本形式返回数据。没有任何线索来确定 pdf 中表的位置以及如何从该表中提取数据。

2. 我也使用过 PDFBox java API,但它也没有解决我的问题。

3.我也关注了这个堆栈溢出链接:- PDF table extraction 但这并没有给我预期的输出。该算法需要除了行位置之外的所有。

我无法确定在 pdf 中找到表格的位置。

谁能告诉我如何使用 iText 和 PDF box API 解决这个问题,或者是否有任何开源 API 可以帮助我解决这个问题?

或者我们可以将pdf转换成html,以便通过表格标签我们可以识别表格并阅读;)?

【问题讨论】:

标签: pdf itext pdfbox java


【解决方案1】:

您可以尝试使用Tabula,这是一个从 pdf 文档中检测和提取表格的开源工具。您可以扩展 tabula-java 并提取表详细信息。更多内容请关注here

如果您还希望从文档中提取文本,则可以使用 PDFBox 或 Apache Tika 仅提取文本。

【讨论】:

  • 您提供的解决方案非常适合我,这是有史以来最好的解决方案
【解决方案2】:

这基本上取决于您的输入文档,以及您愿意为这个项目付出多少努力。

pdf 不像 html 文档那样工作。在 html 文档中,您有诸如“表格”或“段落”之类的逻辑标签。 pdf 文档(在最基本的情况下)仅包含渲染文档所需的说明。 因此,您可能会得到“在此处画一条线,在稍远一点的地方再画一条线,然后再画一条穿过两者的线,依此类推”,而不是得到“桌子”。

此外,根据 pdf 规范,这些说明甚至不必按逻辑(阅读)顺序出现。

如果幸运的话,您输入的 pdf 可能是带标签的 PDF。带标签的 pdf 包含文档中底层结构的内部表示。带标签的 pdf 可能能够准确地告诉您文档中的哪些对象构成了表格。

现在,回到实际的答案。 如果您想要一个始终有效的解决方案,您可以实现 iText7 IEventListener 类。这个类有一个 eventOccurred() 方法,每次解析器处理完一个对象(如一段文本、一行等)时都会调用该方法

如果您随后寻找线条,并构建一些启发式方法来确定线条集合何时构成表格,您应该能够检测表格。

IText 还计划发布一个 pdf2Data 插件,它基本上可以为您完成繁重的工作。

【讨论】:

  • 我认为 iText 7 不是开源的。
猜你喜欢
  • 2015-04-16
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多