itextpdf在提取文本后插入空格beetwen 7和dot

时间:2016-05-25 14:06:32

标签: java itextpdf pdftotext

我的问题描述了这张图片 http://185.49.12.119/~pogdan/7spacedot/7spacedot.jpg 输入文件 http://185.49.12.119/~pogdan/7spacedot/monitor_2016_99.pdf

输出文件 http://185.49.12.119/~pogdan/7spacedot/monitor_2016_99.txt

使用jar和java设置所有文件 http://185.49.12.119/~pogdan/7spacedot/

为什么itextpdf会插入空格?怎么删除它?替换7。 - > 7.没有为我解决。

1 个答案:

答案 0 :(得分:0)

  

为什么itextpdf会插入空格?

当两个连续文本块之间存在间隙(大于某个数量或两个连续文本块重叠时),iText会插入空格。它这样做是为了表示这些块不会以正常方式相互跟随。

如果您的文档中有七个点经常向左移动,以便字符边界框重叠:

Sample overlapping 7 and .

  

如何删除它?

如果您不想这样做,则必须相应地调整文本提取策略。

在当前的5.5.9中,代码如下所示:

if (result.charAt(result.length()-1) != ' ' && renderInfo.getText().length() > 0 && renderInfo.getText().charAt(0) != ' '){ // we only insert a blank space if the trailing character of the previous string wasn't a space, and the leading character of the current string isn't a space
    float spacing = lastEnd.subtract(start).length();
    if (spacing > renderInfo.getSingleSpaceWidth()/2f){
        appendTextChunk(" ");
        //System.out.println("Inserting implied space before '" + renderInfo.getText() + "'");
    }
}

您的古代iText版本的来源可能仍然类似于此处。这就是你必须改变逻辑以不为后退插入空格或至少只为更大的空间插入空格的地方。

正如OP在评论中解释的那样,使用

float spaceWidth = renderInfo.getSingleSpaceWidth() * 3f/2f;
float diffI1 = start.subtract(lastEnd).get(Vector.I1);
if (spacing > spaceWidth && diffI1 > 0)
{
    result.append(" ");
}

在他的案子中运作良好。然而,这并不意味着人们通常应该以这种方式改变策略代码,因为它假设写作面向正 x 轴方向。此外,renderInfo.getSingleSpaceWidth()乘以的常数的最佳值也取决于手头的文档类型,参见例如this case