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

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

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

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

环境设置

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

复制代码
pip install Spire.PDF

使用 Python 压缩 PDF 中的图片

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

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

ini 复制代码
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 使用了较多字体,或者嵌入的字体文件本身体积较大,这部分数据也可能占用较多空间。

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

ini 复制代码
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)

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

python 复制代码
options.SetIsUnembedFonts(True)

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

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

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

压缩 PDF 文档内容

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

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

ini 复制代码
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 在经过修改并重新保存时,可以采用增量更新的方式,将新的修改内容追加到原文件末尾,而不是重新写入整个文件。

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

通过将:

ini 复制代码
pdf.FileInfo.IncrementalUpdate = False

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

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

同时压缩图片和字体

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

ini 复制代码
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 应用相同的压缩设置:

ini 复制代码
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 经过多次编辑和保存,还可以关闭增量更新后重新写入文件。

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

相关推荐
java1234_小锋1 小时前
Tornado 6.5,全面支持 Python 3.14
数据库·python·tornado
IT毕设梦工厂1 小时前
计算机毕业设计选题推荐:基于大数据的印度上市公司财务指标数据可视化分析|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·python·信息可视化·spark·课程设计·大数据毕设项目
SEO_juper1 小时前
你的服务器正在被 AI 爬虫“白嫖“带宽:2026 用日志把 Googlebot 和 AI 洪流分开算账(附脚本)
运维·人工智能·爬虫·python·chatgpt·seo
浩风祭月1 小时前
GPT Image 2.5 Sunburst还是Flare?模型选型、Python接入与成本避坑
python·aigc·openai·图像生成·gpt image 2.5
泡干脆面就番茄2 小时前
03_LBPH人脸识别算法原理与实战
python·opencv
Yanjun2i2 小时前
Agent学习记录四:多工具时如何处理
人工智能·python·学习·agent
李少兄2 小时前
Java 中只有值传递吗?
java·开发语言·python
名字还没想好☜2 小时前
Spring @EventListener 事件驱动解耦实战:同步转异步、事务绑定与顺序控制
java·数据库·后端·python·spring
ellenwan20263 小时前
看到“最新 AI 量化学习”时,先让表达变清楚
人工智能·python