前言
在日常工作场景中,我们常常会面临 PDF 文件体积过大,导致难以传输或上传的困扰。虽然网络上存在大量 PDF 压缩工具,但普遍存在以下问题:
- 部分工具需要付费使用
- 对文件大小设置限制
- 必须将文件上传至第三方服务器,存在隐私泄露风险
为解决上述痛点,借助 Python 与 Ghostscript,我们可以自行开发一个完全本地运行的 PDF 压缩工具,无需联网、安全可控。
本文提供一个完整且可直接执行的脚本,具备以下核心功能:
- 支持单个 PDF 文件压缩
- 支持批量处理指定目录下的多个文件(可逐项确认)
- 提供多种压缩质量选项,满足不同用途需求
- 自动检测系统中是否安装 Ghostscript
- 压缩完成后输出结果汇总信息
该脚本实用性强,适合长期收藏并作为日常办公辅助工具使用。
功能特性说明
1. 四种压缩等级可选
根据使用场景的不同,用户可自由选择以下四种压缩模式:
/screen
/screen:最低画质,适用于屏幕浏览,生成最小体积的文件。
/ebook
/ebook:推荐选项,在文件大小与视觉质量之间取得良好平衡,适合电子阅读。
/printer
/printer:适用于普通打印需求,分辨率达 300dpi,保证输出清晰度。
/prepress
/prepress:最高保真模式,适用于专业印刷场景,保留最完整的图像细节。
2. 支持两种输入方式
程序提供灵活的输入路径选择机制:
- 手动输入具体文件路径 → 实现单个 PDF 的精准压缩
- 直接按回车键跳过输入 → 自动进入批量处理模式,扫描预设目录中的所有 PDF 文件
output_pdfs
3. 批量处理时支持逐项确认
在批量压缩过程中,每个文件都会弹出交互提示,允许用户做出独立决策:
y 执行当前文件的压缩操作
n 跳过当前文件,不进行处理
a 对后续所有文件统一执行压缩,不再逐一询问
q 立即终止程序,退出处理流程
4. 自动识别 Ghostscript 环境
脚本兼容主流操作系统平台,包括 Windows、macOS 和 Linux,并能自动查找系统中已安装的 Ghostscript 可执行命令,确保调用无误。
完整程序代码(可直接运行)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import subprocess
import sys
import platform
import shutil
# ===== 配置参数区域 =====
BATCH_INPUT_DIR = "output_pdfs" # 批量模式下默认扫描的文件夹
output_dir = "pdf_output" # 压缩后文件的输出目录
# 定义可用的压缩等级及其描述
COMPRESSION_LEVELS = {
"1": ("/screen", "屏幕查看 (72dpi, 最小文件)"),
"2": ("/ebook", "电子书 (150dpi, 平衡质量)"),
"3": ("/printer", "打印 (300dpi, 高质量)"),
"4": ("/prepress", "印刷 (300dpi+, 最高保真)")
}
DEFAULT_LEVEL = "2"
# ===== 用户选择压缩等级 =====
def select_compression_level():
print("\n请选择压缩等级:")
for k, (_, desc) in COMPRESSION_LEVELS.items():
print(f" {k}. {desc}")
print(f"默认: {COMPRESSION_LEVELS[DEFAULT_LEVEL][1]}")
while True:
choice = input(f"\n请输入编号 (1-4) [回车默认 {DEFAULT_LEVEL}]: ").strip()
if not choice:
choice = DEFAULT_LEVEL
if choice in COMPRESSION_LEVELS:
level, desc = COMPRESSION_LEVELS[choice]
print(f"\n已选择: {desc}")
return level
print("无效输入,请输入 1-4")
# ===== 检测系统中 Ghostscript 是否可用 =====
def find_gs_command():
system = platform.system()
# 根据操作系统设定可能的命令名称
candidates = ["gs"] if system != "Windows" else ["gswin64c", "gswin32c", "gs"]
for cmd in candidates:
if shutil.which(cmd):
return cmd
return None
# 查找并验证 gs 命令
gs_cmd = find_gs_command()
if not gs_cmd:
print("未找到 Ghostscript!")
print("\n请先安装:")
if platform.system() == "Windows":
print(" 下载:https://www.ghostscript.com/download/gsdnld.html")
elif platform.system() == "Darwin":
print(" brew install ghostscript")
else:
print(" sudo apt install ghostscript")
sys.exit(1)
print(f"使用 Ghostscript: `{gs_cmd}`")
# ===== 输入模式选择:单文件 or 批量处理 =====
print("\n" + "="*60)
PDF 压缩工具 - 手动确认处理流程
============================================================
请提供需要压缩的 PDF 文件路径,或直接按回车键以扫描默认目录。
输入路径(若为空则扫描 `{BATCH_INPUT_DIR}`):
/screen
系统将根据输入判断处理模式:
- 若提供了具体文件路径,则进入单文件处理模式;
- 若未提供路径,则检查默认目录是否存在,并读取其中所有 PDF 文件进行批量操作。
当指定路径非有效文件时,程序提示“文件不存在”并终止;
仅接受以 .pdf 结尾的文件格式,其他类型将被拒绝处理。
在批量模式下,系统会自动筛选出 `{BATCH_INPUT_DIR}` 目录中所有有效的 PDF 文件。
若该目录内无任何 PDF 文件,程序将提示后退出。
当前已检测到 {len(pdf_files)} 个待处理文件,进入批量处理准备阶段。
/ebook
接下来请选择压缩质量等级:
支持多种预设级别,影响输出文件大小与清晰度平衡。
输出目录将自动创建,路径为:{output_dir},已存在则跳过创建步骤。
------------------------------------------------------------
开始逐项确认处理(可选操作:y=压缩,n=跳过,a=全部压缩,q=退出流程)
------------------------------------------------------------
处理进度显示如下:
第 [{idx}/{len(pdf_files)}] 项:是否压缩 '{filename}'?
用户需输入有效指令:
- y:执行当前文件压缩;
- n:跳过当前文件;
- a:后续所有文件自动压缩,无需再确认;
- q:立即终止整个流程。
无效输入将提示重新键入,直到获得合法选项为止。
若选择 'q',程序输出“用户退出”信息并结束;
若选择 'n',记录跳过状态,并加入 skipped 列表;
若选择 'a',启用全自动模式,剩余文件不再询问,直接处理。
压缩命令通过 Ghostscript 调用执行,参数配置如下:
gs -sDEVICE=pdfwrite \
-dCompatibilityLevel=1.4 \
-dPDFSETTINGS={compression_level} \
-dNOPAUSE -dQUIET -dBATCH \
-sOutputFile={output_path} \
{input_path}
执行过程中实时反馈状态:
- 成功:显示“压缩中: 文件名 ... 完成”;
- 失败:标记“失败”,并记录至 failed 列表;
- 异常:捕获错误详情,打印错误信息并归类为失败。
/printer
全部任务完成后,生成最终统计报告:
总计处理文件数:{total}
成功压缩:{len(compressed)} 个
跳过处理:{len(skipped)} 个
处理失败:{len(failed)} 个
流程结束。
done = len(compressed) + len(skipped) + len(failed)
print("\n" + "="*60)
print("压缩总结")
print(f" 总文件: {total}")
print(f" 已压缩: {len(compressed)}")
print(f" 已跳过: {len(skipped)}")
print(f" 失败: {len(failed)}")
if failed:
print(f" 失败文件: {', '.join(failed)}")
if skipped:
print(f" 跳过文件: {', '.join(skipped[:10])}{'...' if len(skipped)>10 else ''}")
print(f" 输出目录: {os.path.abspath(output_dir)}")
print("="*60)
???? 总结
这是一个功能强大且实用的 Python 脚本工具,具备以下特点:
- 完全本地运行,保障数据安全
- 无需额外依赖,仅需安装 Ghostscript
- 支持单个文件及批量处理模式
- 提供交互式操作选项,使用更灵活
???? 使用效果示例
(把你运行时的终端截图放到这里)? 常见问题
Q1:压缩后图片模糊怎么办?
可尝试调整压缩参数以提升输出质量。推荐使用以下设置之一:
/printer
或
/prepress
3. 打印模式(300dpi)
4. 印刷模式(最高质量)
???? 安装 Ghostscript(必须)
Windows
前往官网下载安装包:
https://www.ghostscript.com/download/gsdnld.html
macOS
使用 Homebrew 执行安装命令:
brew install ghostscript
Linux
通过 APT 包管理器进行安装:
sudo apt install ghostscript


雷达卡


京公网安备 11010802022788号







