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

