iText PDFSweep RegexBasedCleanupStrategy 在某些情况下不起作用

iText PDFSweep RegexBasedCleanupStrategy not work in some case

我正在尝试使用 iText PDFSweep RegexBasedCleanupStrategy 从 pdf 中编辑一些单词,但是我只想编辑单词而不是出现在其他单词中,例如。 我想将 "al" 编辑为单个单词,但我不想将 "al" 编辑为 "mineral"。 所以我在 Regex 中添加单词 boundary("\b") 作为 RegexBasedCleanupStrategy 的参数,

  new RegexBasedCleanupStrategy("\bal\b")

然而,如果单词位于行尾,pdfAutoSweep.cleanUp 将不起作用。

简而言之

此问题的原因是将提取的文本块展平为单个 String 以应用正则表达式的例程不会插入任何换行符指示符。因此,在 String 中,一行的最后一个字母紧接着是下一行的第一个字母,这隐藏了单词边界。在换行的情况下,可以通过向 String 添加适当的字符来修复此行为。

有问题的代码

将提取的文本块展平为单个 String 的例程在 com.itextpdf.kernel.pdf.canvas.parser.listener 包中 CharacterRenderInfo.mapString(List<CharacterRenderInfo>)。如果只是水平间隙,此例程会插入一个 space 字符,但如果是垂直偏移,即换行符,它不会向 StringBuilder 添加任何额外内容,其中 String 表示生成:

if (chunk.sameLine(lastChunk)) {
    // 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
    if (chunk.getLocation().isAtWordBoundary(lastChunk.getLocation()) && !chunk.getText().startsWith(" ") && !chunk.getText().endsWith(" ")) {
        sb.append(' ');
    }
    indexMap.put(sb.length(), i);
    sb.append(chunk.getText());
} else {
    indexMap.put(sb.length(), i);
    sb.append(chunk.getText());
}

可能的修复

可以扩展上面的代码以在换行符的情况下插入换行符:

if (chunk.sameLine(lastChunk)) {
    // 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
    if (chunk.getLocation().isAtWordBoundary(lastChunk.getLocation()) && !chunk.getText().startsWith(" ") && !chunk.getText().endsWith(" ")) {
        sb.append(' ');
    }
    indexMap.put(sb.length(), i);
    sb.append(chunk.getText());
} else {
    sb.append('\n');
    indexMap.put(sb.length(), i);
    sb.append(chunk.getText());
}

CharacterRenderInfo.mapString 方法仅从 RegexBasedLocationExtractionStrategy 方法 getResultantLocations()(包 com.itextpdf.kernel.pdf.canvas.parser.listener)中调用,并且仅针对提到的任务,即应用正则表达式题。因此,使其能够正确识别单词边界应该不会破坏任何东西,但确实应该被视为一种修复。

人们可能只是考虑为换行符添加不同的字符,例如一个普通的 space ' ' 如果不想处理垂直间隙与水平间隙有任何不同。因此,对于一般修复,可以考虑将此字符设为策略的可设置 属性。

版本

我使用 iText 7.1.4-SNAPSHOT 和 PDFSweep 2.0.3-SNAPSHOT 进行了测试。