PDF文件太大的几种压缩方法:从在线工具到Python脚本

📅 2026/7/9 16:55:33 👁️ 阅读次数 📝 编程学习
PDF文件太大的几种压缩方法:从在线工具到Python脚本

在日常工作中,PDF 文件体积过大是一个非常常见的问题。一份几十页的扫描合同动辄几十 MB,不仅占用存储空间,通过邮件发送也会因为附件大小限制被退回。本文将整理几种主流的 PDF 压缩方案,覆盖不同使用场景,供你按需选择。


一、什么时候需要压缩PDF文件?

先看几个典型场景,看看你是否也遇到过:

  • 邮件发送被退回:邮箱附件限制通常在 10MB-25MB 之间,大文件无法直接发送
  • 存储空间不足:大量扫描件或高清报告占用本地磁盘或云盘空间
  • 上传平台受限:一些系统对上传文件大小有明确限制(如 5MB、20MB)
  • 文档传输速度慢:大文件在网盘同步或即时通讯中传输耗时过长
  • 减少流量消耗:将 PDF 嵌入网页或分享给移动端用户时,小文件加载更快

核心思路:在不影响可读性的前提下,尽可能减小文件体积。不同场景对画质的要求不同,需要灵活选择压缩强度。


二、方法一:在线压缩工具(无需安装、即用即走)

在线工具适合偶尔使用、或办公电脑没有安装专业软件的情况。

91aitool的"PDF压缩"功能为例,操作流程如下:

支持格式

输入仅支持.pdf格式,输出为压缩后的 PDF 文件。单文件最大支持300MB

压缩模式

该工具提供两种压缩模式,对应不同的场景:

压缩模式适用场景特点
文档压缩(保持清晰)文字型 PDF、合同、报告保留文字清晰度,压缩比适中
扫描件压缩(高压缩比)扫描仪生成的图片型 PDF压缩比更高,适合图片为主的文档

压缩强度

每种模式下还有 4 档强度可选:

档位名称效果预期
0轻度压缩画质几乎无损,体积减小有限
1推荐压缩(默认)画质与体积的平衡点
2重度压缩体积明显减小,画质有一定损失
3极度压缩体积最小化,适合对画质要求低的场景

具体步骤

  1. 打开工具页面,点击上传区域选择 PDF 文件,或将文件拖拽到上传区
  2. 在参数面板中选择"压缩模式"(文档压缩 / 扫描件压缩)
  3. 选择"压缩强度"(推荐从默认的"推荐压缩"开始尝试)
  4. 点击"开始转换",按提示完成微信扫码登录
  5. 等待服务端处理完成,下载压缩后的文件

注意事项

  • 需要微信扫码登录后才能使用
  • 单次处理一个文件,没有批量上传功能
  • 服务端转换完成后自动删除原文件,不留缓存
  • 适合偶尔使用,或文件非常大(近百 MB)需要服务端处理的情况

三、方法二:Adobe Acrobat Pro 内置压缩功能

如果你已经安装了 Adobe Acrobat Pro(非免费的 Reader 版),可以方便地直接压缩 PDF,不需要联网。

操作步骤

  1. 用 Adobe Acrobat Pro 打开需要压缩的 PDF 文件
  2. 点击顶部菜单"文件" → "另存为其它" → "缩小大小的 PDF"
  3. 选择与 Reader 版本的兼容性(越高版本兼容性越小,但压缩效果越好)
  4. 点击"确定",保存压缩后的文件

另一种方式:PDF 优化器

如果需要对压缩参数做更精细的控制,可以使用"PDF 优化器":

  1. "工具" → "优化 PDF"(或在右侧工具栏中直接找到)
  2. 在弹出的对话框中,可以对以下维度分别设置:
    • 图像:设置彩色/灰度/黑白图像的分辨率和压缩质量
    • 字体:卸载未使用的字体
    • 透明度:拼合透明效果
    • 舍弃对象:删除隐藏图层、引用的附件等
    • 清理:移除元数据、书签、链接等

这种方式的优点是控制粒度很细,缺点是操作步骤较多,需要一定的专业知识来判断哪些可以舍弃。

优缺点

优点缺点
离线使用,文件不上传服务器需要付费购买 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 PyMuPDF
import 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 ProPython + Ghostscript
安装要求无需安装需付费购买需安装 Python + Ghostscript
操作系统全平台(浏览器)Windows / MacWindows / 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 的图片先压缩到合适大小再插入

本文提到的在线工具仅为方法示例,请根据实际需求选择适合的方案。