如何在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
相关产品推荐
相关产品推荐

