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

使用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ć

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:35:15