PDF转Word
将任意 PDF 转为 Word(.docx),优先保真,扫描件走 OCR 重建可编辑文字版。
判定路线
先用 pypdf 检查每页文字层:
python3 - <<'EOF'
from pypdf import PdfReader
r = PdfReader('输入.pdf')
for i, p in enumerate(r.pages):
t = p.extract_text() or ''
print(f'第{i+1}页: 文字长度={len(t)} 图片数={len(p.images) if hasattr(p,"images") else 0}')
EOF
- 全部页面文字长度 > 0 → 路线 A(pdf2docx 直转,最保真)
- 全部文字长度 = 0(纯扫描件) → 路线 B(Vision OCR 重建)
- 混合 → 逐页分路线,OCR 页用路线 B 处理
路线 A:文字版 PDF 直转(保留字体排版)
python3 -c "
from pdf2docx import Converter
cv = Converter('输入.pdf')
cv.convert('输出.docx', multi_processing=False)
cv.close()
"
转换后建议用 python-docx 抽查:段落数、表格数、每页图片数,确认无丢页。
路线 B:扫描件 OCR 重建(可编辑文字版)
步骤 1:渲染高清图
mkdir -p ocr_tmp && python3 - <<'EOF'
import pymupdf
pdf = pymupdf.open('输入.pdf')
for i, page in enumerate(pdf):
pix = page.get_pixmap(dpi=300) # 300dpi 保证OCR质量
pix.save(f'ocr_tmp/page_{i+1:02d}.png')
print('渲染完成:', len(pdf), '页')
EOF
步骤 2:macOS 原生 Vision OCR(无需安装任何包)
swift scripts/ocr.swift ocr_tmp > ocr_tmp/ocr_result.json
- 引擎:
VNRecognizeTextRequest(recognitionLevel=.accurate,语言 zh-Hans + en-US) - 输出:JSON,每行含 text + 归一化坐标(x/y 为中心点,左下原点)
- 中文识别质量好,本地运行,文件不出本机(适合病历等敏感文档)
步骤 3:版面重组
用 y 坐标聚类合并同一排(容差约 0.006),排内按 x 升序拼接,得到每页按视觉顺序的文本:
python3 - <<'EOF'
import json
data = json.load(open('ocr_tmp/ocr_result.json'))
for page in data:
lines = sorted(page['lines'], key=lambda l: (-round(l['y'],2), l['x']))
rows = []
for l in lines:
if rows and abs(l['y'] - rows[-1]['y']) < 0.006:
rows[-1]['items'].append(l)
else:
rows.append({'y': l['y'], 'items': [l]})
print(f"===== {page['page']} =====")
for r in rows:
items = sorted(r['items'], key=lambda i: i['x'])
print(' | '.join(i['text'] for i in items))
EOF
步骤 4:结构化重建 Word
- 逐页人工校对重组文本(签名、印章、勾选框必然不准)
- 用
scripts/build_word.py提供的辅助函数(h1/h2/field/kv_table/note)构建:单据标题黑体居中、字段表格化、长段落正文 - 每类单据之间
pagebreak()分页,保持与原件一致的页数结构
输出质量门禁
- 页数一致:Word 中图片数/分节数 == 原 PDF 页数
- 关键字段无错漏:姓名、日期、诊断/结论、金额等逐项核对
- 标注规范:
- 手写签名、勾选框 →(手写签名,识别为"X"[?]),OCR 无法确认的标[?]
- 扫描模糊段落 → 如实标注(此段原件字迹模糊,OCR未能完整识别,详见原扫描件),禁止编造内容
- 医疗文书、法律文书:涉及诊断/结论/编码/金额的推断项必须标[?]并提示"以原件为准"
注意事项
- 隐私:全程本地处理(OCR 用系统 Vision,不出网)。敏感文档优先本地方案,勿用远程 OCR 服务
- 环境:macOS 需要 Swift CLI(Xcode Command Line Tools,
swift --version验证);Python 依赖装隔离 venv,勿污染系统环境 - 性能:扫描件 300dpi 渲染每页约 2-5 秒 OCR,11 页文档约 1 分钟内完成
- 边界:图片型 PDF 无字体可言,"字体正确"= 版面/比例一致;纯文字需求优先文字版 PDF 直转