使用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
相关产品推荐
相关产品推荐

