【问题标题】:Missing Table Layout Info from PDF ExtractionPDF 提取中缺少表格布局信息
【发布时间】:2019-09-11 09:38:37
【问题描述】:

我已经研究过从 PDF 中进行文本提取/数据提取并使用其他一些堆栈溢出答案来寻求帮助,我设置的是 Tika 通过自定义 ContentHandlerDecorator 解析 pdf,该自定义 ContentHandlerDecorator 使用 sax 事件来解析内容。我遇到了一个问题,虽然在 PDF 查看器中查看 pdf 时包含按行和列排列的数据表,但该信息似乎只是没有从 pdf 中提取,或者我看不到如何使用蒂卡/萨克斯。

这是我看到的一个例子:

像上面这样的表给了我这个(当我只是串起萨克斯事件时)

START http://www.w3.org/1999/xhtml, div, , div, class = page; 
START http://www.w3.org/1999/xhtml, p, , p, 
END http://www.w3.org/1999/xhtml, p, , p
WHITESPACE[
], 0, 1

START http://www.w3.org/1999/xhtml, p, , p, 
CHARS [I, n, f], 0, 3
WHITESPACE[
], 0, 1
CHARS [o], 0, 1
WHITESPACE[
], 0, 1
END http://www.w3.org/1999/xhtml, p, , p

START http://www.w3.org/1999/xhtml, p, , p, 
CHARS [I, n, f, o], 0, 4
CHARS [ ], 0, 1
CHARS [H, 1], 0, 2
CHARS [ ], 0, 1
CHARS [H, 2], 0, 2
CHARS [ ], 0, 1
CHARS [H, 3], 0, 2
CHARS [ ], 0, 1
CHARS [H, 4], 0, 2
WHITESPACE[
], 0, 1
END http://www.w3.org/1999/xhtml, p, , p

// Start of Second Row
START http://www.w3.org/1999/xhtml, p, , p, 
CHARS [1], 0, 1
CHARS [I, n, f, 1], 0, 4
WHITESPACE[
], 0, 1
CHARS [I, n, f, 2], 0, 4
WHITESPACE[
], 0, 1
END http://www.w3.org/1999/xhtml, p, , p

START http://www.w3.org/1999/xhtml, p, , p, 
CHARS [I, n, f, 3], 0, 4
WHITESPACE[
], 0, 1
END http://www.w3.org/1999/xhtml, p, , p

START http://www.w3.org/1999/xhtml, p, , p, 
CHARS [D, 1], 0, 2
CHARS [ ], 0, 1 
CHARS [D, 4], 0, 2
END http://www.w3.org/1999/xhtml, p, , p

由于段落看似随机的结尾,没有指示何时开始新行,并且在第二行的情况下,尽管空列的数据显示为查看器。

很抱歉,我无法提供 pdf,但我正在寻找有关这些额外格式/布局数据存储或可以提取的位置的任何信息,因为我从 Tika 获得的信息明显缺失。任何段落中都没有任何属性。

如果有帮助,我知道 PDF 是使用 iText 生成的,正如我在元数据中看到的那样,但是在试用 iText 时,它似乎没有提供一种以编程方式打开和解析 pdf 而不提供某种形式的方法预制的提取模板,我不想这样做。

【问题讨论】:

    标签: java itext pdfbox sax apache-tika


    【解决方案1】:

    SAX 信息对于获取您想要的信息几乎毫无用处。 IIRC,iText 有一个文本提取 API,您需要它提供的位置信息来确定给定的文本位在哪一列中。

    看看 iText 的SimpleTextExtractionStrategy。您需要构建类似的东西,关注eventOccurred(),寻找EventType.RENDER_TEXT。当您收到文本呈现事件时,您需要查看IEventData 参数转换为TextRenderInfo,并找出它在页面(和表格中)的位置,如果它在表格中,等等.

    根据位置信息,您必须推断出每条文本来自哪一列。不要依赖以逻辑顺序出现的信息。不要依赖文本让单元格出现在单个渲染事件中。

    注意:我对 pdfbox、sax 或 apache-tika 几乎一无所知,因此很可能有一种不那么“自己动手”的方式来做这件事。例如,您可以调整 Tika 的输出以提供定位信息(绝对或相对)。此信息可能来自类似于SimpleTextExtractionStrategy 的东西。

    很好的狩猎。

    【讨论】:

    • 酷,至少感谢您提供的信息,我以为我快疯了。不确定 iText 是否适合我只是因为成本,但我会深入研究。谢谢
    • 还有其他几个选项。有一个开源的 git 项目继续使用旧的 MPL 版本的 iText。有一个 GhostScript 可以为您提供带有坐标的文本(可能通过配套应用程序,我不记得了)。您不是第一个需要的不仅仅是“按绘制顺序将所有文本转储到此文件中”的人。远非如此。
    • 不,但有趣的是,关于这部分的信息并不多。看起来 iText 实际上是从它的 maven 依赖项中使用 PDFBox,所以我认为必须有一种方法可以使用 PDF Box。
    猜你喜欢
    • 1970-01-01
    • 2012-06-12
    • 2012-10-28
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多