如何使用 IronPDF 在 C# 中压缩 PDF
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质量。
最小化工作流程(三步)
- 从 NuGet 下载用于 PDF 压缩的 C# 库。
- 导入现有PDF或渲染新的PDF
- 调用
CompressAndSaveAs(outputPath, quality, removeStructureTree)来压缩图像,可选择剥离结构树,并保存结果
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)
输出
图像压缩会带来哪些结果?
在维基百科渲染中减少了39.24%。
如何压缩 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)
树形结构压缩可以减少多少文件大小?
减少了67.90%。 该数字随着表格PDF的增长而上升。
如何同时应用两种压缩方法?
提供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)
CompressAndSaveAs接受哪些参数?
-
outputPath(字符串):写入压缩PDF的文件路径。 -
quality(int?,0至100):JPEG质量应用于每个嵌入的图像。 较低的值会产生更小的文件。 传递null以完全跳过图像压缩。 true时,剥离PDF结构树以进一步减少文件大小。 对于 HTML 生成的带表格的 PDF 文件最为有效。
让用例来设置拨号。 归档副本通常偏爱质量而不是大小,而网络分发则奖励较小的文件。当您压缩PDF/A兼容文件时,同样适用此权衡,图像保真可能是优先事项。
如何获得对压缩的细粒度控制?
对于大多数文档来说,两参数调用已经足够,但图像繁重的档案和严格的大小预算有时需要更多控制。 将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
})
最显著的两个属性是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)
如果您需要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
有哪些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)
输出
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 提供了 CompressPdfToBytes 和 CompressPdfToStream 方法,它们分别将压缩后的 PDF 作为字节数组或流返回。这两个方法都接受一个可选的 CompressionMode 参数,支持 Automatic(自动)、FastMemory(快速内存)或 HighQuality(高质量)压缩选项。
PDF 压缩功能是否支持 C# 以外的其他语言?
是的,CompressPdfToBytes 和 CompressPdfToStream 现已支持所有 IronPDF 平台,包括 Java、Node.js 和 Python。
如何在C#中细粒度控制PDF压缩?
传递一个AdvancedCompressionOptions对象给CompressAndSaveAs以调整管道,包括通过TargetImageDpi进行图像DPI降采样,通过JpegQuality进行JPEG重新编码质量调整,以及zlib的CompressionLevel。原来的CompressAndSaveAs(outputPath, quality, removeStructureTree)重载仍然有效,并且产生的输出与以前相同。

