PDF文件太大的几种压缩方法:从在线工具到Python脚本
在日常工作中,PDF 文件体积过大是一个非常常见的问题。一份几十页的扫描合同动辄几十 MB,不仅占用存储空间,通过邮件发送也会因为附件大小限制被退回。本文将整理几种主流的 PDF 压缩方案,覆盖不同使用场景,供你按需选择。
一、什么时候需要压缩PDF文件?
先看几个典型场景,看看你是否也遇到过:
- 邮件发送被退回:邮箱附件限制通常在 10MB-25MB 之间,大文件无法直接发送
- 存储空间不足:大量扫描件或高清报告占用本地磁盘或云盘空间
- 上传平台受限:一些系统对上传文件大小有明确限制(如 5MB、20MB)
- 文档传输速度慢:大文件在网盘同步或即时通讯中传输耗时过长
- 减少流量消耗:将 PDF 嵌入网页或分享给移动端用户时,小文件加载更快
核心思路:在不影响可读性的前提下,尽可能减小文件体积。不同场景对画质的要求不同,需要灵活选择压缩强度。
二、方法一:在线压缩工具(无需安装、即用即走)
在线工具适合偶尔使用、或办公电脑没有安装专业软件的情况。
以91aitool的"PDF压缩"功能为例,操作流程如下:
支持格式
输入仅支持.pdf格式,输出为压缩后的 PDF 文件。单文件最大支持300MB。
压缩模式
该工具提供两种压缩模式,对应不同的场景:
| 压缩模式 | 适用场景 | 特点 |
|---|---|---|
| 文档压缩(保持清晰) | 文字型 PDF、合同、报告 | 保留文字清晰度,压缩比适中 |
| 扫描件压缩(高压缩比) | 扫描仪生成的图片型 PDF | 压缩比更高,适合图片为主的文档 |
压缩强度
每种模式下还有 4 档强度可选:
| 档位 | 名称 | 效果预期 |
|---|---|---|
| 0 | 轻度压缩 | 画质几乎无损,体积减小有限 |
| 1 | 推荐压缩(默认) | 画质与体积的平衡点 |
| 2 | 重度压缩 | 体积明显减小,画质有一定损失 |
| 3 | 极度压缩 | 体积最小化,适合对画质要求低的场景 |
具体步骤
- 打开工具页面,点击上传区域选择 PDF 文件,或将文件拖拽到上传区
- 在参数面板中选择"压缩模式"(文档压缩 / 扫描件压缩)
- 选择"压缩强度"(推荐从默认的"推荐压缩"开始尝试)
- 点击"开始转换",按提示完成微信扫码登录
- 等待服务端处理完成,下载压缩后的文件
注意事项
- 需要微信扫码登录后才能使用
- 单次处理一个文件,没有批量上传功能
- 服务端转换完成后自动删除原文件,不留缓存
- 适合偶尔使用,或文件非常大(近百 MB)需要服务端处理的情况
三、方法二:Adobe Acrobat Pro 内置压缩功能
如果你已经安装了 Adobe Acrobat Pro(非免费的 Reader 版),可以方便地直接压缩 PDF,不需要联网。
操作步骤
- 用 Adobe Acrobat Pro 打开需要压缩的 PDF 文件
- 点击顶部菜单"文件" → "另存为其它" → "缩小大小的 PDF"
- 选择与 Reader 版本的兼容性(越高版本兼容性越小,但压缩效果越好)
- 点击"确定",保存压缩后的文件
另一种方式:PDF 优化器
如果需要对压缩参数做更精细的控制,可以使用"PDF 优化器":
- "工具" → "优化 PDF"(或在右侧工具栏中直接找到)
- 在弹出的对话框中,可以对以下维度分别设置:
- 图像:设置彩色/灰度/黑白图像的分辨率和压缩质量
- 字体:卸载未使用的字体
- 透明度:拼合透明效果
- 舍弃对象:删除隐藏图层、引用的附件等
- 清理:移除元数据、书签、链接等
这种方式的优点是控制粒度很细,缺点是操作步骤较多,需要一定的专业知识来判断哪些可以舍弃。
优缺点
| 优点 | 缺点 |
|---|---|
| 离线使用,文件不上传服务器 | 需要付费购买 Acrobat Pro |
| 压缩参数可控,精细调节 | 操作流程相对复杂 |
| 适合处理涉密文件 | 仅 Windows/Mac 可用 |
四、方法三:Python 脚本批量压缩(适合自动化处理)
如果你需要定期压缩大量 PDF,或者想要嵌入到自动化流程中,Python 脚本是最高效的选择。
方案 A:使用 Ghostscript(压缩效果好)
Ghostscript 是 PDF/RGB 后处理的事实标准,压缩质量稳定:
import subprocess import os def compress_pdf_gs(input_path, output_path, quality='ebook'): """ 使用 Ghostscript 压缩 PDF quality 可选值: - screen: 屏幕版(最低质量,最小体积) - ebook: 电子书版(中等质量,推荐) - printer: 打印版(高质量,体积较大) - prepress: 印刷版(最高质量,体积最大) """ gs_command = [ 'gswin64c', # Windows 下使用 gswin64c,Linux/Mac 使用 gs '-sDEVICE=pdfwrite', '-dCompatibilityLevel=1.4', f'-dPDFSETTINGS=/{quality}', '-dNOPAUSE', '-dQUIET', '-dBATCH', f'-sOutputFile={output_path}', input_path ] subprocess.run(gs_command, check=True) original_size = os.path.getsize(input_path) / 1024 compressed_size = os.path.getsize(output_path) / 1024 ratio = (1 - compressed_size / original_size) * 100 print(f"压缩完成:{original_size:.0f}KB → {compressed_size:.0f}KB,减小 {ratio:.1f}%") # 使用示例 compress_pdf_gs('report.pdf', 'report_compressed.pdf', quality='ebook')注意:使用此脚本需要先安装 Ghostscript(官方下载),并确保gswin64c(Windows)或gs(Linux/Mac)在系统 PATH 中。
方案 B:使用 PyMuPDF (fitz) 提取+重压缩
如果不想依赖外部工具,也可以直接用 PyMuPDF 库:
pip install PyMuPDFimport fitz # PyMuPDF def compress_pdf_pymupdf(input_path, output_path, zoom=2): """ 通过降低图像分辨率来压缩 PDF zoom 值越大,图像分辨率越高,文件越大 建议值:1.0(最大压缩)~ 2.0(适中)~ 3.0(高质量) """ doc = fitz.open(input_path) new_doc = fitz.open() for page_num in range(len(doc)): page = doc[page_num] # 将页面渲染为图像,再插入新文档(会丢失文字可选中能力) pix = page.get_pixmap(matrix=fitz.Matrix(zoom, zoom)) img_bytes = pix.tobytes("jpeg") new_page = new_doc.new_page(width=page.rect.width, height=page.rect.height) new_page.insert_image(new_page.rect, stream=img_bytes) new_doc.save(output_path, garbage=4, deflate=True, clean=True) new_doc.close() doc.close() original = os.path.getsize(input_path) / 1024 compressed = os.path.getsize(output_path) / 1024 print(f"{original:.0f}KB → {compressed:.0f}KB,减小 {(1-compressed/original)*100:.1f}%") # 使用示例 compress_pdf_pymupdf('scan.pdf', 'scan_small.pdf', zoom=1.5)注意:PyMuPDF 方式会将 PDF 页面渲染为 JPEG 图像再重新打包,会丢失文字的可选中能力,适合扫描件和图片型 PDF,不适合文字型文档。
方案 C:脚本自动化处理文件夹
如果需要对整个文件夹下的 PDF 批量处理:
import os import subprocess from pathlib import Path def batch_compress(input_dir, output_dir, quality='ebook'): """批量压缩文件夹中的所有 PDF""" Path(output_dir).mkdir(parents=True, exist_ok=True) pdf_files = [f for f in os.listdir(input_dir) if f.lower().endswith('.pdf')] for i, filename in enumerate(pdf_files, 1): input_path = os.path.join(input_dir, filename) output_path = os.path.join(output_dir, f'compressed_{filename}') print(f"[{i}/{len(pdf_files)}] 正在处理: {filename}") subprocess.run([ 'gswin64c', '-sDEVICE=pdfwrite', '-dCompatibilityLevel=1.4', f'-dPDFSETTINGS=/{quality}', '-dNOPAUSE', '-dQUIET', '-dBATCH', f'-sOutputFile={output_path}', input_path ], check=True) batch_compress('./raw_pdfs', './compressed_pdfs', quality='ebook')五、方案对比总结
| 对比维度 | 在线压缩工具 | Adobe Acrobat Pro | Python + Ghostscript |
|---|---|---|---|
| 安装要求 | 无需安装 | 需付费购买 | 需安装 Python + Ghostscript |
| 操作系统 | 全平台(浏览器) | Windows / Mac | Windows / Mac / Linux |
| 离线可用 | 需联网 | 支持离线 | 支持离线 |
| 单文件大小 | 最大 300MB | 不限 | 不限 |
| 批量处理 | 不支持 | 支持(动作脚本) | 支持(脚本批量) |
| 压缩参数控制 | 4 档预设 | 精细调节 | 通过参数调节 |
| 文件安全 | 服务端处理后自动删除 | 本地处理 | 本地处理 |
| 学习成本 | 低 | 中 | 较高 |
| 适合频次 | 偶尔使用 | 日常使用 | 大批量/自动化 |
场景推荐
- 临时压缩一个文件发邮件→ 在线工具,打开网页即可操作
- 涉密文件不能上传→ Adobe Acrobat Pro 或脚本本地处理
- 每天需要压缩几十个 PDF→ Python + Ghostscript 脚本自动处理
- 对压缩质量要求极高→ Adobe Acrobat Pro 精细调节
- 电脑上没有任何软件也不想装→ 在线工具
六、总结
PDF 压缩并不是一个高深的问题,关键在于找到适合自己场景的工具。偶尔用一次,打开在线网页拖拽上传就行;经常需要压缩,考虑 Pro 版软件;量大到需要批量处理,花 10 分钟配置一套脚本能省下大量重复劳动。
另外分享几个减小 PDF 体积的实用技巧,不需要压缩也能从源头控制文件大小:
- 导出时选择低分辨率:从 Word/WPS/PPT 导出 PDF 时,在导出设置中选择"最小文件大小"
- 扫描时降低 DPI:扫描文档使用 200-300 DPI 就足够清晰,不需要 600 DPI
- 删除不必要的页面:合并前的草稿页、空白页会增加不必要的体积
- 图片提前压缩:嵌入 PDF 的图片先压缩到合适大小再插入
本文提到的在线工具仅为方法示例,请根据实际需求选择适合的方案。
