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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:30:42