本 skill 将图片型 PDF 转换为可搜索的 OCR 版 PDF,使用腾讯云 OCR 提供高精度中文识别。
特点:无需安装腾讯云 SDK,手写 TC3-HMAC-SHA256 签名直调 API。
pip install pymupdf
> 仅需 PyMuPDF(fitz),用于 PDF 渲染和文字叠加
需要设置环境变量或直接修改脚本中的凭证:
TENCENTCLOUD_SECRET_ID - 密钥 IDTENCENTCLOUD_SECRET_KEY - 密钥 KeyTENCENTCLOUD_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" 后缀 |
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"(宋体),否则中文不可见# 文字坐标需 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 | ⭐⭐⭐⭐⭐ |
| 合同/文档 OCR 识别 | ⭐⭐⭐⭐⭐ |
| 证件/票据识别 | ⭐⭐⭐⭐ |
| 英文文档 OCR | ⭐⭐⭐ |
| 手写体识别 | ⭐⭐(建议专业 OCR 服务) |
A: 检查是否使用了 fontname="china-s",默认 Helvetica 不支持中文。
A: 检查 Y 轴翻转逻辑:y0 = (img_h - blk['y'] - blk['h']) * sy
A: 确认用的是 utcfromtimestamp 而不是 fromtimestamp(tz=UTC),后者会差 8 小时。
共 2 个版本