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

