2

我正在使用 PDFBox 从 PDF 中提取文本。PDF具有表格结构,非常简单,并且列之间的间距也很宽

这非常有效,除了所有类型的水平空间都被转换为单个空格字符,因此我无法再将列分开(列中单词中的空格看起来就像列之间的空格)。

我很欣赏通用解决方案非常困难,但在这种情况下,列之间的距离真的很远,因此在“长空格”和“单词之间的空格”之间进行简单区分就足够了。

有没有办法告诉 PDFBox 将超过 x 英寸的水平空白变成单个空格以外的东西?比例方法(x 英寸变为 y 空间)也可以。

pdftotext C 库/工具有一个“-layout”开关,试图保留布局。基本上,如果我可以用 PDFBox 模拟它,那将是完美的。

4

2 回答 2

2

似乎没有对此的设置,但是当遇到“长”空间时,我能够修改PDFTextStripper工具的源以输出列分隔符 (|)。在构建输出行的代码中,可以查看当前和前一个字母的 x 位置,如果它足够大,请做一些特殊的事情。PDFTextStripper 有很多受保护的方法,但实际上并不是那么可扩展。我最终不得不复制整个类来更改私有方法。

看着那里的代码,我称自己很幸运,使用特定的 PDF,这种简单的方法是成功的。更通用的解决方案似乎非常棘手。

于 2011-01-12T06:39:20.453 回答
1

PDF文本提取很困难。

如果文本输出为一个由空格分隔的大字符串,例如:-

PDFTextOut("     Column 1                    Column 2           Column 3");

并且您使用的是固定宽度的字体,例如 Courier,那么理论上您可以计算文本项之间的空格数,因为每个字符的宽度相同。如果字体与 Arial 等比例,则计算会更难。

实际上,大多数 PDF 是通过单独将每段文本直接放置到其位置来生成的。因此,从技术上讲,列之间没有空格字符或任何其他字符。文本只是放置在页面上的绝对位置。

PDFMoveTo(100,100);
PDFTextOut("Column 1");
PDFMoveTo(250,100);
PDFTextOut("Column 2");

为了对 PDF 文档执行数据提取,您必须做更多的工作来查找和匹配列数据,方法是使用您提到的像素位置并做出一些假设并有一点运气。

于 2011-01-12T07:10:05.200 回答