扫描版PDF文档常常因为纸张老化、扫描设备等因素导致背景发黄或灰暗,影响阅读体验。这个问题困扰过很多需要处理电子文档的朋友。今天分享的Python脚本,能自动将扫描PDF的背景转为纯白,同时保留文字清晰度。
核心原理其实很简单:扫描PDF的每一页本质上都是图片,我们通过图像处理技术识别并修改背景色。具体来说,脚本会:
这个方案特别适合处理老旧书籍扫描件、手写笔记扫描件等背景不均匀的文档。相比专业软件,Python脚本的优势在于参数可调、处理流程透明,而且完全免费。
在开始前,需要安装三个Python库:
bash复制pip install pymupdf pillow numpy
注意:如果安装pymupdf报错,可以尝试先安装系统依赖:
bash复制# Ubuntu/Debian sudo apt-get install libjpeg-dev zlib1g-dev # MacOS brew install jpeg zlib
将提供的代码保存为pdf_white.py。建议使用VS Code或PyCharm等专业编辑器,避免记事本可能导致的编码问题。文件结构应该包含:
code复制/pdf_white.py
/待处理的PDF文件.pdf
脚本中最关键的参数是white_threshold,默认值200。这个值决定了什么样的颜色会被视为"背景"而转为白色。理解它的工作原理很重要:
实际使用时,可以根据文档状况调整:
dpi=300控制图像提取的分辨率:
实测数据:一份100页的扫描PDF
- 300 DPI:处理时间3分12秒,输出文件48MB
- 200 DPI:处理时间1分45秒,输出文件21MB
- 150 DPI:处理时间1分02秒,输出文件12MB
命令行执行(假设处理"book.pdf"):
bash复制python pdf_white.py "book.pdf" -o "clean_book.pdf"
如果不指定输出文件名,脚本会自动生成带"白色背景_"前缀的文件:
bash复制python pdf_white.py "book.pdf"
# 输出:白色背景_book.pdf
如果需要处理整个文件夹的PDF,可以配合shell脚本:
bash复制# Linux/Mac
for file in *.pdf; do
python pdf_white.py "$file" -o "clean_${file}"
done
# Windows PowerShell
Get-ChildItem *.pdf | ForEach-Object {
python pdf_white.py $_.Name -o ("clean_" + $_.Name)
}
如果需要调整阈值或DPI,直接修改脚本中的这两个参数:
python复制white_threshold = 200 # 修改这个值
pix = page.get_pixmap(dpi=300) # 修改这个DPI值
对于专业用户,可以考虑添加命令行参数来动态设置这些值。以下是改进版的参数解析代码:
python复制parser.add_argument("--threshold", type=int, default=200,
help="背景色阈值(0-255),默认200")
parser.add_argument("--dpi", type=int, default=300,
help="处理DPI,默认300")
问题现象:
解决方法:
优化方案:
python复制from multiprocessing import Pool
def process_page(args):
page_num, page = args
# 处理单页的代码...
if __name__ == "__main__":
with Pool() as p:
p.map(process_page, enumerate(doc))
可能原因:
排查步骤:
手动调整阈值不够高效,可以改为自动计算:
python复制# 计算图像平均亮度作为基准
avg_brightness = np.mean(img_np)
white_threshold = min(220, avg_brightness + 30)
在背景变白的同时,可以增强文字对比度:
python复制# 在背景变白后添加
text_mask = ~mask
img_np[text_mask] = img_np[text_mask] * 0.8 # 加深文字
有些文档的页眉页脚本身就是设计元素,不应被去除。可以通过检测页面边缘区域来特殊处理:
python复制# 假设页眉在顶部10%区域
header_area = img_np[:int(img_np.shape[0]*0.1), :]
# 不对header_area应用背景变白
这个脚本在我处理学术文献扫描件时特别有用。经过多次调整后,我发现对于90年代的老书扫描件,threshold=190配合dpi=250能得到最佳平衡。如果遇到特别顽固的黄色背景,可以尝试先转换为灰度图像再处理。