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

PdfReader加密1GB以上PDF抛出内存溢出异常的解决方案问询

问题根因

你遇到的内存溢出和磁盘存储空间无关,是因为默认配置下PdfReader会将整个PDF文件完整加载到内存中处理,1GB大小的文件直接加载会超出运行时分配的内存上限。

可行解决方案

  • 开启PdfReader的部分读取模式,仅在需要时加载对应片段的文件内容,避免全量载入内存,这是处理大体积PDF的官方推荐方案
  • 增大文件流的缓冲区,优化大文件的IO读写效率
  • 优化后续文件操作逻辑,删掉不必要的大文件复制步骤,降低IO耗时

调整后代码

// 加密PDF
// 给文件流配置4MB缓冲区,优化大文件读写性能
using (Stream input = new FileStream(inputpdfpath, FileMode.Open, FileAccess.Read, FileShare.Read, 4 * 1024 * 1024))
{
    using (Stream output = new FileStream(outPDF, FileMode.Create, FileAccess.Write, FileShare.None, 4 * 1024 * 1024))
    {
        // 第三个参数传true开启部分读取模式,不加载全量文件到内存
        PdfReader reader = new PdfReader(input, null, true);
        PdfEncryptor.Encrypt(reader, output, true, pdfpassword, null, PdfWriter.ALLOW_SCREENREADERS | PdfWriter.AllowPrinting | PdfWriter.ALLOW_MODIFY_CONTENTS);
    }
}

// 优化文件操作:直接移动覆盖,不需要额外复制大文件
File.Move(pdffilepath, Path.Combine(WorkingFolder, fileName));
// .NET Core 3.0+ 支持第三个参数覆盖已存在文件
File.Move(outPDF, pdffilepath, true);
// 如果是.NET Framework,替换上面的Move为如下代码:
// if(File.Exists(pdffilepath)) File.Delete(pdffilepath);
// File.Move(outPDF, pdffilepath);
File.SetAttributes(pdffilepath, FileAttributes.Normal);

额外注意事项

如果你的项目运行在32位模式下,需要把项目的平台目标修改为x64,避免32位进程最大2GB的内存上限限制。

内容的提问来源于stack exchange,提问作者Jane Ortega

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:15:04