首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache PDFBox删除字符之间的空格。

Apache PDFBox删除字符之间的空格。
EN

Stack Overflow用户
提问于 2015-04-10 06:01:24
回答 2查看 4.7K关注 0票数 6

我们使用PDFBox从PDF中提取文本。

有些PDF的文本无法正确提取。下面的图片显示了PDF中的一个部分:

在文本提取之后,我们得到以下文本:

3,8 5欧盟R 1 Netto 38,50欧元4,00欧元

(空格加在',‘和’8‘之间)

这是我们的代码:

代码语言:javascript
复制
            PDDocument pdf = PDDocument.load(reuseableInputStream);
            PDFTextStripper pdfStripper = new PDFTextStripper();
            pdfStripper.setSortByPosition(true);
            String text = pdfStripper.getText(pdf);

我们尝试使用PDFTextStripper属性“AverageCharTolerance”和“SpacingTolerance”,但没有产生积极的效果。

替换的libary 'iText‘正确地提取文本,没有字符之间的空格。但我们不能使用它因为许可证问题。

有什么想法吗?谢谢。

编辑:我们正在使用1.8.9版本。我们还尝试了快照版本2.0.0,但没有任何效果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-24 17:48:06

致因

检查OP提供的文件,结果发现问题是由实际存在的额外空间引起的!从相同的起始位置提取多个字符串;在每个位置最多有一个字符串具有一个非空格字符。因此,PDF查看器的输出看起来不错,但是PDFBox作为文本提取器尝试使用所有找到的字符,包括那些额外的空格字符。

这种行为可以使用包含此内容流的PDF格式来再现,其中F0Courier

代码语言:javascript
复制
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复制和粘贴

代码语言:javascript
复制
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进行规则提取的结果

代码语言:javascript
复制
             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。

周旋

要从中提取出一些合理的东西,我们必须以某种方式忽略(实际存在的!)额外的空间。由于无法特别了解哪些空格可以稍后使用,哪些空间不能使用,我们只需删除所有,并希望PDFBox在必要时添加空格:

代码语言:javascript
复制
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);
}

(https://github.com/mkl-public/testarea-pdfbox1/blob/master/src/test/java/mkl/testarea/pdfbox1/extract/ExtractWithoutExtraSpaces.java)

将此方法与测试文档一起使用,我们得到:

代码语言:javascript
复制
2 2882892 ENERGIZE LR6 Industrial 2,50 EUR 1 Netto 5,00 EUR 3,00

不同文本提取器

可选的libary 'iText‘正确提取文本,没有字符之间的空格

这是因为iText逐字符串提取文本字符串,而不是逐个字符提取文本字符串。这个过程有它自己的危险,但在这种情况下,结果是一些更有用的开箱即用的东西。

票数 8
EN

Stack Overflow用户

发布于 2021-06-11 16:56:46

在较新版本的PDFBox上,解决方法不起作用。但是您可以修复问题空间并获得相同的结果,只需这样设置您的PDFTextStripper:

代码语言:javascript
复制
PDFTextStripper strippet = new PDFTextStripper();
stripper.setWordSeparator("");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29554400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档