如何在C#中压缩PDF

如何使用 IronPDF 在 C# 中压缩 PDF

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronPDF通过CompressAndSaveAs方法在C#中压缩PDF,该方法将嵌入的图像重新编码为JPEG并可选地删除PDF结构树,以便在单次调用中减少文件大小。 伴侣CompressPdfToStream方法在内存中完成相同工作,当您不想触碰磁盘时使用。

图像通常占PDF大小的大部分,而以表格为主的文档则携带一个增加额外重量的结构树。 IronPDF同时针对这两者,因此相同的调用适用于从磁盘加载或<а href="在内存流中" target="_blank">https://ironpdf.com/how-to/pdf-memory-stream/">在内存流中的PDF。

快速入门:使用IronPDF压缩 PDF 文件

使用CompressAndSaveAs重新编码其图像,并在一个步骤中写入精简副本。第二个参数是JPEG质量。

  1. 使用 NuGet 包管理器安装 https://www.nuget.org/packages/IronPdf

    PM > Install-Package IronPdf
  2. 复制并运行这段代码。

    PdfDocument.FromFile("input.pdf").CompressAndSaveAs("compressed.pdf", 40);
  3. 部署到您的生产环境中进行测试

    通过免费试用立即在您的项目中开始使用IronPDF

    arrow pointer


Compress(CompressionOptions)已弃用。

如何压缩 PDF 中的图像?

将JPEG CompressAndSaveAs,IronPDF即以该质量重新编码每个嵌入的图像。 值从0(最大压缩)到100(最小损失),底层引擎决定每个值如何映射到输出。 这是一种在文档携带<а href="嵌入图像" target="_blank">https://ironpdf.com/how-to/add-images-to-pdfs/">嵌入图像</а>时采用的方法。

大致指导:

  • 90及以上:高质量
  • 80至90:中等质量
  • 70至80:低质量

较低的数字压缩更紧,但可能引入可见伪影,并且清晰度下降的程度取决于源图像,因此针对您自己的内容测试几个设置以找到所需的平衡。

输入

:path=/static-assets/pdf/content-code-examples/how-to/pdf-compression-image.cs
using IronPdf;

ChromePdfRenderer renderer = new ChromePdfRenderer();

PdfDocument pdf = renderer.RenderUrlAsPdf("https://en.wikipedia.org/wiki/Main_Page");

// Quality 40 re-encodes every embedded image as a low-quality JPEG, which is
// where most of the file-size saving comes from in image-heavy PDFs
pdf.CompressAndSaveAs("compressed.pdf", 40);
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

Dim pdf As PdfDocument = renderer.RenderUrlAsPdf("https://en.wikipedia.org/wiki/Main_Page")

' Quality 40 re-encodes every embedded image as a low-quality JPEG, which is
' where most of the file-size saving comes from in image-heavy PDFs
pdf.CompressAndSaveAs("compressed.pdf", 40)
$vbLabelText   $csharpLabel

输出

图像压缩会带来哪些结果?

在维基百科渲染中减少了39.24%

显示压缩.pdf (449 KB) 与非压缩.pdf (739 KB) 的文件对比,展示图像压缩结果

如何压缩 PDF 树结构?

CompressAndSaveAs以剥离Chrome Engine写入PDF中的树结构。 在持有大量表格数据的Chrome Engine PDFs上节省最多。 某些渲染引擎不发出这样的结构,这意味着该功能没有东西可移除。

剥离树状结构可能会削弱文本突出和选择功能,因此请将其与大小增益权衡,如果读者以后需要从结果中提取文本和图像

使用此表格数据的PDF测试CompressAndSaveAs和树结构移除。

:path=/static-assets/pdf/content-code-examples/how-to/pdf-compression-tree-structure.cs
using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("table.pdf");

// Pass null quality to skip image compression and true to drop the structure
// tree, which is the bulk of the size in table-heavy Chrome-rendered PDFs
pdf.CompressAndSaveAs("compressedTable.pdf", null, true);
Imports IronPdf

Dim pdf As PdfDocument = PdfDocument.FromFile("table.pdf")

' Pass Nothing quality to skip image compression and True to drop the structure
' tree, which is the bulk of the size in table-heavy Chrome-rendered PDFs
pdf.CompressAndSaveAs("compressedTable.pdf", Nothing, True)
$vbLabelText   $csharpLabel

树形结构压缩可以减少多少文件大小?

减少了67.90%。 该数字随着表格PDF的增长而上升。

显示压缩结果的文件比较 compressedTable.pdf (52 KB) vs table.pdf (162 KB)

如何同时应用两种压缩方法?

提供CompressAndSaveAs调用中同时缩小膨胀的来源。 此配对适用于混合图像和结构化数据的文件,例如带有图表的报告或嵌入表的发票。

:path=/static-assets/pdf/content-code-examples/how-to/pdf-compression-compress.cs
using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("sample.pdf");

// Shrink both sources of bloat in one pass: re-encode images at quality 80
// and strip the structure tree (true) for the largest size reduction
pdf.CompressAndSaveAs("compressed.pdf", 80, true);
Imports IronPdf

Dim pdf As PdfDocument = PdfDocument.FromFile("sample.pdf")

' Shrink both sources of bloat in one pass: re-encode images at quality 80
' and strip the structure tree (True) for the largest size reduction
pdf.CompressAndSaveAs("compressed.pdf", 80, True)
$vbLabelText   $csharpLabel

CompressAndSaveAs接受哪些参数?

  • outputPath(字符串):写入压缩PDF的文件路径。

  • quality(int?,0至100):JPEG质量应用于每个嵌入的图像。 较低的值会产生更小的文件。 传递null以完全跳过图像压缩。

  • true时,剥离PDF结构树以进一步减少文件大小。 对于 HTML 生成的带表格的 PDF 文件最为有效。

让用例来设置拨号。 归档副本通常偏爱质量而不是大小,而网络分发则奖励较小的文件。当您压缩PDF/A兼容文件时,同样适用此权衡,图像保真可能是优先事项。

Icon Quote related to CompressAndSaveAs接受哪些参数?

我最喜欢的这种库是 IronPDF。它允许快速高效地操作 PDF 文件。它还具有许多有价值的功能,比如导出为 PDF/A 格式和数字签名 PDF 文档。

Milan Jovanovic related to CompressAndSaveAs接受哪些参数?

Milan Jovanovic

微软MVP

查看案例研究
Icon Quote related to CompressAndSaveAs接受哪些参数?

IronOCR 意味着我们每年可以节省 $40,000 的人工处理成本,同时提高生产力,并释放资源用于高影响任务。我强烈推荐它。

Brent Matzelle related to CompressAndSaveAs接受哪些参数?

Brent Matzelle

首席技术官,OPYN

查看案例研究
Icon Quote related to CompressAndSaveAs接受哪些参数?

Iron Suite 在我们的运营中起着至关重要的作用。这些工具提高了业务各方面的效率,包括创建平面图和改善库存管理。

David Jones related to CompressAndSaveAs接受哪些参数?

David Jones

首席软件工程师,Agorus Build

查看案例研究

如何获得对压缩的细粒度控制?

对于大多数文档来说,两参数调用已经足够,但图像繁重的档案和严格的大小预算有时需要更多控制。 将CompressAndSaveAs以调整压缩管道,包括图像DPI降采样、JPEG重编码质量和zlib压缩级别。 更简单的CompressAndSaveAs(outputPath, quality, removeStructureTree)重载仍然未变,并生成与以前相同的输出。

using IronPdf;

var pdf = PdfDocument.FromFile("input.pdf");

// Web or email: strong size reduction
pdf.CompressAndSaveAs("compressed.pdf", new AdvancedCompressionOptions
{
    JpegQuality = 70,
    TargetImageDpi = 150,
    RemoveStructureTree = true
});

// Print quality: minimal quality loss
pdf.CompressAndSaveAs("print.pdf", new AdvancedCompressionOptions
{
    JpegQuality = 90,
    TargetImageDpi = 300
});
using IronPdf;

var pdf = PdfDocument.FromFile("input.pdf");

// Web or email: strong size reduction
pdf.CompressAndSaveAs("compressed.pdf", new AdvancedCompressionOptions
{
    JpegQuality = 70,
    TargetImageDpi = 150,
    RemoveStructureTree = true
});

// Print quality: minimal quality loss
pdf.CompressAndSaveAs("print.pdf", new AdvancedCompressionOptions
{
    JpegQuality = 90,
    TargetImageDpi = 300
});
Imports IronPdf

Dim pdf = PdfDocument.FromFile("input.pdf")

' Web or email: strong size reduction
pdf.CompressAndSaveAs("compressed.pdf", New AdvancedCompressionOptions With {
    .JpegQuality = 70,
    .TargetImageDpi = 150,
    .RemoveStructureTree = True
})

' Print quality: minimal quality loss
pdf.CompressAndSaveAs("print.pdf", New AdvancedCompressionOptions With {
    .JpegQuality = 90,
    .TargetImageDpi = 300
})
$vbLabelText   $csharpLabel

最显著的两个属性是TargetImageDpi

  • JpegQuality(int?, 1至100,默认null):按照此JPEG质量重新编码图像。 保持null以完全跳过图像重编码。
  • TargetImageDpi(int?, 默认150):在重新编码之前降低DPI超过此值的图像。 将其设置为0以禁用降采样并保持原始分辨率。

推荐的JpegQuality值(仅在设置时适用):

价值 用例
null(默认) 不进行图像重编码
95 档案,最低伪影
85 高质量
70 平衡,适合一般用途
50 Web或电子邮件,较小的文件但带有可见伪影

推荐的TargetImageDpi值(有损):

价值 用例
300 打印质量,从正常观看距离无损失
200 在高DPI和视网膜屏幕上清晰
150(默认) 屏幕和电子邮件的最佳大小和质量平衡
96 激进,软文本但仍可读
0 禁用,保持原始分辨率

请注意TargetImageDpi 降采样是有损的:一旦图像被降采样,其原始分辨率无法恢复。 预先决定是否要分辨率减少或仅质量重编码,并相应地设置TargetImageDpi

如何在不保存到磁盘的情况下压缩PDF文件?

API响应、云功能和电子邮件附件很少需要磁盘上的压缩PDF。 CompressPdfToBytes 将结果返回为字节数组,因此您可以决定下一步将字节放置在哪里。

:path=/static-assets/pdf/content-code-examples/how-to/pdf-compression-to-bytes.cs
using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("sample.pdf");

// Return the compressed PDF as bytes so it can go straight into an HTTP
// response, a database varbinary column, or a queue message with no temp file
byte[] compressedBytes = pdf.CompressPdfToBytes();

File.WriteAllBytes("compressed.pdf", compressedBytes);
Imports IronPdf

Dim pdf As PdfDocument = PdfDocument.FromFile("sample.pdf")

' Return the compressed PDF as bytes so it can go straight into an HTTP
' response, a database varbinary column, or a queue message with no temp file
Dim compressedBytes As Byte() = pdf.CompressPdfToBytes()

File.WriteAllBytes("compressed.pdf", compressedBytes)
$vbLabelText   $csharpLabel

如果您需要CompressPdfToStream并复制到您的目标。 这适合将输出传输到HTTP响应主体、云存储上传或任何基于流的工作流。

:path=/static-assets/pdf/content-code-examples/how-to/pdf-compression-to-stream.cs
using IronPdf;
using System.IO;

PdfDocument pdf = PdfDocument.FromFile("sample.pdf");

// Stream output so the compressed bytes can be piped straight to an HTTP
// response or cloud upload without first buffering the whole file as byte[]
using Stream compressedStream = pdf.CompressPdfToStream();

// CompressPdfToStream returns a read-only Stream, so copy it to the destination
using FileStream fileStream = File.Create("compressed.pdf");
compressedStream.CopyTo(fileStream);
Imports IronPdf
Imports System.IO

Dim pdf As PdfDocument = PdfDocument.FromFile("sample.pdf")

' Stream output so the compressed bytes can be piped straight to an HTTP
' response or cloud upload without first buffering the whole file as byte()
Using compressedStream As Stream = pdf.CompressPdfToStream()
    ' CompressPdfToStream returns a read-only Stream, so copy it to the destination
    Using fileStream As FileStream = File.Create("compressed.pdf")
        compressedStream.CopyTo(fileStream)
    End Using
End Using
$vbLabelText   $csharpLabel

有哪些Compression模式选项?

Compression模式参数来决定如何完成工作。 目标的部署在是否允许磁盘访问上有所不同,模式让您选择正确的权衡:

模式 磁盘访问 图像重采样 输出大小
Automatic(默认) 尝试磁盘,回落到内存 当磁盘可用时 在允许的地方最小
FastMemory 无ne 更大
HighQuality 需要临时目录 最小

FastMemory。 下面的示例强制HighQuality以获得最小的输出,需要在运行时写访问系统临时目录。

:path=/static-assets/pdf/content-code-examples/how-to/pdf-compression-mode.cs
using IronPdf;

PdfDocument pdf = PdfDocument.FromFile("sample.pdf");

// HighQuality resamples images using the system temp directory, so it produces
// the smallest output but needs write access to that directory at runtime
byte[] compressedBytes = pdf.CompressPdfToBytes(50, false, CompressionMode.HighQuality);

File.WriteAllBytes("compressed.pdf", compressedBytes);
Imports IronPdf

Dim pdf As PdfDocument = PdfDocument.FromFile("sample.pdf")

' HighQuality resamples images using the system temp directory, so it produces
' the smallest output but needs write access to that directory at runtime
Dim compressedBytes As Byte() = pdf.CompressPdfToBytes(50, False, CompressionMode.HighQuality)

File.WriteAllBytes("compressed.pdf", compressedBytes)
$vbLabelText   $csharpLabel

输出

CompressPdfToStream现适用于所有IronPDF平台,包括Java、无de.js和Python。

结论

您现在有一个方法,即Compression模式下的内存中完成相同任务。 接下来的自然步骤是用PDF光栅化将这些瘦身页面转换为缩略图。

常见问题解答

压缩后 PDF 文件的大小能减少多少?

结果因内容而异。在显示的示例中,图像压缩将文件减少了39.24%,而结构树移除将一个表格密集的PDF减少了67.90%。图像密集和表格密集的文档节省最大。

IronPDF 如何在 C# 中压缩 PDF 文件?

IronPDF 通过一个方法——CompressAndSaveAs——来处理压缩。它使用可配置的 JPEG 质量(0–100)来减小嵌入图像的大小,并可通过设置 removeStructureTree: true 来选择性地移除 PDF 的内部结构树,这对表格较多的文档特别有效。

PDF 中的 JPEG 压缩应使用什么质量级别?

IronPDF 支持 1% 到 100% 的 JPEG 压缩质量。推荐级别为90%及以上为高质量,80%-90%为中等质量,70%-80%为低质量。最佳设置取决于文件大小和视觉质量要求之间的平衡。

只用一行代码就能压缩 PDF 吗?

是的,IronPDF 支持通过单行代码实现 PDF 压缩:PdfDocument.FromFile("input.pdf").CompressAndSaveAs("compressed.pdf", 40); 该代码会加载 PDF 文件,以 40% 的质量压缩图片,并保存结果。

压缩是否适用于从 HTML 创建的 PDF?

是的,IronPDF的压缩适用于通过各种方法创建的PDF,包括HTML字符串到PDF转换、URL到PDF转换和HTML文件转换,以及现有的PDF文件。

哪些类型的内容最受益于 PDF 压缩?

图像通常占 PDF 文件大小的绝大部分,因此图像较多的文档是压缩的理想对象。此外,具有复杂表格结构的 PDF 也能从 IronPDF 的结构树压缩功能中受益。

我可以在不将 PDF 保存到磁盘的情况下对其进行压缩吗?

是的,IronPDF 提供了 CompressPdfToBytesCompressPdfToStream 方法,它们分别将压缩后的 PDF 作为字节数组或流返回。这两个方法都接受一个可选的 CompressionMode 参数,支持 Automatic(自动)、FastMemory(快速内存)或 HighQuality(高质量)压缩选项。

PDF 压缩功能是否支持 C# 以外的其他语言?

是的,CompressPdfToBytesCompressPdfToStream 现已支持所有 IronPDF 平台,包括 Java、Node.js 和 Python。

如何在C#中细粒度控制PDF压缩?

传递一个AdvancedCompressionOptions对象给CompressAndSaveAs以调整管道,包括通过TargetImageDpi进行图像DPI降采样,通过JpegQuality进行JPEG重新编码质量调整,以及zlib的CompressionLevel。原来的CompressAndSaveAs(outputPath, quality, removeStructureTree)重载仍然有效,并且产生的输出与以前相同。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

审核者
Jeff Fritz
Jeffrey T. Fritz
首席项目经理 - .NET 社区团队
Jeff 也是 .NET 和 Visual Studio 团队的首席项目经理。他是 .NET Conf 虚拟会议系列的执行制片人,并主持“Fritz and Friends”直播节目,每周两次与观众一起谈论技术并编写代码。Jeff 撰写研讨会、演示文稿并计划包括 Microsoft Build、Microsoft Ignite、.NET Conf 和 Microsoft MVP 峰会在内的最大型微软开发者活动的内容。
准备开始了吗?
Nuget 下载 19,936,792 | 版本: 2026.7 刚刚发布
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package IronPdf
运行示例看着你的HTML代码变成PDF文件。