保留;“长”;PDFBox文本提取中的空格

保留;“长”;PDFBox文本提取中的空格,pdf,whitespace,pdfbox,text-extraction,Pdf,Whitespace,Pdfbox,Text Extraction,我正在使用PDFBox从PDF中提取文本。 PDF有一个表格结构,非常简单,列之间的间距也非常大 这非常有效,除了所有类型的水平空格都转换为单个空格字符,因此我无法再区分列(列中单词内的空格看起来就像列之间的空格) 我理解,一般的解决方案非常困难,但在这种情况下,列之间的距离非常远,因此对“长空格”和“单词之间的空格”进行简单区分就足够了 有没有办法告诉PDFBox将超过x英寸的水平空白转换为单个空格以外的内容?比例方法(x英寸变成y空间)也会起作用 具有一个“-layout”开关,尝试保留布局

我正在使用PDFBox从PDF中提取文本。 PDF有一个表格结构,非常简单,列之间的间距也非常大

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

我理解,一般的解决方案非常困难,但在这种情况下,列之间的距离非常远,因此对“长空格”和“单词之间的空格”进行简单区分就足够了

有没有办法告诉PDFBox将超过x英寸的水平空白转换为单个空格以外的内容?比例方法(x英寸变成y空间)也会起作用


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

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


看看里面的代码,我觉得自己很幸运,因为有了特定的PDF,这种简单的方法是成功的。更通用的解决方案似乎非常棘手。

PDF文本提取很困难

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

PDFTextOut("     Column 1                    Column 2           Column 3");
如果你使用的是固定宽度的字体,比如Courier,那么理论上你可以计算文本项之间的空格数,因为每个字符都是相同的宽度。如果字体与Arial字体成比例,那么计算就比较困难

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

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

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

嗯,PDF文本提取很困难,但xpdf的pdftotext布局保留选项工作得很好。如果PDFBox也有类似的功能就好了(它已经成功地保持了阅读顺序,将同一行上的文本放入同一输出行,并将字符分组为单词)。对于以下解析逻辑(必须重构表),明文输出是否足够清晰是另一个问题。幸运的是,在我的例子中,它起了作用。您必须更改哪个私有方法,以及您是如何更改它的?您可能想看看。