使用PdfSharp合并大量PDF时遭遇System.OutOfMemoryException问题
解决PDF合并后内存缓冲区未释放问题
问题根源
你代码里用了using包裹outPdf,但内存没释放的核心原因大概率是:
PdfDocument的引用没被及时回收,GC未触发资源清理- 部分PDF库的
Modify打开模式会留存增量更新缓存,导致内存占用无法释放 - 额外调用的
outPdf.Close()属于冗余操作,因为using已经自动执行Dispose()(通常包含Close()逻辑)
可行解决方案
1. 强制触发垃圾回收并清空引用
在using块结束后,主动清空对象引用并触发GC,确保资源被回收:
try { while (filesMerged < fileCount) { using (outPdf = firstTime ? new PdfDocument() : PdfReader.Open(path + "\\" + fileName, PdfDocumentOpenMode.Modify)) { firstTime = false; for (int i = 0; i < 5000; i++) { if (filesMerged >= fileCount) break; pdfPath = filesInPath[index]; using (var tempPdfFile = PdfReader.Open(pdfPath, PdfDocumentOpenMode.Import)) { totalSize += tempPdfFile.FileSize; CopyPages(tempPdfFile, outPdf); } filesMerged++; index++; } outPdf.Save(path + "\\" + fileName); totalOpens++; } // 清空引用并强制GC回收 outPdf = null; GC.Collect(); GC.WaitForPendingFinalizers(); } }
2. 检查CopyPages辅助方法
确认CopyPages里没有保留对源PDF或目标PDF页面的额外引用,比如缓存页面对象、未释放的资源句柄,这些都会导致内存泄漏。
3. 修改PDF打开模式
把PdfDocumentOpenMode.Modify换成PdfDocumentOpenMode.ReadWrite,部分库的Modify模式会维持更多内存缓存用于增量修改,ReadWrite模式更倾向于完整读写后释放资源。
4. 拆分合并文件(可选)
如果内存问题仍存在,可以将合并后的PDF拆分为多个小文件,避免持续追加到单个大文件导致的内存累积。
关键提示
using语句已经覆盖了资源释放逻辑,无需额外调用Close()- 手动触发GC虽非常规操作,但在批量处理大文件场景下是有效的临时解决方案
内容的提问来源于stack exchange,提问作者Carl Sagan
相关产品推荐
相关产品推荐

