使用 PaddleOCR + 多进程 + GPU 加速实现 PDF 可搜索化(支持中英文、竖排/旋转文字)

✅ 项目目标

不可搜索的扫描版 PDF (图片型)通过 OCR 技术转换为可全文检索、可复制文字的 PDF 文件,同时保留原始排版,并支持:

  • 中文、英文、符号混合识别
  • 竖排文字、旋转文字正确还原
  • GPU 自动加速(若可用)
  • 多核 CPU 并行处理提升效率
  • 输出 PDF 体积小、兼容性好

📦 所需依赖

bash 复制代码
pip install paddleocr PyMuPDF Pillow reportlab tqdm

注意:paddleocr 会自动安装 paddlepaddle。若要启用 GPU,请确保已安装 CUDA 并使用 paddlepaddle-gpu


📁 目录结构准备

在项目根目录下创建以下文件夹和文件:

复制代码
your_project/
├── ocr_pdf_gpu_multicore.py      ← 主脚本(本文核心)
├── input_pdfs/                   ← 放入待处理的 PDF
├── output_pdfs/                  ← 输出结果
├── pdf_pages/                    ← 临时文件(自动创建)
└── fonts/
    └── PingFang-SC-Regular.ttf   ← 中文字体(可替换为思源黑体等)

💡 字体建议:使用支持中文的 TTF 字体(如 PingFang、Microsoft YaHei、Noto Sans CJK)。若缺失,程序会降级使用 Helvetica。


🔧 核心配置说明(脚本开头)

python 复制代码
INPUT_DIR = "./input_pdfs"        # 输入 PDF 文件夹
OUTPUT_DIR = "./output_pdfs"      # 输出 PDF 文件夹
TEMP_ROOT = "./pdf_pages"         # 临时图片/PDF 存放目录
FONT_PATH_CN = "./fonts/PingFang-SC-Regular.ttf"
MAX_WORKERS = 4                   # 多进程数量(建议 ≤ CPU 核心数)
DPI = 300                         # 渲染精度(越高越清晰,但更慢)
KEEP_TEMP = False                 # 是否保留临时文件(调试时可设为 True)

🌟 技术亮点解析

1️⃣ GPU 自动检测

python 复制代码
def get_device():
    try:
        import paddle
        if paddle.is_compiled_with_cuda() and paddle.device.cuda.device_count() > 0:
            print("检测到 GPU,使用 GPU 加速")
            return "gpu"
    except:
        pass
    print("使用 CPU")
    return "cpu"
  • 自动判断是否可用 GPU,无需手动切换。
  • 实测:RTX 4060 上 OCR 速度提升 3~5 倍。

2️⃣ PaddleOCR 高精度模型

python 复制代码
ocr = PaddleOCR(
    text_detection_model_name="PP-OCRv5_server_det",
    text_recognition_model_name="PP-OCRv5_server_rec",
    device=DEVICE
)
  • 使用 PP-OCRv5 服务端模型,对模糊、倾斜、低分辨率图像鲁棒性强。
  • 支持竖排、弯曲、旋转文字检测。

3️⃣ 多进程并行处理每一页

  • 将 PDF 拆分为 PNG 图片(fitz 渲染,DPI=300)
  • 使用 ProcessPoolExecutor 同时处理多页
  • 每页独立生成带隐藏 OCR 文字的 PDF 页
  • 最后合并为完整 PDF

⚡ 性能对比(100页 PDF,i7-13700H + RTX 4060):

  • 单进程:约 8 分钟
  • 4 进程 + GPU:约 1.5 分钟

4️⃣ 智能文字排版还原

✅ 普通横排文字
  • 自动计算字体大小、字符间距
  • 文字透明(setFillAlpha(0)),仅用于搜索,不遮挡原图
✅ 竖排/旋转文字
python 复制代码
def draw_rotated_or_vertical_text(c, img_height, box, text, base_font_size=12):
    # 判断是否为竖排(75°~105°)或斜排
    # 使用 canvas.rotate() 精准还原方向
    # 竖排时逐字绘制,保持阅读顺序
  • 完美支持古籍、日文、工程图纸等场景

▶️ 使用步骤

  1. 将待处理 PDF 放入 ./input_pdfs/

  2. 确保中文字体存在(或修改 FONT_PATH_CN

  3. 运行脚本:

    bash 复制代码
    python ocr_pdf_gpu_multicore.py
  1. 选择 PDF 序号(如输入 1
  2. 等待处理完成,结果在 ./output_pdfs/xxx_ocr.pdf

✅ 输出 PDF 特性:

  • 可 Ctrl+F 搜索任意文字
  • 可复制粘贴内容
  • 原始图像完全保留
  • 文件体积压缩(garbage=4, deflate=True

🛠️ 常见问题解决

❌ "字体文件未找到"

❌ "CUDA error" 或 GPU 未启用

  • 确认已安装 paddlepaddle-gpu

    bash 复制代码
    pip uninstall paddlepaddle
    pip install paddlepaddle-gpu -f https://www.paddlepaddle.org.cn/whl/stable.html

❌ 处理大文件内存不足

  • 降低 DPI(如 200)
  • 减少 MAX_WORKERS(如 2)

📜 许可与扩展

  • 本脚本基于 MIT 协议,可自由修改商用
  • 可扩展功能:
    • 批量处理所有 PDF(取消用户选择)
    • 添加日志记录
    • 支持 PDF 密码解密(fitz.open(password=...)

💬 结语

通过 PaddleOCR + ReportLab + PyMuPDF + 多进程 的组合,我们实现了高性能、高精度的 PDF OCR 解决方案。无论是学术论文、历史档案还是工程图纸,都能一键转为可搜索格式!

GitHub 示例项目 :欢迎 Star!https://github.com/mlb0925/PaddleOCR_PDF


觉得有用?点赞 + 关注,获取更多自动化办公技巧! 👍

相关推荐
DS随心转小程序4 小时前
ai转pdf
人工智能·pdf·aigc·deepseek·ds随心转
开开心心_Every4 小时前
手机PDF处理工具:支持格式转换与批注
游戏·微信·智能手机·pdf·逻辑回归·excel·语音识别
weixin_462446234 小时前
用 Python 自动生成双面打印英语单词闪卡(Flashcards)PDF
python·pdf·记忆卡
FL16238631294 小时前
Windows上GPU版本的Paddle Inference3.2.1安装和使用教程
windows·paddle
航Hang*17 小时前
计算机等级考试(二级WPS)---第1章:综合应用基础---第2节:PDF文件应用
笔记·学习·pdf·wps·计算机二级·计算机等级考试
蒝莱茹茈1 天前
pdf-engine发布
pdf·pdfium
fl1768311 天前
基于python实现PDF批量加水印工具
开发语言·python·pdf
lqj_本人1 天前
Flutter PDF 渲染插件(pdf_image_renderer)适配鸿蒙 (HarmonyOS) 平台实战
flutter·pdf·harmonyos
YQ_012 天前
Ubuntu 18.04 离线安装 CUDA 11.2 + cuDNN 8.2 (修复 Paddle 缺少 .so 报错)
linux·ubuntu·paddle