乐于分享
好东西不私藏

PDF扫描件色阶调整工具v2.0

PDF扫描件色阶调整工具v2.0

前几天群里有朋友抱怨:扫描版PDF灰蒙蒙的,对比度低,看着费眼睛,想找个工具批量处理一下。我说老马的工具或者PS动作不就行了?他说老马那个得逐页提取,太麻烦;PS倒是能调,但也要一张张导出来,处理完体积还膨胀得离谱。

正好最近在折腾用Claude和ChatGPT写代码,顺手花了点时间做了一个。轮子大概是重复造的——类似功能的工具应该不少——但自己造的轮子,用起来总归放心且顺手。

PDF 扫描件色阶调整工具

解决扫描版 PDF 灰蒙蒙、对比度低的问题。直接处理 PDF 内嵌图片,不拆图不重建,体积可控。

功能

  • • 自动色阶:自动检测每页黑白场并拉伸,一键搞定大部分灰蒙蒙的扫描件
  • • 手动色阶:自定义黑场、白场、Gamma,精确控制(类似 Photoshop 色阶)
  • • 实时预览:选择任意页面查看 Before / After 对比,调参满意再处理
  • • 批量处理:一次添加多个 PDF,排队自动处理
  • • 体积控制:JPEG 质量可调(30-100),输出体积可控,处理后显示体积对比
  • • 进度显示:进度条 + 预估剩余时间
  • • 命令行版pdf_levels.py 可在脚本/自动化场景使用

参数说明

自动色阶模式

参数
默认值
说明
裁剪强度
0.5%
两端各裁掉多少百分比的极值像素,越大对比越强。0.5 适合大部分情况,灰得厉害可以试 1.0-2.0
Gamma
1.0
>1 提亮中间调(纸张底色偏暗时有用),<1 压暗

手动色阶模式

参数
默认值
说明
黑场
40
低于此值的像素压成纯黑。扫描件的"灰雾"通常在 30-60 之间
白场
210
高于此值的像素拉成纯白。纸张底色通常在 200-230 之间
Gamma
1.0
同上

输出设置

参数
默认值
说明
JPEG 质量
85
30-100,越低体积越小但画质越差。85 是清晰度和体积的平衡点,对纯文字扫描件 75 也够用
输出后缀
_adjusted
输出文件名 = 原文件名 + 后缀
输出目录
(空)
留空则输出到原文件同目录

工作原理

  1. 1. 用 PyMuPDF 打开 PDF,逐页提取嵌入的扫描图片(xref)
  2. 2. 用 Pillow + NumPy 对图片做色阶拉伸
  3. 3. 把处理后的图片以 JPEG 编码写回原 xref 位置
  4. 4. 保存时启用 garbage=4(清理冗余对象)和 deflate=True(压缩非图片流)

这种方式不需要重建页面,PDF 的书签、目录、链接等元数据都会保留。

调参建议

大部分情况:直接用自动色阶默认参数就行,"一键变清晰"。

纸张发黄的旧书扫描:自动色阶 + Gamma 1.2-1.3,裁剪强度 1.0。

对比度还行但整体偏灰:手动模式,黑场 30-50,白场 200-220。

彩色扫描件:同样适用,自动色阶会对 RGB 三通道分别处理。

体积优化:纯文字扫描件可以把 JPEG 质量降到 70-75,视觉差异很小但体积明显缩小。

常见问题

Q: 处理后某些页面变花了?A: 该页可能不是纯扫描图,而是矢量+图片混排。工具只处理每页最大的嵌入图,如果页面结构复杂可能出问题。这种情况建议跳过该页或用其他方式处理。

Q: 处理后体积反而变大了?A: 原 PDF 可能用了更高压缩率的 JPEG 或 JPEG2000。可以降低 JPEG 质量参数,或者原件压缩已经足够好不需要再处理。

Q: 支持加密的 PDF 吗?A: 不支持有密码保护的 PDF。请先用其他工具解密后再处理。

使用时,运行dist目录下的PDFLevels.exe即可。

识别下面的二维码下载:(转载请注明出处)