.NET 6 Web API中如何压缩流式接收的PDF文档?
.NET 6 Web API 中压缩PDF文件大小的解决方案
你用GzipStream没效果的核心原因是:PDF文件内部通常已经对图片、字体等资源做了压缩,Gzip作为通用压缩算法,对这类已压缩内容的优化空间极小,甚至可能因为额外的压缩头导致文件体积变大。要有效减小PDF体积,需要用PDF专用的优化工具,以下是两种可行的实现方案:
方案一:使用iText7优化PDF(推荐)
iText7是专业的PDF处理库,能针对性地压缩图片、移除冗余对象、合并重复资源,压缩效果显著。
- 安装NuGet包:
Install-Package iText7 Install-Package iText7.pdfoptimizer
- 处理FileStream的代码示例:
using iText.Kernel.Pdf; using iText.Pdfoptimizer; public async Task<Stream> CompressPdfAsync(FileStream inputStream) { var outputStream = new MemoryStream(); var optimizer = new PdfOptimizer(); var optimizationOptions = new OptimizationOptions() // 配置图片压缩:中等压缩级别,70%质量 .SetImageOptimizationOptions(new ImageOptimizationOptions() .SetCompressionLevel(ImageOptimizationOptions.COMPRESSION_MEDIUM) .SetQuality(0.7f)) // 移除重复/未使用的对象 .SetRemoveDuplicateObjects(true) .SetRemoveUnusedObjects(true) // 压缩流数据 .SetCompressStreams(true); using (var pdfReader = new PdfReader(inputStream)) using (var pdfWriter = new PdfWriter(outputStream)) { // 若PDF有加密,需开启此选项(注意合规性) pdfReader.SetUnethicalReading(true); var pdfDocument = new PdfDocument(pdfReader, pdfWriter); optimizer.Optimize(pdfDocument, optimizationOptions); pdfDocument.Close(); } outputStream.Position = 0; return outputStream; }
注意事项
- 处理加密PDF时,
SetUnethicalReading(true)需确保符合版权规定,避免法律风险。 - 可根据需求调整图片质量(0-1)和压缩级别,平衡体积与清晰度。
- 处理超大文件时,建议使用磁盘流替代
MemoryStream,避免内存溢出。
方案二:使用PdfSharp.LGPLv2.Core
PdfSharp是轻量开源的PDF处理库,LGPL协议,适合对授权有特殊要求的场景。
- 安装NuGet包:
Install-Package PdfSharp.LGPLv2.Core
- 代码示例:
using PdfSharp.Pdf; using PdfSharp.Pdf.IO; public Stream CompressPdfWithPdfSharp(FileStream inputStream) { var outputStream = new MemoryStream(); var document = PdfReader.Open(inputStream, PdfDocumentOpenMode.Modify); // 启用内容流和二进制流压缩 document.Options.CompressContentStreams = true; document.Options.CompressBinaryStreams = true; // 移除未使用的对象 document.RemoveUnusedObjects(); document.Save(outputStream, false); document.Close(); outputStream.Position = 0; return outputStream; }
注意事项
- PdfSharp的图片压缩能力弱于iText7,更适合文本为主的PDF。
- 对加密PDF的支持有限,复杂加密文档可能无法处理。
额外优化建议
- 降低图片分辨率:将PDF中的高分辨率图片调整为72DPI(屏幕显示)或150DPI(打印),可大幅减小体积。
- 移除冗余元素:删除注释、表单域、隐藏图层、多余元数据等非必要内容。
- 合并重复资源:多个页面共用的字体、图片可合并,减少重复存储。
内容的提问来源于stack exchange,提问作者Jay Parikh
相关产品推荐
相关产品推荐

