楼主: 听一夜风雨
239 0

[其他] 【原创实现】Python 实现 PDF 批量压缩工具(支持逐个确认 批量处理 多级压缩) [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-12-27
最后登录
2018-12-27

楼主
听一夜风雨 发表于 2025-12-2 20:26:04 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

前言

在日常工作场景中,我们常常会面临 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

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python 批量处理 PDF compression candidates

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-12 23:54