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

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

相关推荐
cc_瀚海知行2 小时前
工具调用 6|助手什么时候该停下来?
java·服务器·前端·人工智能·python·ai
溪语流沙2 小时前
【Web全栈进阶】Nginx反向代理 + HTTPS:正式上线
前端·vue.js·python·nginx·https·fastapi
全栈弄潮儿2 小时前
Python实战第11期:面向对象编程基础
后端·python·编程语言
估值探索者2 小时前
【Python量化技术指标实战 02】MACD金叉也分强弱?手工算一次 DIF/DEA 就懂了
java·开发语言·python·股票数据·股票数据api接口
魔都吴所谓3 小时前
【我的开源】Python实现一个离线 PDF 工具箱:架构、骑缝章与踩坑记录
python·pdf·开源
用户0332126663673 小时前
Python 自动化办公:如何轻松在 PDF 中导入与导出表单数据
python
MoRanzhi12033 小时前
第5篇(上)· 使用 PyQt5 实现 2048 算法求解版:五类搜索算法内核
python·启发式算法·强化学习·搜索算法·蒙特卡洛树搜索·2048游戏·expectimax
星川皆无恙3 小时前
基于知识图谱的百科问答系统:Django + Neo4j 与实现
人工智能·python·机器学习·自然语言处理·django·知识图谱·neo4j
qq_448011163 小时前
EXEC字典沙箱仅是名字空间隔离,模块和解释器仍共享带来的坑
python
打工仔折腾 AI3 小时前
介入式脑机接口的跨尺度解码与闭环调控:从算法落地到后端工程实践
人工智能·后端·python·深度学习·算法·ai agent 实战