首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >使用 Python 压缩 PDF 文件:减小图片、字体和文档内容体积

使用 Python 压缩 PDF 文件:减小图片、字体和文档内容体积

原创
作者头像
用户12416476
发布2026-09-11 16:49:31
发布2026-09-11 16:49:31
200
举报

PDF 文件过大,常见原因并不只是页数多。高分辨率图片、扫描页面、嵌入字体以及未充分压缩的文档内容,都可能明显增加文件体积。

当 PDF 需要通过邮件发送、上传到网站或批量存储时,可以根据文件内容选择不同的压缩方式。例如,扫描件通常应优先处理图片,而以文字为主的 PDF 则可以从字体和文档内容入手。

本文介绍如何使用 Python 压缩 PDF 中的图片、字体和文档内容,并给出批量处理多个 PDF 文件的方法。

环境设置

要运行下面的代码示例,需要先安装 PDF 处理所需的 Python 模块:

代码语言:javascript
复制
pip install Spire.PDF

使用 Python 压缩 PDF 中的图片

对于扫描件、产品手册、截图文档等 PDF,图片往往占据了大部分文件体积。

这类文件可以通过重新压缩图片并调整图片质量来减小文件大小:

代码语言:javascript
复制
from spire.pdf import *

input_file = "input.pdf"
output_file = "compressed_images.pdf"

# 加载 PDF
compressor = PdfCompressor(input_file)

# 获取压缩设置
options = compressor.OptimizationOptions

# 启用图片尺寸调整
options.SetResizeImages(True)

# 启用图片压缩
options.SetIsCompressImage(True)

# 设置图片质量
options.SetImageQuality(ImageQuality.Medium)

# 保存压缩后的 PDF
compressor.CompressToFile(output_file)

其中,​​SetIsCompressImage(True)​​ 用于启用图片压缩,​​SetResizeImages(True)​​ 用于允许调整图片尺寸。

图片质量可以设置为低、中、高三个级别。对于主要用于屏幕查看的 PDF,可以先使用中等质量进行测试。

如果是工程图纸、合同扫描件或者需要放大查看细节的文档,则不建议一开始就使用较低的图片质量,否则可能导致文字、线条或图片细节变得模糊。

压缩 PDF 中的嵌入字体

为了保证 PDF 中的文字能够在不同设备上正常显示,文档通常会将使用的字体嵌入文件。

如果 PDF 使用了较多字体,或者嵌入的字体文件本身体积较大,这部分数据也可能占用较多空间。

可以通过以下代码压缩嵌入字体:

代码语言:javascript
复制
from spire.pdf import *

input_file = "input.pdf"
output_file = "compressed_fonts.pdf"

# 加载 PDF
compressor = PdfCompressor(input_file)

# 获取压缩设置
options = compressor.OptimizationOptions

# 压缩嵌入字体
options.SetIsCompressFonts(True)

# 保存压缩后的 PDF
compressor.CompressToFile(output_file)

如果还希望进一步减小文件大小,也可以取消字体嵌入:

代码语言:javascript
复制
options.SetIsUnembedFonts(True)

不过,这种方式需要谨慎使用。

取消字体嵌入后,如果打开 PDF 的设备中没有安装对应字体,阅读器可能会使用其他字体进行替换,从而影响文字的显示效果和页面布局。

因此,对于需要在不同设备之间传阅、打印或者长期保存的 PDF,通常更适合保留字体嵌入,只对字体数据进行压缩。

压缩 PDF 文档内容

除了图片和字体,还可以对 PDF 本身的内容进行压缩。

下面的示例关闭增量更新,并将文档压缩级别设置为最高:

代码语言:javascript
复制
from spire.pdf import *

input_file = "input.pdf"
output_file = "compressed.pdf"

# 加载 PDF
pdf = PdfDocument()
pdf.LoadFromFile(input_file)

# 关闭增量更新
pdf.FileInfo.IncrementalUpdate = False

# 设置文档压缩级别
pdf.CompressionLevel = PdfCompressionLevel.Best

# 保存压缩后的 PDF
pdf.SaveToFile(output_file)

pdf.Close()

这里需要特别注意增量更新。

PDF 在经过修改并重新保存时,可以采用增量更新的方式,将新的修改内容追加到原文件末尾,而不是重新写入整个文件。

这种方式有利于保留原有数据,但经过多次编辑和保存后,也可能使文件中保留一些不再需要的数据,从而导致文件体积不断增大。

通过将:

代码语言:javascript
复制
pdf.FileInfo.IncrementalUpdate = False

设置为关闭状态,可以在保存时重新写入文档,而不是继续追加增量数据。

这种方式比较适合以文字、矢量图形等内容为主的 PDF。如果文件主要由扫描图片组成,仅设置文档压缩级别通常不会带来明显效果,还需要配合图片压缩。

同时压缩图片和字体

对于既包含大量图片,又使用了嵌入字体的普通 PDF,可以同时启用图片压缩和字体压缩:

代码语言:javascript
复制
from spire.pdf import *

input_file = "input.pdf"
output_file = "compressed.pdf"

# 加载 PDF
compressor = PdfCompressor(input_file)

# 获取压缩设置
options = compressor.OptimizationOptions

# 压缩图片
options.SetResizeImages(True)
options.SetIsCompressImage(True)
options.SetImageQuality(ImageQuality.Medium)

# 压缩字体
options.SetIsCompressFonts(True)

# 保存压缩后的 PDF
compressor.CompressToFile(output_file)

这种方式不会取消字体嵌入,因此比较适合一般文档。

对于图片较多的 PDF,可以分别尝试不同的图片质量级别,然后比较压缩后的文件大小和实际显示效果,再选择适合当前使用场景的参数。

批量压缩多个 PDF 文件

如果需要处理大量 PDF,可以遍历指定文件夹,并对其中的每个 PDF 应用相同的压缩设置:

代码语言:javascript
复制
import os
from spire.pdf import *

input_folder = "PDFs"
output_folder = "Compressed"

os.makedirs(output_folder, exist_ok=True)

for file_name in os.listdir(input_folder):

    if not file_name.lower().endswith(".pdf"):
        continue

    input_file = os.path.join(input_folder, file_name)
    output_file = os.path.join(output_folder, file_name)

    # 加载 PDF
    compressor = PdfCompressor(input_file)

    # 获取压缩设置
    options = compressor.OptimizationOptions

    # 压缩图片
    options.SetResizeImages(True)
    options.SetIsCompressImage(True)
    options.SetImageQuality(ImageQuality.Medium)

    # 压缩字体
    options.SetIsCompressFonts(True)

    # 保存压缩后的 PDF
    compressor.CompressToFile(output_file)

    print(f"已压缩:{file_name}")

这种方式适合历史文件整理、上传前统一处理或者后台批量文档处理。

为什么有些 PDF 压缩后变化不明显

PDF 的实际压缩效果与原始文件内容有很大关系。

例如,如果文档中的图片本身已经经过较高程度的压缩,那么再次压缩能够减少的空间就会比较有限。

同样,如果 PDF 主要包含简单文字,而且字体、图片和页面内容已经经过优化,重新压缩后的文件大小也可能变化不大。

可以根据不同类型的 PDF 选择处理方式:

PDF 类型

建议优先处理

扫描件

图片压缩

包含大量截图或照片

图片压缩和尺寸调整

以文字为主的报告

文档内容和字体压缩

使用较多嵌入字体

字体压缩

多次编辑和保存的 PDF

关闭增量更新后重新保存

同时包含文字、图片和字体

组合使用多种压缩方式

压缩完成后,除了比较文件大小,还应该实际打开输出文件,检查文字、图片和页面布局是否正常。

尤其是在降低图片质量或者取消字体嵌入时,不能只以文件大小作为判断标准。

总结

对于扫描件和图片较多的 PDF,可以优先压缩图片和调整图片尺寸;对于以文字为主的文档,可以压缩字体和文档内容;如果 PDF 经过多次编辑和保存,还可以关闭增量更新后重新写入文件。

实际使用时,可以先采用相对保守的压缩设置,再根据输出文件的大小和显示效果逐步调整,在文件体积和文档质量之间取得平衡。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 环境设置
  • 使用 Python 压缩 PDF 中的图片
  • 压缩 PDF 中的嵌入字体
  • 压缩 PDF 文档内容
  • 同时压缩图片和字体
  • 批量压缩多个 PDF 文件
  • 为什么有些 PDF 压缩后变化不明显
  • 总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档