使用java

时间:2017-03-31 10:30:01

标签: java pdf itext pdfbox java-api

我有不同类型的pdf,其中包含多个内容,如文本,表格等。表格可能存在于pdf(顶部,中间,底部)的任何位置。 我想在没有传递位置的情况下使用java从该pdf中仅提取表数据(列的编号,行的数量和表中的数据)。

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

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

  

PdfTextExtractor.getTextFromPage

但它只返回文本形式的数据。没有任何线索可以确定pdf中存在哪些表以及如何从该表中提取数据。

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

3.我也跟着这个堆栈溢出链接: - PDF table extraction 但它并没有给我预期的产量。该算法需要除行位置和所有。

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

有人能告诉我如何使用iText& amp; PDF box API还是有任何开源API可以帮助我解决这个问题吗?

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

2 个答案:

答案 0 :(得分:1)

它基本上取决于您的输入文档,以及您愿意为此项目投入多少精力。

pdf不像html文档那样工作。在html文档中,您有逻辑标签,如“table”或“paragraph”。 pdf文档(在最基本的情况下)仅包含呈现文档所需的指令。 因此,不是获得“桌子”,你可能会“在这里划一条线,而另一条线路稍远一点,然后另一条线路穿过两条线路,等等”

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

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

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

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

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

答案 1 :(得分:0)

您可以尝试使用Tabula,这是一个开放源代码工具,用于检测和提取pdf文档中的表格。您可以扩展tabula-java并提取表详细信息。可以找到更多here

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