PDF OCR 增强工具(腾讯云 OCR + 手写签名)
本 skill 将图片型 PDF 转换为可搜索的 OCR 版 PDF,使用腾讯云 OCR 提供高精度中文识别。
特点:无需安装腾讯云 SDK,手写 TC3-HMAC-SHA256 签名直调 API。
前置依赖
Python 依赖
pip install pymupdf
> 仅需 PyMuPDF(fitz),用于 PDF 渲染和文字叠加
腾讯云配置
需要设置环境变量或直接修改脚本中的凭证:
- TENCENTCLOUD_SECRET_ID - 密钥 ID
- TENCENTCLOUD_SECRET_KEY - 密钥 Key
- TENCENTCLOUD_REGION - 区域(默认:ap-guangzhou)
快速使用
# 基本用法(输出到同目录,文件名加"_可搜索"后缀)
python3 pdf-ocr-tencent.py "扫描件.pdf"
# 指定输出路径
python3 pdf-ocr-tencent.py "输入.pdf" "输出.pdf"
工作流程
1. PDF 每页 → 144 DPI 渲染为 JPEG 图片
2. 图片 base64 → 腾讯云 GeneralAccurateOCR API
3. OCR 结果(文字+坐标)→ 叠加到图片底图上
4. 输出可搜索 PDF(Ctrl+F 可搜索)
参数说明
| 参数 | 必填 | 说明 |
|---|---|---|
| 输入 PDF | ✅ | 要处理的 PDF 文件路径 |
| 输出路径 | ❌ | 不填则自动加 "_可搜索.pdf" 后缀 |
核心实现
TC3-HMAC-SHA256 签名(手写,无需 SDK)
def sign(key, msg):
return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest()
def get_signature(secret_id, secret_key, service, region, timestamp, payload):
date = datetime.datetime.utcfromtimestamp(timestamp).strftime("%Y-%m-%d")
# ... 完整签名流程见脚本
关键点:
- 必须用 utcfromtimestamp(不能用 fromtimestamp(tz=UTC),会导致日期差 8 小时)
- 使用 ItemPolygon 获取文本块坐标(大写 X/Y/Width/Height)
- 文字层必须用 fontname="china-s"(宋体),否则中文不可见
可搜索 PDF 生成
# 文字坐标需 Y 轴翻转(PDF 坐标原点在左下)
x0 = blk['x'] * sx
y0 = (img_h - blk['y'] - blk['h']) * sy
x1 = (blk['x'] + blk['w']) * sx
y1 = (img_h - blk['y']) * sy
page_out.insert_textbox(
fitz.Rect(x0, y0, x1, y1),
text,
fontsize=max(rect.height * 0.65, 5),
fontname="china-s", # 关键!中文字体
color=(0, 0, 0),
)
输出
- 可搜索 PDF:图片底图 + 不可见文字层
- 支持 Ctrl+F 搜索、复制文字
- 文件保存到指定路径或原目录
适用场景
| 场景 | 推荐度 |
|---|---|
| 中文扫描件转可搜索 PDF | ⭐⭐⭐⭐⭐ |
| 合同/文档 OCR 识别 | ⭐⭐⭐⭐⭐ |
| 证件/票据识别 | ⭐⭐⭐⭐ |
| 英文文档 OCR | ⭐⭐⭐ |
| 手写体识别 | ⭐⭐(建议专业 OCR 服务) |
注意事项
- 腾讯云 OCR 免费额度:每月 1000 次通用印刷体识别(GeneralAccurateOCR)
- 大文件处理:225 页 PDF 约需 15-30 分钟(每页调一次 API)
- API 凭证:脚本内硬编码了密钥,长期使用建议改用环境变量
- 隐私:图片会上传至腾讯云处理
常见问题
Q: 文字层看不见/搜索不到?
A: 检查是否使用了 fontname="china-s",默认 Helvetica 不支持中文。
Q: 文字位置偏了?
A: 检查 Y 轴翻转逻辑:y0 = (img_h - blk['y'] - blk['h']) * sy
Q: 签名失败(AuthFailure)?
A: 确认用的是 utcfromtimestamp 而不是 fromtimestamp(tz=UTC),后者会差 8 小时。