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

使用iText7 PdfSweep 2.0(C#)红隐PDF文本遇ArgumentException报错求助

解决PDFSweep 2.0红隐文本时的ArgumentException异常

我碰到过不少开发者遇到这个PDFSweep的异常问题,其实根源很明确——就是部分PDF里的CharacterRenderInfo并非标准的单个字符,可能是复合字形、特殊符号或者PDF生成时的文本布局异常导致的,而RegexBasedCleanupStrategy在匹配时会校验每个渲染信息是否为单字符,不符合就抛出这个错误。下面给你几个实用的解决思路:

方案1:自定义安全的正则匹配策略

继承RegexBasedCleanupStrategy,先过滤掉不符合单字符要求的渲染信息,再执行匹配逻辑。这样能避免无效的CharacterRenderInfo触发异常:

public class SafeRegexCleanupStrategy : RegexBasedCleanupStrategy
{
    public SafeRegexCleanupStrategy(string regexPattern) : base(regexPattern) { }

    public override ICollection<IPdfTextLocation> GetMatch(IList<CharacterRenderInfo> renderInfos)
    {
        // 只保留有效单字符的渲染信息
        var validRenderInfos = renderInfos
            .Where(ri => !string.IsNullOrEmpty(ri.GetText()) && ri.GetText().Length == 1)
            .ToList();
        
        return base.GetMatch(validRenderInfos);
    }
}

替换原有策略的使用方式:

CompositeCleanupStrategy strategy = new CompositeCleanupStrategy();
strategy.Add(new SafeRegexCleanupStrategy(@"Hello"));

方案2:手动提取文本位置并创建红隐区域

绕过自动扫描的限制,先通过文本提取器定位目标文本的位置,再手动添加红隐区域。这种方式更灵活,适合结构复杂的PDF:

using (PdfDocument pdf = new PdfDocument(new PdfReader(input), new PdfWriter(output)))
{
    for (int pageNum = 1; pageNum <= pdf.GetNumberOfPages(); pageNum++)
    {
        PdfPage page = pdf.GetPage(pageNum);
        LocationTextExtractionStrategy extractionStrategy = new LocationTextExtractionStrategy();
        PdfCanvasProcessor processor = new PdfCanvasProcessor(extractionStrategy);
        processor.ProcessPageContent(page);

        // 获取所有文本的位置信息
        var allTextLocations = extractionStrategy.GetResultantLocations();
        PdfCleanUpTool cleaner = new PdfCleanUpTool(pdf);

        // 遍历匹配目标文本并添加红隐
        foreach (var textLoc in allTextLocations)
        {
            if (textLoc.GetText().Contains("Hello"))
            {
                cleaner.AddCleanupLocation(new PdfCleanUpLocation(pageNum, textLoc.GetRectangle()));
            }
        }

        cleaner.CleanUp();
    }
}

方案3:开启PDF内容重建模式修复源文件

有些PDF是因为内容流损坏或者布局异常导致的问题,可以尝试用iText的内容重建功能预处理PDF:

// 开启内容重建模式读取PDF
ReaderProperties readerProps = new ReaderProperties().SetRebuildContent(true);
PdfReader reader = new PdfReader(input, readerProps);
PdfDocument pdf = new PdfDocument(reader, new PdfWriter(output));

// 后续的红隐逻辑保持不变
CompositeCleanupStrategy strategy = new CompositeCleanupStrategy();
strategy.Add(new RegexBasedCleanupStrategy(@"Hello"));
PdfAutoSweep autoSweep = new PdfAutoSweep(strategy);
autoSweep.CleanUp(pdf);
pdf.Close();

需要注意的是,不同PDF的问题原因可能不同——比如扫描后OCR生成的PDF、老旧工具生成的PDF更容易出现这类文本结构异常,你可以根据实际测试情况选择最适合的方案。

内容的提问来源于stack exchange,提问作者frostwolfer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:29:59