PDF扫描件转Word · 专业版
> 一键处理文本型、扫描型、混合型PDF,自动OCR识别中文,支持批量转换
🎯 解决什么问题
| 痛点 | 本技能解法 |
|---|---|
| 扫描件PDF转Word后全是图片,无法编辑 | PyMuPDF检测页类型,扫描页自动触发OCR |
| 中文OCR后满屏乱码"???" | 强制GBK解码,绕过编码陷阱 |
| 汉字之间被插入多余空格"正 本" | 后处理自动合并相邻汉字 |
| 扫描件方向旋转,OCR识别率低 | 四方向(0°/90°/180°/270°)旋转取最优 |
| 一份PDF里文本页+扫描页混杂 | 智能混合策略:文本页直接提取,扫描页切换OCR |
| 批量文件逐个转换效率低 | 目录批量转换,带进度显示和日志 |
⚡ 快速开始
转换命令
# 批量转换(整个目录)
py -3 pdf2docx.py <PDF目录> <输出docx目录>
# 单文件
py -3 pdf2docx.py 合同.pdf 合同.docx
# 带日志
py -3 pdf2docx.py <PDF目录> <输出docx目录> --log conversion.log
去除汉字间空格(OCR后处理)
py -3 fix_cjk_spaces.py <docx目录> # 整目录
py -3 fix_cjk_spaces.py 合同.docx # 单文件
📦 安装依赖
pip install pymupdf python-docx Pillow
OcrConsole.exe(Windows专用OCR引擎)需放置在与 pdf2docx.py 同目录下。
编译方式:见 references/ocr_setup.md,或联系开发者获取预编译版本。
🔬 技术架构
┌─────────────────────────────────────────┐
│ 输入:PDF文件 │
└──────────────┬──────────────────────────┘
│
▼
┌──────────────────────┐
│ PyMuPDF 文本提取 │──── 行数≥5 ──→ 直接输出文本
└──────────┬───────────┘
│ 行数<5(扫描页)
▼
┌──────────────────────┐
│ 渲染为PNG (200 DPI) │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ 四方向旋转OCR │ 0° / 90° / 180° / 270°
│ Windows.Media.Ocr │ → 取文字最多结果
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ GBK解码 + CJK空格清理 │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ python-docx 生成 │ 默认字体:宋体
└──────────┬───────────┘
│
▼
输出:.docx 文件
⚙️ 核心参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| 扫描页判定阈值 | 文本行数 < 5 | 低于此值自动触发OCR |
| OCR单次超时 | 15秒 | 超出后重试(最多2次) |
| 渲染分辨率 | 200 DPI | 兼顾速度与识别质量 |
| OCR方向尝试 | 4个(0/90/180/270°) | 解决扫描件方向不固定问题 |
🧩 适用场景
- 政务/公文:采购文件、投标文件、合同协议
- 审计/法务:取证单、调查报告、财务凭证扫描件
- 学术:扫描版书籍、论文、旧档案数字化
- 医疗:病历、检查报告(扫描件)
- 档案管理:历史档案数字化加工
❓ 常见问题
Q: 转换后中文是乱码"???"
A: 通常是解码错误。OcrConsole.exe输出GBK编码,脚本已内置正确解码(decode('gbk')),无需手动处理。
Q: OCR后汉字间有空格"正 本"
A: Windows.Media.Ocr的固有特征。运行 py -3 fix_cjk_spaces.py <文件> 即可修复。
Q: 部分页面识别失败
A: 可能是图片质量过低或方向极度歪斜。当前脚本已内置四方向旋转OCR;若仍失败,可尝试提高DPI或手动校正图片方向后重试。
Q: 支持macOS/Linux吗?
A: 当前版本依赖Windows.Media.Ocr,仅支持Windows。macOS/Linux用户可替换为Tesseract OCR引擎(需修改ocr_image_console函数)。
📁 脚本说明
| 文件 | 作用 |
|---|---|
pdf2docx.py |
主转换脚本(批量/单文件) |
fix_cjk_spaces.py |
后处理:去除汉字间多余空格 |
OcrConsole.exe |
OCR可执行文件(需自行编译,参见references) |