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

时间:2011-01-11 10:47:44

标签: pdf whitespace pdfbox text-extraction

我正在使用PDFBox从PDF中提取文本。 PDF具有表格结构,非常简单,列也彼此间隔很大

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

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

有没有办法告诉PDFBox将超过x英寸的水平空白转换为单个空格以外的其他内容?比例方法(x英寸成为y空格)也可以。

pdftotext C library/tool有一个'-layout'开关,试图保留布局。基本上,如果我可以用PDFBox模仿,那将是完美的。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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文档上执行数据提取,您需要做更多的工作来查找和匹配列数据,方法是使用像您提到的像素位置,并做一些假设并稍微运气一下。