PDF 文件过大,常见原因并不只是页数多。高分辨率图片、扫描页面、嵌入字体以及未充分压缩的文档内容,都可能明显增加文件体积。
当 PDF 需要通过邮件发送、上传到网站或批量存储时,可以根据文件内容选择不同的压缩方式。例如,扫描件通常应优先处理图片,而以文字为主的 PDF 则可以从字体和文档内容入手。
本文介绍如何使用 Python 压缩 PDF 中的图片、字体和文档内容,并给出批量处理多个 PDF 文件的方法。
要运行下面的代码示例,需要先安装 PDF 处理所需的 Python 模块:
pip install Spire.PDF对于扫描件、产品手册、截图文档等 PDF,图片往往占据了大部分文件体积。
这类文件可以通过重新压缩图片并调整图片质量来减小文件大小:
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 使用了较多字体,或者嵌入的字体文件本身体积较大,这部分数据也可能占用较多空间。
可以通过以下代码压缩嵌入字体:
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)如果还希望进一步减小文件大小,也可以取消字体嵌入:
options.SetIsUnembedFonts(True)不过,这种方式需要谨慎使用。
取消字体嵌入后,如果打开 PDF 的设备中没有安装对应字体,阅读器可能会使用其他字体进行替换,从而影响文字的显示效果和页面布局。
因此,对于需要在不同设备之间传阅、打印或者长期保存的 PDF,通常更适合保留字体嵌入,只对字体数据进行压缩。
除了图片和字体,还可以对 PDF 本身的内容进行压缩。
下面的示例关闭增量更新,并将文档压缩级别设置为最高:
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 在经过修改并重新保存时,可以采用增量更新的方式,将新的修改内容追加到原文件末尾,而不是重新写入整个文件。
这种方式有利于保留原有数据,但经过多次编辑和保存后,也可能使文件中保留一些不再需要的数据,从而导致文件体积不断增大。
通过将:
pdf.FileInfo.IncrementalUpdate = False设置为关闭状态,可以在保存时重新写入文档,而不是继续追加增量数据。
这种方式比较适合以文字、矢量图形等内容为主的 PDF。如果文件主要由扫描图片组成,仅设置文档压缩级别通常不会带来明显效果,还需要配合图片压缩。
对于既包含大量图片,又使用了嵌入字体的普通 PDF,可以同时启用图片压缩和字体压缩:
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 应用相同的压缩设置:
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 经过多次编辑和保存,还可以关闭增量更新后重新写入文件。
实际使用时,可以先采用相对保守的压缩设置,再根据输出文件的大小和显示效果逐步调整,在文件体积和文档质量之间取得平衡。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。