使用iText7提取PDF页面文本出现累加问题,求修正方法
iText7 提取PDF单页文本累加问题修正
你的代码出现累加式文本的核心原因是复用了同一个ITextExtractionStrategy实例。SimpleTextExtractionStrategy这类策略内部会维护文本缓存,每次调用GetTextFromPage时,会把当前页面的文本追加到已有缓存中,导致后续页面的结果包含之前所有页面的内容。同时你的循环边界还存在错误,会漏掉最后一页的文本提取。
以下是两种修正方案:
方案一:每次提取页面时创建新的策略实例
在循环内为每个页面单独创建策略对象,避免状态累积:
public List<string> PdfPages; // 用工厂方法封装策略创建逻辑,兼容自定义策略场景 private readonly Func<ITextExtractionStrategy> _strategyFactory; public PdfExtractor(IFormFile pdf, ITextExtractionStrategy? strategy = default) { _strategyFactory = strategy != null ? () => strategy : () => new SimpleTextExtractionStrategy(); PdfPages = new List<string>(); ExtractTextFromPages(pdf); } private void ExtractTextFromPages(IFormFile pdf) { using (var stream = pdf.OpenReadStream()) using (var reader = new PdfReader(stream)) { PdfDocument pdfDoc = new PdfDocument(reader); // 修正循环边界:将 < 改为 <=,确保提取所有页面 for (int index = 1; index <= pdfDoc.GetNumberOfPages(); index++) { ITextExtractionStrategy pageStrategy = _strategyFactory(); string pageText = PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(index), pageStrategy); PdfPages.Add(pageText); } } }
方案二:使用重置状态的策略(针对自定义策略场景)
如果需要复用自定义的策略实例,可以在每次提取页面前重置策略的内部状态。以SimpleTextExtractionStrategy为例,它没有公开的重置方法,所以更推荐方案一;如果是你自己实现的ITextExtractionStrategy,可以添加重置逻辑:
// 假设自定义策略实现了重置方法 public class CustomTextExtractionStrategy : ITextExtractionStrategy { public void Reset() { // 重置内部文本缓存等状态 } // 其他接口实现代码... } // 在提取循环中调用重置 for (int index = 1; index <= pdfDoc.GetNumberOfPages(); index++) { _Strategy.Reset(); string pageText = PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(index), _Strategy); PdfPages.Add(pageText); }
额外注意点
- 原代码的循环条件
index < pdfDoc.GetNumberOfPages()会导致最后一页被跳过,必须修改为index <= pdfDoc.GetNumberOfPages()才能提取所有页面的文本。
内容的提问来源于stack exchange,提问作者Staša Sekulić
相关产品推荐
相关产品推荐

