glm-ocr-to-en-word
基于智谱GLM-OCR API的PDF扫描件转英文Word文档技能。采用逐页并行处理模式,Python脚本负责OCR识别和Word构建,AI负责翻译。支持子代理并行翻译、断点续传、完整日志记录。提供两种方案:方案一(layout_details精确还原)和方案二(Markdown+pandoc)。
- License 许可
- MIT
- 最近更新
- 2026-09-12
- Stars
- ★ 6
- Forks
- 1
01 前言 Front Matter
- name
- glm-ocr-to-en-word
- trigger
- [ "PDF转英文Word", "PDF转英文docx", "扫描件转英文Word", "GLM-OCR转英文Word", "PDF识别转英文Word", "PDF中译英Word", "扫描件翻译转Word", "PDF转md", "PDF转Markdown", "大PDF转文本", "提取PDF内容", "OCR识别PDF" ]
- description
- 基于智谱GLM-OCR API的PDF扫描件转英文Word文档技能。采用逐页并行处理模式,Python脚本负责OCR识别和Word构建,AI负责翻译。支持子代理并行翻译、断点续传、完整日志记录。提供两种方案:方案一(layout_details精确还原)和方案二(Markdown+pandoc)。
02 资源文件 14
- 其他.key49 B
- 参考文档glm-ocr-to-en-word.html26.3 KB
- 脚本scripts/step1_ocr.py10.0 KB
- 脚本scripts/step2_helper.py7.2 KB
- 脚本scripts/step2_md_helper.py6.0 KB
- 脚本scripts/step3_build_word.py16.0 KB
- 脚本scripts/step3_md_to_html.py5.3 KB
- 脚本scripts/step3_md_to_word.py5.9 KB
- 脚本scripts/step4_merge_word.py4.0 KB
- 脚本step1_ocr.py3.8 KB
- 脚本step2_helper.py4.3 KB
- 脚本step3_build_word_v2.py13.0 KB
- 脚本step3_build_word.py14.1 KB
- 资产文件templates/reference.docx35.8 KB
03 SKILL.md 正文
glm-ocr-to-en-word 基于GLM-OCR的PDF转英文Word文档技能
技能概述
本技能采用逐页并行处理模式,将PDF逐页处理,每页生成独立文件,支持子代理并行翻译,保留完整过程痕迹和日志。
核心流程:
PDF → [逐页OCR] → [子代理并行翻译] → [逐页构建Word] → [合并]
核心优势:
| 特性 | 说明 |
|---|---|
| 无上下文污染 | 每页独立处理,子代理只处理单页 |
| 过程可追溯 | 每页独立文件,完整日志记录 |
| 并行加速 | 支持子代理并行翻译,大幅提升速度 |
| 断点续传 | 页级粒度,任意步骤可中断恢复 |
| 日志排查 | 每个环节写入日志文件,便于问题定位 |
大PDF处理:先截图再OCR(重要)
若PDF文件较大(>3MB),直接发给GLM-OCR会超时。正确做法:先截图再OCR。
流程
# 1. 用PyMuPDF将PDF每页渲染为PNG(2x缩放)
python3 -c "
import pymupdf, os
doc = pymupdf.open('大PDF.pdf')
for i in range(1, 11): # 先处理10页测试
page = doc[i-1]
pix = page.get_pixmap(matrix=pymupdf.Matrix(2, 2))
pix.save(f'output/page_{i}.png')
"
# 2. 图片发给GLM-OCR(秒级响应)
python3 -c "
import requests, base64, json, os, time
API_URL = 'https://open.bigmodel.cn/api/paas/v4/layout_parsing'
API_KEY = '你的KEY'
for i in range(1, 11):
with open(f'output/page_{i}.png', 'rb') as f:
img_base64 = base64.b64encode(f.read()).decode()
resp = requests.post(API_URL,
headers={'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json'},
json={'model': 'glm-ocr', 'file': f'data:image/png;base64,{img_base64}', 'return_crop_images': False},
timeout=120
)
md = resp.json().get('md_results', '')
with open(f'output/page_{i}.md', 'w', encoding='utf-8') as f:
f.write(md)
print(f'第{i}页完成')
time.sleep(1)
"
关键参数
pymupdf.Matrix(2, 2)— 2x缩放,保证OCR识别质量- 每页PNG约200-400KB,比同等PDF小很多,API响应快
timeout=120— 截图方案单张通常<10s
开场交互式询问
AI必须在开始任何处理前,先询问用户选择方案:
【方案选择】
检测到PDF转英文Word请求,请选择处理方案:
方案一:layout_details精确还原(推荐)
- 使用GLM-OCR的结构化JSON数据
- python-docx精确还原表格、图片位置
- 支持复杂表格合并、元素定位
- 适合:复杂排版、含表格/图片的文档
方案二:Markdown + HTML + pandoc(推荐)
- 使用GLM-OCR的Markdown输出
- MD转HTML(保留HTML表格含colspan/rowspan)
- pandoc -f html 转换为Word,配合reference.docx模板控制字体样式
- 适合:含复杂表格的文档,表格合并单元格支持好
请回复 "方案一" 或 "方案二"
日志机制
所有脚本自动记录日志到 temp/logs/ 目录:
temp/logs/
├── step1_ocr.log ← 阶段1 OCR日志
├── step2_translate.log ← 阶段2 翻译日志(AI追加)
├── step3_build_word.log ← 阶段3 Word构建日志
└── step4_merge.log ← 阶段4 合并日志
日志格式
每条日志包含:时间戳、级别、页码(如有)、操作、详情
[2025-04-19 12:00:00] [INFO] [Page 1] OCR开始
[2025-04-19 12:00:05] [INFO] [Page 1] OCR完成,元素数: 15
[2025-04-19 12:00:05] [INFO] [Page 1] 图片下载: 2张
[2025-04-19 12:00:10] [ERROR] [Page 3] OCR失败: API超时
[2025-04-19 12:00:15] [INFO] [Page 3] 重试成功
日志用途
- 问题排查:某页翻译质量差,查看该页日志定位原因
- 断点恢复:读取日志确定哪些页已完成
- 性能分析:统计各阶段耗时
文件结构
方案一文件结构
temp/
├── logs/
│ ├── step1_ocr.log ← OCR日志
│ ├── step2_translate.log ← 翻译日志
│ ├── step3_build_word.log ← Word构建日志
│ └── step4_merge.log ← 合并日志
├── manifest.json ← 逐页处理清单
├── images/ ← 下载的图片
├── page_1_ocr.json ← 第1页OCR原始结果
├── page_2_ocr.json ← 第2页OCR原始结果
├── ...
├── page_1_translated.json ← 第1页翻译结果
├── page_2_translated.json ← 第2页翻译结果
├── ...
├── layout_details_final.json ← 翻译结果合并文件
├── word_pages/ ← 逐页Word存放目录
│ ├── page_1_en.docx
│ ├── page_2_en.docx
│ └── ...
└── (最终输出文件在temp外)
方案二文件结构
temp/
├── logs/
│ ├── step1_ocr.log
│ ├── step2_translate.log
│ ├── step3_build_word.log
│ └── step4_merge.log
├── manifest.json
├── images/
├── page_1.md ← 第1页OCR Markdown
├── page_2.md
├── ...
├── page_1_translated.md ← 第1页翻译后Markdown
├── page_2_translated.md
├── ...
├── word_pages/
│ ├── page_1_en.docx
│ └── ...
└── (最终输出文件在temp外)
方案一:layout_details精确还原
执行分工
| 阶段 | 执行者 | 职责 | 日志文件 |
|---|---|---|---|
| 阶段1:逐页OCR | Python脚本 | 调用API,保存JSON/MD,下载图片 | step1_ocr.log |
| 阶段2:并行翻译 | AI/子代理 | 逐页翻译,保存结果,质量验证 | step2_translate.log |
| 阶段3:构建Word | Python脚本 | 逐页构建Word | step3_build_word.log |
| 阶段4:合并Word | Python脚本 | 合并所有页为最终文档 | step4_merge.log |
前置要求
必须提供:智谱GLM-OCR的API Key
- 注册智谱开放平台:https://open.bigmodel.cn
- 在API Keys页面创建密钥
- 执行前告知API Key
依赖安装
pip install python-docx beautifulsoup4 requests pypandoc
阶段1:Python脚本 - 逐页OCR识别
运行命令
python scripts/step1_ocr.py "PDF路径" "API_KEY"
脚本行为
- 逐页调用GLM-OCR API
- 每页保存
page_N_ocr.json和page_N.md - 下载图片到
images/ - 生成
manifest.json清单 - 所有操作写入
logs/step1_ocr.log
日志示例
[2025-04-19 12:00:00] [INFO] ========== 阶段1:逐页OCR开始 ==========
[2025-04-19 12:00:00] [INFO] PDF路径: xxx.pdf
[2025-04-19 12:00:00] [INFO] PDF大小: 9.3MB
[2025-04-19 12:00:01] [INFO] [Page 1] 开始OCR
[2025-04-19 12:00:06] [INFO] [Page 1] OCR完成,元素数: 15,Token: 6124
[2025-04-19 12:00:06] [INFO] [Page 1] 图片下载: page_1_img_0.png
[2025-04-19 12:00:07] [INFO] [Page 1] 保存: page_1_ocr.json
[2025-04-19 12:00:07] [INFO] [Page 2] 开始OCR
...
[2025-04-19 12:05:00] [INFO] ========== 阶段1完成 ==========
[2025-04-19 12:05:00] [INFO] 总页数: 24
[2025-04-19 12:05:00] [INFO] 总Token: 146765
[2025-04-19 12:05:00] [INFO] 清单文件: temp/manifest.json
断点续传
page_N_ocr.json已存在则跳过该页- 日志记录跳过原因
阶段2:AI并行翻译(核心)
⚠️ 强制规则
阶段2必须由AI直接执行翻译,不得使用任何Python脚本替代。
| 可用脚本 | 功能 |
|---|---|
| scripts/step2_helper.py validate | 验证质量(检查残留中文) |
| scripts/step2_helper.py merge | 合并结果 |
子代理并行翻译
AI读取 manifest.json 获取总页数,分批调度子代理并行翻译
调度计划输出
【并行翻译调度计划】
- 总页数: 24
- 并行度: 4(每批处理4页)
- 分批计划:
第1批: 页1-4
第2批: 页5-8
第3批: 页9-12
第4批: 页13-16
第5批: 页17-20
第6批: 页21-24
开始调度子代理并行翻译...
子代理任务模板
你是一个翻译子代理。请完成以下任务:
1. 用Read工具读取 temp/page_{N}_ocr.json
2. 翻译该页所有元素的content字段(中文→英文)
- 不翻译:数字、批号、化学式、图片路径、HTML标签本身
- 翻译:中文术语、中文句子、表格单元格文本
3. 用Write工具保存翻译结果到 temp/page_{N}_translated.json
4. 运行验证:python scripts/step2_helper.py validate "temp/page_{N}_translated.json"
5. 如有残留中文,补充翻译并重新验证
6. 完成后返回:页码、元素数量、验证结果(chinese_count)
AI记录翻译日志
每批子代理完成后,AI追加日志到 logs/step2_translate.log:
[2025-04-19 12:10:00] [INFO] ========== 阶段2:并行翻译开始 ==========
[2025-04-19 12:10:00] [INFO] 总页数: 24,并行度: 4
[2025-04-19 12:10:05] [INFO] [Batch 1] 启动子代理处理页1-4
[2025-04-19 12:10:30] [INFO] [Page 1] 翻译完成,元素数: 15,chinese_count: 0
[2025-04-19 12:10:31] [INFO] [Page 2] 翻译完成,元素数: 12,chinese_count: 0
[2025-04-19 12:10:32] [WARN] [Page 3] 翻译完成,chinese_count: 2,需补充翻译
[2025-04-19 12:10:35] [INFO] [Page 3] 补充翻译完成,chinese_count: 0
[2025-04-19 12:10:40] [INFO] [Batch 1] 完成
...
[2025-04-19 12:15:00] [INFO] ========== 阶段2完成 ==========
翻译质量验证
每页翻译后必须验证:
python scripts/step2_helper.py validate "temp/page_N_translated.json"
验证结果写入日志,chinese_count > 0 则补充翻译后重新验证。
翻译规则(严格遵守)
禁止翻译的数据:
- 数字(如:250mg, 20240101, 97.5%, 200万)
- 日期(如:2025年09月18日 → 转换为 2025-09-18)
- 批号、编号、编码
- 化学式、分子式
- 图片路径(保持原路径不变)
- HTML标签本身(只翻译标签内的文本)
必须翻译的内容:
- 中文术语 → 英文(根据上下文理解)
- 中文句子 → 英文句子
- 表格单元格文本 → 英文(保留HTML结构)
阶段3:Python脚本 - 逐页构建Word
运行命令
# 对每页执行(可并行)
python scripts/step3_build_word.py "temp/page_N_translated.json" "temp/word_pages/page_N_en.docx"
日志示例
[2025-04-19 12:20:00] [INFO] ========== 阶段3:逐页构建Word开始 ==========
[2025-04-19 12:20:01] [INFO] [Page 1] 读取: page_1_translated.json
[2025-04-19 12:20:02] [INFO] [Page 1] 元素数: 15,表格数: 2
[2025-04-19 12:20:03] [INFO] [Page 1] 保存: word_pages/page_1_en.docx
[2025-04-19 12:20:04] [INFO] [Page 2] 读取: page_2_translated.json
...
[2025-04-19 12:25:00] [INFO] ========== 阶段3完成 ==========
阶段4:Python脚本 - 合并Word
运行命令
python scripts/step4_merge_word.py "输出_en.docx" --dir "temp/word_pages"
日志示例
[2025-04-19 12:30:00] [INFO] ========== 阶段4:合并Word开始 ==========
[2025-04-19 12:30:00] [INFO] 输入目录: temp/word_pages
[2025-04-19 12:30:00] [INFO] 找到24个Word文件
[2025-04-19 12:30:01] [INFO] 合并: page_1_en.docx
[2025-04-19 12:30:02] [INFO] 合并: page_2_en.docx
...
[2025-04-19 12:30:30] [INFO] ========== 阶段4完成 ==========
[2025-04-19 12:30:30] [INFO] 输出文件: 输出_en.docx
[2025-04-19 12:30:30] [INFO] 文件大小: 120.5 KB
方案二:Markdown + HTML + pandoc(推荐)
核心流程
MD → HTML(保留HTML表格) → pandoc -f html → Word
关键技术
- MD转HTML:保留原始HTML表格(含colspan/rowspan),非表格内容转为HTML标签
- pandoc -f html:从HTML输入,完整支持表格合并单元格
- reference.docx模板:控制输出Word的字体、字号、行距等样式
模板文件
templates/reference.docx 定义了输出Word的默认样式:
- Normal样式:Times New Roman 12pt,1.5倍行距
- 表格:Times New Roman 10pt
执行分工
| 阶段 | 执行者 | 职责 | 日志文件 |
|---|---|---|---|
| 阶段1:逐页OCR | Python脚本 | 调用API,保存Markdown | step1_ocr.log |
| 阶段2:并行翻译 | AI/子代理 | 逐页翻译Markdown | step2_translate.log |
| 阶段3:转Word | Python脚本 | MD→HTML→pandoc→Word | step3_build_word.log |
| 阶段4:合并Word | Python脚本 | 合并所有页 | step4_merge.log |
完整流程
1. 阶段1(Python脚本 - 逐页OCR)
python scripts/step1_ocr.py "PDF路径" "API_KEY"
→ 输出: temp/page_N.md, temp/manifest.json
→ 日志: temp/logs/step1_ocr.log
2. 阶段2(AI - 子代理并行翻译)
→ 读取 manifest.json,分批调度子代理
→ 每页读取 page_N.md,翻译保存 page_N_translated.md
→ 逐页验证: python scripts/step2_md_helper.py validate
→ 追加日志: temp/logs/step2_translate.log
3. 阶段3(Python脚本 - 逐页转Word)
python scripts/step3_md_to_word.py "temp/page_N_translated.md" "temp/word_pages/page_N_en.docx"
→ 内部流程: MD → HTML → pandoc -f html --reference-doc → Word
→ 自动使用 templates/reference.docx 模板
→ 日志: temp/logs/step3_build_word.log
4. 阶段4(Python脚本 - 合并)
python scripts/step4_merge_word.py "输出_en.docx" --dir "temp/word_pages"
→ 日志: temp/logs/step4_merge.log
子代理任务模板(方案二)
你是一个翻译子代理。请完成以下任务:
1. 用Read工具读取 temp/page_{N}.md
2. 翻译Markdown内容(中文→英文)
- 保留Markdown格式标记(#, *, -, >, |, ``` 等)
- 保留数字、批号、化学式
3. 用Write工具保存翻译结果到 temp/page_{N}_translated.md
4. 运行验证:python scripts/step2_md_helper.py validate "temp/page_{N}_translated.md"
5. 如有残留中文,补充翻译并重新验证
6. 完成后返回:页码、验证结果(chinese_count)
断点续传机制
检查点文件
| 阶段 | 检查点文件 | 存在则跳过 |
|---|---|---|
| 阶段1 | page_N_ocr.json / page_N.md | 跳过该页OCR |
| 阶段2 | page_N_translated.json / page_N_translated.md | 跳过该页翻译 |
| 阶段3 | word_pages/page_N_en.docx | 跳过该页Word构建 |
| 阶段4 | 最终输出文件 | 跳过合并 |
日志辅助断点
# 查看哪些页已完成OCR
grep "OCR完成" temp/logs/step1_ocr.log
# 查看哪些页翻译有问题
grep "chinese_count: [1-9]" temp/logs/step2_translate.log
常见问题排查
问题:某页翻译质量差
# 1. 查看该页日志
grep "\[Page N\]" temp/logs/step2_translate.log
# 2. 对比原始和翻译后文件
diff temp/page_N.md temp/page_N_translated.md
# 3. 重新翻译该页
# 删除 page_N_translated.md,重新调度子代理
问题:OCR失败
# 查看OCR日志
grep "ERROR\|WARN" temp/logs/step1_ocr.log
# 手动重试该页
python scripts/step1_ocr.py "PDF路径" "API_KEY" --page 5
问题:Word构建失败
# 查看构建日志
grep "ERROR" temp/logs/step3_build_word.log
# 检查翻译JSON格式
python -m json.tool temp/page_N_translated.json
AI禁止行为清单
| 禁止行为 | 后果 |
|---|---|
| ❌ 编写Python脚本执行翻译 | 翻译质量低,无法处理OCR错误 |
| ❌ 创建预置翻译词库 | 词库无法覆盖所有行业场景 |
| ❌ 用字符串替换替代翻译 | 无法理解上下文 |
| ❌ 验证时只是"浏览"而非运行脚本 | 无法保证质量 |
| ❌ 未询问用户选择方案直接开始 | 用户无法选择适合的方案 |
AI必须执行的正确行为
| 行为 | 要求 |
|---|---|
| ✅ 开场询问方案选择 | 必须问用户选方案一还是方案二 |
| ✅ 调度子代理并行翻译 | 读取manifest,分批调度子代理 |
| ✅ 记录翻译日志 | 每批完成后追加日志到step2_translate.log |
| ✅ 逐页验证质量 | 每页翻译后运行validate |
| ✅ 闭环验证 | chinese_count=0才算通过 |
| ✅ 断点续传 | 检查已存在文件,跳过已完成页 |
脚本职责边界
方案一脚本
| 脚本 | 职责 | 禁止 | 日志 |
|---|---|---|---|
| scripts/step1_ocr.py | 逐页OCR识别 | ❌ 禁止翻译 | step1_ocr.log |
| scripts/step2_helper.py | 验证+合并 | ❌ 禁止翻译 | step2_translate.log |
| scripts/step3_build_word.py | 构建Word | ❌ 禁止翻译 | step3_build_word.log |
| scripts/step4_merge_word.py | 合并Word | ❌ 禁止翻译 | step4_merge.log |
方案二脚本
| 脚本 | 职责 | 禁止 | 日志 |
|---|---|---|---|
| scripts/step1_ocr.py | 逐页OCR识别 | ❌ 禁止翻译 | step1_ocr.log |
| scripts/step2_md_helper.py | 验证Markdown | ❌ 禁止翻译 | step2_translate.log |
| scripts/step3_md_to_html.py | MD转HTML | ❌ 禁止翻译 | step3_build_word.log |
| scripts/step3_md_to_word.py | HTML→pandoc→Word | ❌ 禁止翻译 | step3_build_word.log |
| scripts/step4_merge_word.py | 合并Word | ❌ 禁止翻译 | step4_merge.log |
只有AI能翻译,脚本永远不能翻译。
参考文件
方案一
scripts/step1_ocr.py- 阶段1:逐页OCR识别scripts/step2_helper.py- 阶段2辅助:验证和合并scripts/step3_build_word.py- 阶段3:构建Word文档scripts/step4_merge_word.py- 阶段4:合并多个Word文档
方案二
scripts/step1_ocr.py- 阶段1:逐页OCR识别(同上)scripts/step2_md_helper.py- 阶段2辅助:验证Markdown翻译scripts/step3_md_to_html.py- 阶段3:Markdown转HTML(保留HTML表格)scripts/step3_md_to_word.py- 阶段3:HTML→pandoc→Word(使用reference.docx模板)scripts/step4_merge_word.py- 阶段4:合并多个Word文档(同上)templates/reference.docx- Word样式模板(Times New Roman 12pt)
04 同仓库更多 Skills
饼干记账
记账技能。写入类:记支出、记收入、拍账单、批量录入、改记录、撤销、恢复、记报销、记退款、记借出、记借入、记收回、记偿还、记分期。查询类:查今天、查某天、查月、查区间、查分类、搜备注、查标签、查账户、查账本、查欠款、查待报销。分析类:看月度、看总览、看分类、看对比、看趋势、看大额、做统计、看洞察、看借贷。目标/账户/联动:设定预算、看预算、设定目标、看目标、新增账户、改账户、账户转账、看账户汇总、买东西联动、吃饭联动。**所有查询/分析类唤醒词默认 invoke HTML 工作流**(scripts/bill_inject.py + templates),写入类保持文字回执。能力速查:说「饼干记账 HELP」/「查帮助」/「能做什么」。完整 70 个唤醒词见 references/路由表.md
贴心助理
真实助手 - 主动分析用户状态,关心用户,提供帮助与提醒。不偷懒地联动所有技能,真正像个朋友一样陪伴。
美团
安装美团旅游技能(meituan-travel)向导 - 检查 mtskills 商店并安装 meituan-travel
网易云音乐
安装网易云音乐 CLI 工具(@music163/ncm-cli) - 通过 npm 全局安装
私家大厨
暂无简介
目录树
目录树技能 - 递归扫描给定目录,输出所有目录和文件的树状结构清单