我有不同类型的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,以便通过表格标签我们可以识别表并阅读;)?
答案 0 :(得分:1)
它基本上取决于您的输入文档,以及您愿意为此项目投入多少精力。
pdf不像html文档那样工作。在html文档中,您有逻辑标签,如“table”或“paragraph”。 pdf文档(在最基本的情况下)仅包含呈现文档所需的指令。 因此,不是获得“桌子”,你可能会“在这里划一条线,而另一条线路稍远一点,然后另一条线路穿过两条线路,等等”
此外,根据pdf规范,这些说明甚至不必以逻辑(阅读)顺序出现。
如果您幸运,您的输入pdf可能是标记的PDF。标记的pdf包含文档中底层结构的内部表示。标记的pdf可能能够准确地告诉您文档中的哪些对象构成了表格。
现在,回到实际答案。 如果您想要一个始终有效的解决方案,您可以实现iText7 IEventListener类。这个类有一个方法eventOccurred(),每当解析器处理完一个对象(比如一段文本,一行等)时就会调用它。
如果你随后寻找线条,并构建一些启发式算法来确定线条集合何时构成一个表格,你应该能够检测到表格。
IText还计划发布一个pdf2Data插件,它基本上可以为你做繁重的工作。
答案 1 :(得分:0)