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

.NET 6 Web API中如何压缩流式接收的PDF文档?

.NET 6 Web API 中压缩PDF文件大小的解决方案

你用GzipStream没效果的核心原因是:PDF文件内部通常已经对图片、字体等资源做了压缩,Gzip作为通用压缩算法,对这类已压缩内容的优化空间极小,甚至可能因为额外的压缩头导致文件体积变大。要有效减小PDF体积,需要用PDF专用的优化工具,以下是两种可行的实现方案:

方案一:使用iText7优化PDF(推荐)

iText7是专业的PDF处理库,能针对性地压缩图片、移除冗余对象、合并重复资源,压缩效果显著。

  1. 安装NuGet包:
Install-Package iText7
Install-Package iText7.pdfoptimizer
  1. 处理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协议,适合对授权有特殊要求的场景。

  1. 安装NuGet包:
Install-Package PdfSharp.LGPLv2.Core
  1. 代码示例:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:20:31