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

如何在ASP.NET MVC C#中使用iTextSharp合并大量PDF时避免System.OutOfMemoryException

异常根因

你当前的写法已经用了PdfCopy和FileStream,但忽略了iTextSharp 5.x的PdfCopy默认会持有所有已加载PdfReader的对象缓存,即使你手动调用了reader.Close(),这部分缓存依然会留在内存中,合并上千份文件时累积的缓存就会触发内存溢出。

修复方案

  • 每次调用AddDocument后立即调用PdfCopy.FreeReader()方法,主动释放PdfCopy持有的对应PDF资源缓存
  • 用using块包裹PdfReader的声明,避免异常场景下的资源泄漏
  • 初始化PdfReader时启用部分加载模式,不要把整份PDF一次性读入内存
  • 合并超过2000份文件时建议做分层合并:每200份合并为1个中间PDF,再把所有中间PDF合并为最终文件,进一步降低单次合并的内存峰值

修复后的完整代码

// 静态属性全局仅需设置一次,不要每次合并都重复赋值
PdfReader.unethicalreading = true;

using (FileStream stream = new FileStream(outMergeFile, FileMode.Create))
{
    Document document = new Document();
    PdfCopy pdf = new PdfCopy(document, stream);
    try
    {
        document.Open();
        for (int i = 0; i < fileList.Count; i++)
        {
            var fileStr = Request.MapPath(fileList[i].Path);
            // 启用部分加载模式,大文件不会全量载入内存
            using (var reader = new PdfReader(new RandomAccessFileOrArray(fileStr, false), null))
            {
                pdf.AddDocument(reader);
                // 主动释放PdfCopy持有的当前PDF缓存
                pdf.FreeReader(reader);
            }
        }
    }
    finally
    {
        document.Close();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:15:02