You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用iText for .NET读取PDF时如何避免单词中出现虚假空格

解决iText7提取PDF文本时的虚假空格问题

问题根源

PDF文本渲染时,部分字符可能被单独定位绘制,即使视觉上属于同一个单词,默认提取策略也可能因字符间距的判断阈值问题,误将其识别为单词边界并插入空格。

自定义提取策略实现

通过继承LocationTextExtractionStrategy并重写IsChunkAtWordBoundary方法,调整字符间距的判断阈值,过滤虚假空格:

using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Data;
using iText.Kernel.Pdf.Canvas.Parser.Listener;

public class CustomNoFalseSpaceStrategy : LocationTextExtractionStrategy
{
    // 自定义间距阈值(可根据实际PDF调整,单位是用户空间单位)
    private const float SPACE_THRESHOLD = 0.1f;

    protected override bool IsChunkAtWordBoundary(ITextChunkLocation chunk, ITextChunkLocation previousChunk)
    {
        // 计算两个字符块的水平间距
        float distance = chunk.GetStartLocation()[0] - previousChunk.GetEndLocation()[0];
        
        // 如果间距小于阈值,判定为同一单词的一部分,不添加空格
        if (distance < SPACE_THRESHOLD)
        {
            return false;
        }
        
        // 其他情况沿用默认判断逻辑
        return base.IsChunkAtWordBoundary(chunk, previousChunk);
    }
}

使用自定义策略提取文本

修改原有代码,指定使用自定义策略:

using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;

var pdfDocument = new PdfDocument(new PdfReader("TestFile.pdf"));
var page = pdfDocument.GetPage(1);

// 使用自定义策略提取文本
var strategy = new CustomNoFalseSpaceStrategy();
var text = PdfTextExtractor.GetTextFromPage(page, strategy);

pdfDocument.Close();

注意事项

  • SPACE_THRESHOLD的值需要根据目标PDF调整:如果仍有虚假空格,可适当降低阈值;如果原本正常的空格被合并,可适当提高阈值。
  • 部分PDF的字符定位逻辑特殊,若上述方法无效,可尝试重写EventOccurred方法,直接处理每个字符的位置和内容,自定义拼接规则。

内容的提问来源于stack exchange,提问作者payetools-steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:18:21