我们正在使用PDFBox从PDF中提取文本。
某些PDF文字无法正确提取。 下图显示PDF中的一部分作为图像:
文本提取后,我们得到以下文字:
3,8 5 EU R 1 Netto 38,50 EUR 4,00
(在','和' 8'之间添加空格)
这是我们的代码:
PDDocument pdf = PDDocument.load(reuseableInputStream);
PDFTextStripper pdfStripper = new PDFTextStripper();
pdfStripper.setSortByPosition(true);
String text = pdfStripper.getText(pdf);
我们尝试使用PDFTextStripper属性' AverageCharTolerance'和' SpacingTolerance'没有积极的影响。
替代图书馆' iText'正确提取文本,字符之间没有空格。但由于许可证问题,我们无法使用它。
有什么想法吗?谢谢。
编辑:我们使用的是1.8.9版。我们还试用了快照版本2.0.0而没有效果。
答案 0 :(得分:6)
检查OP提供的文件后发现问题是由实际存在的额外空间引起的!从同一起始位置绘制了多个字符串;在每个位置,其中一个字符串中的一个具有非空格字符。因此,PDF查看器输出看起来不错,但PDFBox作为文本提取器会尝试使用找到的所有字符,包括那些额外的空格字符。
可以使用带有 F0 Courier
的内容流的PDF重现该行为BT
/F0 9 Tf
100 500 Td
( 2 Netto 5,00 EUR 3,00) Tj
0 0 Td
( 2882892 ENERGIZE LR6 Industrial 2,50 EUR 1) Tj
ET
在PDF查看器中,如下所示:
复制&来自Adobe Reader的粘贴结果
2 2 8 8 2 8 9 2 E N E R G I Z E L R 6 I n d u s t r i a l 2 , 5 0 E U R 1 Netto 5,00 EUR 3,00
使用PDFBox定期提取结果
2 2 8 8 2 89 2 E N E RG IZ E L R 6 I n du s t ri a l 2 ,5 0 EU R 1 Netto 5,00 EUR 3,00
因此,不仅PDFBox在这里有问题,这两个输出看起来不同,但额外的空间无论如何都是个问题。
我建议告诉那些PDF的制作人他们很难进行后期处理,即使对于像Adobe Reader这样广泛使用的软件也是如此。
为了从中提取合理的东西,我们必须以某种方式忽略(实际存在的!)额外空间。由于没有办法临时知道以后可以使用哪些空格,哪些空间不能使用,我们只需删除所有空格并希望PDFBox在必要时添加空格:
String extractNoSpaces(PDDocument document) throws IOException
{
PDFTextStripper stripper = new PDFTextStripper()
{
@Override
protected void processTextPosition(TextPosition text)
{
String character = text.getCharacter();
if (character != null && character.trim().length() != 0)
super.processTextPosition(text);
}
};
stripper.setSortByPosition(true);
return stripper.getText(document);
}
(ExtractWithoutExtraSpaces.java)
将此方法与测试文档一起使用:
2 2882892 ENERGIZE LR6 Industrial 2,50 EUR 1 Netto 5,00 EUR 3,00
替代图书馆' iText'正确提取文本,字符之间没有空格
这是因为iText逐字符串地提取文本字符串,而不是字符。这个程序有其自身的危险,但在这种情况下会产生更开箱即用的东西。
答案 1 :(得分:0)
在较新版本的 PDFBox 上,解决方法不起作用。 但是您可以修复问题空间并获得相同的结果,只需像这样设置您的 PDFTextStripper:
PDFTextStripper strippet = new PDFTextStripper();
stripper.setWordSeparator("");