工具与效率

用 Ghostscript 压缩与合并 PDF:参数设置、批量脚本与画质检查

Ghostscript 适合用命令行压缩扫描件、合并多个 PDF,并把重复的文件处理流程放进批量脚本,适用于材料归档、提交文件整理和服务端自动化。它会重新生成 PDF,因此压缩率、画质以及书签、表单等内容都可能发生变化;请保留原件,并先用少量文件验证结果。

扫描文件经命令行压缩、合并并整理归档的示意图

安装与准备

先安装 Ghostscript,并确认命令行能找到它。不同系统的安装包和命令名称可能不同:

  • Windows:安装 Ghostscript 后,在命令提示符或 PowerShell 中试运行 gswin64c。如果提示找不到命令,可把 Ghostscript 的 bin 目录加入系统 PATH,或在脚本中使用可执行文件的完整路径。
  • macOS、Linux:通过系统软件包管理器安装后,通常使用 gs 命令。可运行 gs --version 检查是否能调用。

处理前建议按“原件、待处理、输出”分开存放,例如:

纯文本
pdf-work/
├── input/       # 原始 PDF,只读保留
├── output/      # 压缩结果或合并结果
└── scripts/     # 批处理脚本

给输出文件使用新文件名,避免覆盖输入文件。若文件包含个人信息、签名或敏感材料,也要确认运行环境和输出目录符合你的存储要求。

用命令压缩 PDF

最直接的做法是使用 Ghostscript 的 pdfwrite 设备重新生成 PDF,并选择压缩预设:

纯文本
gs -sDEVICE=pdfwrite 
  -dCompatibilityLevel=1.4 
  -dPDFSETTINGS=/ebook 
  -dNOPAUSE -dQUIET -dBATCH 
  -sOutputFile=output/compressed.pdf 
  input/document.pdf

Windows 命令提示符通常把 gs 替换为 gswin64c;如果是在 PowerShell 中运行,也可以使用相同参数形式。

这几个参数决定了主要处理行为:

  • -sDEVICE=pdfwrite:将输出设备设为 PDF 写入器,生成新的 PDF。
  • -dCompatibilityLevel=1.4:设置输出 PDF 的兼容版本。若接收方规定了版本要求,应按其要求调整。
  • -dPDFSETTINGS=/ebook:选择一组默认的压缩和图像处理设置。常见预设包括 /screen、/ebook、/printer 和 /prepress。通常压缩越积极,图像细节损失风险越高;预设名称不能代替实际验收。
  • -dNOPAUSE:处理页面时不逐页暂停。
  • -dQUIET:减少常规输出信息,排错时可先移除它。
  • -dBATCH:处理结束后退出。
  • -sOutputFile=...:指定输出文件路径。
  • 最后的 input/document.pdf:输入文件路径。

如果希望控制图像下采样,可以不使用 -dPDFSETTINGS,改为明确指定图像类型和分辨率:

纯文本
gs -dBATCH -dNOPAUSE -q 
  -sDEVICE=pdfwrite 
  -dColorImageDownsampleType=/Bicubic 
  -dColorImageResolution=150 
  -dGrayImageDownsampleType=/Bicubic 
  -dGrayImageResolution=150 
  -dMonoImageDownsampleType=/Bicubic 
  -dMonoImageResolution=300 
  -sOutputFile=output/custom.pdf 
  input/document.pdf

这里把彩色和灰度图设为 150 DPI,黑白图设为 300 DPI,适合作为测试起点,而不是所有文件的通用标准。/Bicubic 是下采样算法选项;调整分辨率或算法后,应检查细字、线条、印章和图表等关键区域。用于印刷、放大查看或长期保存的文件,可能需要保留更高图像质量。

合并多个 PDF

将输入文件按希望出现的页面顺序列出,Ghostscript 会按这个顺序生成合并文件:

纯文本
gs -dBATCH -dNOPAUSE -q 
  -sDEVICE=pdfwrite 
  -sOutputFile=output/combined.pdf 
  input/cover.pdf input/form.pdf input/appendix.pdf

先检查文件名顺序,尤其是从目录自动读取文件时:按字母排序可能会让 page-10.pdf 排在 page-2.pdf 前面。需要压缩时也可以给合并过程加入 -dPDFSETTINGS=/ebook 等选项,但合并和压缩会同时重新生成文件,更应该仔细验收。部分 PDF 的书签、注释、表单或其他交互内容可能无法按原样保留。

批量压缩目录中的 PDF

下面的 Bash 脚本处理指定目录的 PDF,并将结果写入单独的输出目录。它只扫描输入目录的第一层,不会递归进入子目录:

纯文本
#!/usr/bin/env bash
set -euo pipefail

input_dir="${1:-input}"
output_dir="${2:-output}"
quality="${3:-ebook}"

mkdir -p "$output_dir"

shopt -s nullglob
files=("$input_dir"/*.pdf "$input_dir"/*.PDF)

if ((${#files[@]} == 0)); then
  echo "没有找到 PDF:$input_dir" >&2
  exit 1
fi

for file in "${files[@]}"; do
  name="$(basename "$file")"
  target="$output_dir/$name"

  if [[ -e "$target" ]]; then
    echo "跳过,输出文件已存在:$target" >&2
    continue
  fi

  echo "处理:$file"
  gs -sDEVICE=pdfwrite 
    -dCompatibilityLevel=1.4 
    "-dPDFSETTINGS=/$quality" 
    -dNOPAUSE -dQUIET -dBATCH 
    -sOutputFile="$target" 
    "$file"
done

保存为 scripts/compress-pdfs.sh 后,可这样运行:

纯文本
bash scripts/compress-pdfs.sh input output ebook

三个参数依次是输入目录、输出目录和预设名称;不传参数时,脚本默认使用 input、output 和 ebook。Windows 环境可以在脚本中把 gs 改成 gswin64c,也可以在 PowerShell 中逐个处理文件。批量运行前,先用少量代表性文件测试,并确认输出目录有足够空间。

批量处理 PDF 时将输入文件与输出结果分开管理的流程示意图

验收处理结果

文件体积变小不代表结果一定可用。处理后至少检查以下几项:

  1. 页面与画质:抽查首页、文字密集页、图表页和小字页面,并在实际查看或打印尺寸下检查清晰度。关注细线、印章、手写内容和浅色文字。
  2. 可搜索文本:在阅读器中搜索原 PDF 里已知的词句,并尝试复制文本。如果原文件是扫描图,是否能搜索通常还取决于是否做过 OCR;重新生成 PDF 不会自动补上缺失的识别文本。
  3. 书签与页面顺序:检查合并后的页数、顺序和书签。需要依赖书签导航的材料,不要只凭文件能打开就判定合格。
  4. 表单与注释:确认表单字段能否填写、提交,批注和链接是否仍可使用。对签名文件尤其要检查数字签名状态;重新生成文件可能影响签名有效性。
  5. 文件完整性:用目标阅读器打开输出文件,翻看页面边界和方向,并确认没有报错或缺页。正式提交前,按接收方要求再核对格式和兼容性。

如果输出画质变差,可尝试提高图像分辨率或改用压缩较轻的预设;如果书签、表单、注释或签名是必须保留的内容,应先用测试副本验证 Ghostscript 的处理结果,必要时选择更适合保留这些功能的工作流。

热门话题

52okp 是一名关注人工智能、开源软件与效率工具的技术内容创作者,长期实践 Stable Diffusion、ComfyUI、AI 智能体、MCP、Codex 和各类开源项目。通过实际安装、配置与测试,整理可复现的操作教程、问题排查方法和工具使用经验。

登录用户才能发表评论! 登录账户

取消回复

评论列表 (6条):

加载更多评论 Loading...

延伸阅读:

Stirling-PDF 自托管实践:把常用 PDF 操作搬到自己的服务器上

季度末整理合同归档时,我手头有二十多份扫描件要合并成册,还要把几份带敏感信息的报价单压到能发邮件的体积。按老习惯打开某个...

52okp
2026-10-19

给批量文件脚本加入预览和日志:建立可检查的办公自动化流程

批量整理文件最怕的不是步骤繁琐,而是误操作后难以追查去向。文章以按扩展名归类为例,介绍如何让 Python 脚本默认只预...

52okp
2026-09-27

用 Python 批量提取 PDF 指定区域文字并导出 Excel:从框选到全自动运行

如果你手头有一批格式相同的 PDF,比如发票、对账单、货运单或月度报表,每次都要从固定位置复制日期、金额、单号,再粘贴进...

52okp
2026-11-05

从 Python 脚本到可重复执行的办公任务:配置输入目录、参数和结果检查

能把文件处理完的 Python 脚本,并不等于可重复执行的办公任务:目录写死、缺少日志、没有处理计数,换台机器或换个文件...

52okp
2026-09-29

用 Python 按模板生成办公报告:从 Excel 数据到 Word 文档的自动填充

每周把 Excel 项目进度、负责人和日期重复填进 Word 周报,既费时也容易漏项;Python 可以按模板批量生成文...

52okp
2026-09-26
    返回顶部