来源:ChatGPT
安装依赖
pip install pdf2image pillow opencv-python
# pdf2image 需要 Poppler
apt install poppler-utils
Python 代码
import os
import cv2
from pdf2image import convert_from_path
from PIL import Image
# ======== 配置参数 ========
INPUT_FOLDER = "input_pdfs"   # 输入 PDF 文件夹
OUTPUT_FOLDER = "output_pdfs" # 输出 PDF 文件夹
DPI = 300                     # 转图片分辨率
ALPHA = 1.5                   # 对比度 (>1 增强, <1 降低)
BETA = -30                    # 亮度 (负数变暗, 正数变亮)
# ==========================
os.makedirs(OUTPUT_FOLDER, exist_ok=True)
def enhance_contrast_brightness(img, alpha, beta):
    """调整对比度(alpha)和亮度(beta)"""
    return cv2.convertScaleAbs(img, alpha=alpha, beta=beta)
def process_pdf(pdf_path, output_path):
    print(f"处理: {pdf_path}")
    pages = convert_from_path(pdf_path, dpi=DPI)
    enhanced_images = []
    for i, page in enumerate(pages):
        # 转为灰度
        img = cv2.cvtColor(cv2.cvtColor(
            cv2.imdecode(
                np.frombuffer(page.tobytes(), dtype=np.uint8),
                cv2.IMREAD_COLOR
            ), cv2.COLOR_BGR2GRAY
        ), cv2.COLOR_GRAY2BGR)
        # 调整对比度和亮度
        enhanced = enhance_contrast_brightness(img, ALPHA, BETA)
        # 转 PIL Image
        pil_img = Image.fromarray(cv2.cvtColor(enhanced, cv2.COLOR_BGR2RGB))
        enhanced_images.append(pil_img)
    # 保存 PDF
    enhanced_images[0].save(output_path, save_all=True, append_images=enhanced_images[1:], quality=100)
    print(f"已保存到: {output_path}")
def batch_process():
    for file in os.listdir(INPUT_FOLDER):
        if file.lower().endswith(".pdf"):
            input_path = os.path.join(INPUT_FOLDER, file)
            output_path = os.path.join(OUTPUT_FOLDER, file)
            process_pdf(input_path, output_path)
if __name__ == "__main__":
    import numpy as np
    batch_process()
处理文件
- 准备文件
 
input_pdfs/   # 把要处理的 PDF 放这里
output_pdfs/  # 处理后的 PDF 会生成到这里
- 修改脚本顶部的控制变量
 - ALPHA(对比度,推荐 1.2 ~ 2.0)
 - 
BETA(亮度,推荐 -50 ~ 50)
 - 
运行脚本
 
python enhance_pdf_text.py
- 运行效果
 - ALPHA=1.5, BETA=-30 → 浅灰字会变接近黑色,背景更干净。
 - ALPHA=2.0, BETA=-50 → 适合底色很浅的情况(会有“硬边”效果)。