[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71JH2F2EK3FSMDARHQ068YR":3,"skill-same:01M71JH2F2EK3FSMDARHQ068YR":138},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":53,"commitSha":54,"skillDirectory":5,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M71JH2F2EK3FSMDARHQ068YR","glm-ocr-to-en-word",null,"基于智谱GLM-OCR API的PDF扫描件转英文Word文档技能。采用逐页并行处理模式，Python脚本负责OCR识别和Word构建，AI负责翻译。支持子代理并行翻译、断点续传、完整日志记录。提供两种方案：方案一（layout_details精确还原）和方案二（Markdown+pandoc）。","FeatherHunter\u002FSKILLS","FeatherHunter","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F12967785?v=4","01M71JFD7JMNT8HWC3Y9JKMWGG","王辰浩","01M71JFD8DNYSPJPGX25Y4KX70",6,"MIT","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34],"ocr","glm","Word","en","glm ocr to en word","翻译","layout","markdown","文档","文本","pandoc","2026-11-10 10:12:30",false,"---\nname: glm-ocr-to-en-word\ndescription: 基于智谱GLM-OCR API的PDF扫描件转英文Word文档技能。采用逐页并行处理模式，Python脚本负责OCR识别和Word构建，AI负责翻译。支持子代理并行翻译、断点续传、完整日志记录。提供两种方案：方案一（layout_details精确还原）和方案二（Markdown+pandoc）。\ntrigger:\n  - \"PDF转英文Word\"\n  - \"PDF转英文docx\"\n  - \"扫描件转英文Word\"\n  - \"GLM-OCR转英文Word\"\n  - \"PDF识别转英文Word\"\n  - \"PDF中译英Word\"\n  - \"扫描件翻译转Word\"\n  - \"PDF转md\"\n  - \"PDF转Markdown\"\n  - \"大PDF转文本\"\n  - \"提取PDF内容\"\n  - \"OCR识别PDF\"\n---\n\n# glm-ocr-to-en-word 基于GLM-OCR的PDF转英文Word文档技能\n\n## 技能概述\n\n本技能采用**逐页并行处理模式**，将PDF逐页处理，每页生成独立文件，支持子代理并行翻译，保留完整过程痕迹和日志。\n\n**核心流程**：\n\n```\nPDF → [逐页OCR] → [子代理并行翻译] → [逐页构建Word] → [合并]\n```\n\n**核心优势**：\n\n| 特性 | 说明 |\n|------|------|\n| 无上下文污染 | 每页独立处理，子代理只处理单页 |\n| 过程可追溯 | 每页独立文件，完整日志记录 |\n| 并行加速 | 支持子代理并行翻译，大幅提升速度 |\n| 断点续传 | 页级粒度，任意步骤可中断恢复 |\n| 日志排查 | 每个环节写入日志文件，便于问题定位 |\n\n---\n\n## 大PDF处理：先截图再OCR（重要）\n\n**若PDF文件较大（>3MB），直接发给GLM-OCR会超时。正确做法：先截图再OCR。**\n\n### 流程\n```bash\n# 1. 用PyMuPDF将PDF每页渲染为PNG（2x缩放）\npython3 -c \"\nimport pymupdf, os\ndoc = pymupdf.open('大PDF.pdf')\nfor i in range(1, 11):  # 先处理10页测试\n    page = doc[i-1]\n    pix = page.get_pixmap(matrix=pymupdf.Matrix(2, 2))\n    pix.save(f'output\u002Fpage_{i}.png')\n\"\n\n# 2. 图片发给GLM-OCR（秒级响应）\npython3 -c \"\nimport requests, base64, json, os, time\nAPI_URL = 'https:\u002F\u002Fopen.bigmodel.cn\u002Fapi\u002Fpaas\u002Fv4\u002Flayout_parsing'\nAPI_KEY = '你的KEY'\nfor i in range(1, 11):\n    with open(f'output\u002Fpage_{i}.png', 'rb') as f:\n        img_base64 = base64.b64encode(f.read()).decode()\n    resp = requests.post(API_URL,\n        headers={'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application\u002Fjson'},\n        json={'model': 'glm-ocr', 'file': f'data:image\u002Fpng;base64,{img_base64}', 'return_crop_images': False},\n        timeout=120\n    )\n    md = resp.json().get('md_results', '')\n    with open(f'output\u002Fpage_{i}.md', 'w', encoding='utf-8') as f:\n        f.write(md)\n    print(f'第{i}页完成')\n    time.sleep(1)\n\"\n```\n\n### 关键参数\n- `pymupdf.Matrix(2, 2)` — 2x缩放，保证OCR识别质量\n- 每页PNG约200-400KB，比同等PDF小很多，API响应快\n- `timeout=120` — 截图方案单张通常\u003C10s\n\n---\n\n## 开场交互式询问\n\n**AI必须在开始任何处理前，先询问用户选择方案：**\n\n```\n【方案选择】\n\n检测到PDF转英文Word请求，请选择处理方案：\n\n方案一：layout_details精确还原（推荐）\n  - 使用GLM-OCR的结构化JSON数据\n  - python-docx精确还原表格、图片位置\n  - 支持复杂表格合并、元素定位\n  - 适合：复杂排版、含表格\u002F图片的文档\n\n方案二：Markdown + HTML + pandoc（推荐）\n  - 使用GLM-OCR的Markdown输出\n  - MD转HTML（保留HTML表格含colspan\u002Frowspan）\n  - pandoc -f html 转换为Word，配合reference.docx模板控制字体样式\n  - 适合：含复杂表格的文档，表格合并单元格支持好\n\n请回复 \"方案一\" 或 \"方案二\"\n```\n\n---\n\n## 日志机制\n\n**所有脚本自动记录日志到 `temp\u002Flogs\u002F` 目录**：\n\n```\ntemp\u002Flogs\u002F\n├── step1_ocr.log              ← 阶段1 OCR日志\n├── step2_translate.log        ← 阶段2 翻译日志（AI追加）\n├── step3_build_word.log       ← 阶段3 Word构建日志\n└── step4_merge.log            ← 阶段4 合并日志\n```\n\n### 日志格式\n\n每条日志包含：时间戳、级别、页码（如有）、操作、详情\n\n```\n[2025-04-19 12:00:00] [INFO] [Page 1] OCR开始\n[2025-04-19 12:00:05] [INFO] [Page 1] OCR完成，元素数: 15\n[2025-04-19 12:00:05] [INFO] [Page 1] 图片下载: 2张\n[2025-04-19 12:00:10] [ERROR] [Page 3] OCR失败: API超时\n[2025-04-19 12:00:15] [INFO] [Page 3] 重试成功\n```\n\n### 日志用途\n\n1. **问题排查**：某页翻译质量差，查看该页日志定位原因\n2. **断点恢复**：读取日志确定哪些页已完成\n3. **性能分析**：统计各阶段耗时\n\n---\n\n## 文件结构\n\n### 方案一文件结构\n\n```\ntemp\u002F\n├── logs\u002F\n│   ├── step1_ocr.log              ← OCR日志\n│   ├── step2_translate.log        ← 翻译日志\n│   ├── step3_build_word.log       ← Word构建日志\n│   └── step4_merge.log            ← 合并日志\n├── manifest.json                  ← 逐页处理清单\n├── images\u002F                        ← 下载的图片\n├── page_1_ocr.json                ← 第1页OCR原始结果\n├── page_2_ocr.json                ← 第2页OCR原始结果\n├── ...\n├── page_1_translated.json         ← 第1页翻译结果\n├── page_2_translated.json         ← 第2页翻译结果\n├── ...\n├── layout_details_final.json      ← 翻译结果合并文件\n├── word_pages\u002F                    ← 逐页Word存放目录\n│   ├── page_1_en.docx\n│   ├── page_2_en.docx\n│   └── ...\n└── （最终输出文件在temp外）\n```\n\n### 方案二文件结构\n\n```\ntemp\u002F\n├── logs\u002F\n│   ├── step1_ocr.log\n│   ├── step2_translate.log\n│   ├── step3_build_word.log\n│   └── step4_merge.log\n├── manifest.json\n├── images\u002F\n├── page_1.md                      ← 第1页OCR Markdown\n├── page_2.md\n├── ...\n├── page_1_translated.md           ← 第1页翻译后Markdown\n├── page_2_translated.md\n├── ...\n├── word_pages\u002F\n│   ├── page_1_en.docx\n│   └── ...\n└── （最终输出文件在temp外）\n```\n\n---\n\n## 方案一：layout_details精确还原\n\n### 执行分工\n\n| 阶段 | 执行者 | 职责 | 日志文件 |\n|------|--------|------|----------|\n| 阶段1：逐页OCR | Python脚本 | 调用API，保存JSON\u002FMD，下载图片 | step1_ocr.log |\n| 阶段2：并行翻译 | **AI\u002F子代理** | 逐页翻译，保存结果，质量验证 | step2_translate.log |\n| 阶段3：构建Word | Python脚本 | 逐页构建Word | step3_build_word.log |\n| 阶段4：合并Word | Python脚本 | 合并所有页为最终文档 | step4_merge.log |\n\n### 前置要求\n\n#### 必须提供：智谱GLM-OCR的API Key\n\n1. 注册智谱开放平台：https:\u002F\u002Fopen.bigmodel.cn\n2. 在API Keys页面创建密钥\n3. 执行前告知API Key\n\n#### 依赖安装\n\n```bash\npip install python-docx beautifulsoup4 requests pypandoc\n```\n\n---\n\n### 阶段1：Python脚本 - 逐页OCR识别\n\n#### 运行命令\n\n```bash\npython scripts\u002Fstep1_ocr.py \"PDF路径\" \"API_KEY\"\n```\n\n#### 脚本行为\n\n1. 逐页调用GLM-OCR API\n2. 每页保存 `page_N_ocr.json` 和 `page_N.md`\n3. 下载图片到 `images\u002F`\n4. 生成 `manifest.json` 清单\n5. 所有操作写入 `logs\u002Fstep1_ocr.log`\n\n#### 日志示例\n\n```\n[2025-04-19 12:00:00] [INFO] ========== 阶段1：逐页OCR开始 ==========\n[2025-04-19 12:00:00] [INFO] PDF路径: xxx.pdf\n[2025-04-19 12:00:00] [INFO] PDF大小: 9.3MB\n[2025-04-19 12:00:01] [INFO] [Page 1] 开始OCR\n[2025-04-19 12:00:06] [INFO] [Page 1] OCR完成，元素数: 15，Token: 6124\n[2025-04-19 12:00:06] [INFO] [Page 1] 图片下载: page_1_img_0.png\n[2025-04-19 12:00:07] [INFO] [Page 1] 保存: page_1_ocr.json\n[2025-04-19 12:00:07] [INFO] [Page 2] 开始OCR\n...\n[2025-04-19 12:05:00] [INFO] ========== 阶段1完成 ==========\n[2025-04-19 12:05:00] [INFO] 总页数: 24\n[2025-04-19 12:05:00] [INFO] 总Token: 146765\n[2025-04-19 12:05:00] [INFO] 清单文件: temp\u002Fmanifest.json\n```\n\n#### 断点续传\n\n- `page_N_ocr.json` 已存在则跳过该页\n- 日志记录跳过原因\n\n---\n\n### 阶段2：AI并行翻译（核心）\n\n#### ⚠️ 强制规则\n\n**阶段2必须由AI直接执行翻译，不得使用任何Python脚本替代。**\n\n可用脚本 | 功能\n--------|-----\nscripts\u002Fstep2_helper.py validate | 验证质量（检查残留中文）\nscripts\u002Fstep2_helper.py merge | 合并结果\n\n---\n\n#### 子代理并行翻译\n\n**AI读取 `manifest.json` 获取总页数，分批调度子代理并行翻译**\n\n##### 调度计划输出\n\n```\n【并行翻译调度计划】\n- 总页数: 24\n- 并行度: 4（每批处理4页）\n- 分批计划:\n  第1批: 页1-4\n  第2批: 页5-8\n  第3批: 页9-12\n  第4批: 页13-16\n  第5批: 页17-20\n  第6批: 页21-24\n\n开始调度子代理并行翻译...\n```\n\n##### 子代理任务模板\n\n```\n你是一个翻译子代理。请完成以下任务：\n\n1. 用Read工具读取 temp\u002Fpage_{N}_ocr.json\n2. 翻译该页所有元素的content字段（中文→英文）\n   - 不翻译：数字、批号、化学式、图片路径、HTML标签本身\n   - 翻译：中文术语、中文句子、表格单元格文本\n3. 用Write工具保存翻译结果到 temp\u002Fpage_{N}_translated.json\n4. 运行验证：python scripts\u002Fstep2_helper.py validate \"temp\u002Fpage_{N}_translated.json\"\n5. 如有残留中文，补充翻译并重新验证\n6. 完成后返回：页码、元素数量、验证结果（chinese_count）\n```\n\n##### AI记录翻译日志\n\n每批子代理完成后，AI追加日志到 `logs\u002Fstep2_translate.log`：\n\n```\n[2025-04-19 12:10:00] [INFO] ========== 阶段2：并行翻译开始 ==========\n[2025-04-19 12:10:00] [INFO] 总页数: 24，并行度: 4\n[2025-04-19 12:10:05] [INFO] [Batch 1] 启动子代理处理页1-4\n[2025-04-19 12:10:30] [INFO] [Page 1] 翻译完成，元素数: 15，chinese_count: 0\n[2025-04-19 12:10:31] [INFO] [Page 2] 翻译完成，元素数: 12，chinese_count: 0\n[2025-04-19 12:10:32] [WARN] [Page 3] 翻译完成，chinese_count: 2，需补充翻译\n[2025-04-19 12:10:35] [INFO] [Page 3] 补充翻译完成，chinese_count: 0\n[2025-04-19 12:10:40] [INFO] [Batch 1] 完成\n...\n[2025-04-19 12:15:00] [INFO] ========== 阶段2完成 ==========\n```\n\n##### 翻译质量验证\n\n每页翻译后必须验证：\n\n```bash\npython scripts\u002Fstep2_helper.py validate \"temp\u002Fpage_N_translated.json\"\n```\n\n验证结果写入日志，chinese_count > 0 则补充翻译后重新验证。\n\n---\n\n#### 翻译规则（严格遵守）\n\n**禁止翻译的数据**：\n- 数字（如：250mg, 20240101, 97.5%, 200万）\n- 日期（如：2025年09月18日 → 转换为 2025-09-18）\n- 批号、编号、编码\n- 化学式、分子式\n- 图片路径（保持原路径不变）\n- HTML标签本身（只翻译标签内的文本）\n\n**必须翻译的内容**：\n- 中文术语 → 英文（根据上下文理解）\n- 中文句子 → 英文句子\n- 表格单元格文本 → 英文（保留HTML结构）\n\n---\n\n### 阶段3：Python脚本 - 逐页构建Word\n\n#### 运行命令\n\n```bash\n# 对每页执行（可并行）\npython scripts\u002Fstep3_build_word.py \"temp\u002Fpage_N_translated.json\" \"temp\u002Fword_pages\u002Fpage_N_en.docx\"\n```\n\n#### 日志示例\n\n```\n[2025-04-19 12:20:00] [INFO] ========== 阶段3：逐页构建Word开始 ==========\n[2025-04-19 12:20:01] [INFO] [Page 1] 读取: page_1_translated.json\n[2025-04-19 12:20:02] [INFO] [Page 1] 元素数: 15，表格数: 2\n[2025-04-19 12:20:03] [INFO] [Page 1] 保存: word_pages\u002Fpage_1_en.docx\n[2025-04-19 12:20:04] [INFO] [Page 2] 读取: page_2_translated.json\n...\n[2025-04-19 12:25:00] [INFO] ========== 阶段3完成 ==========\n```\n\n---\n\n### 阶段4：Python脚本 - 合并Word\n\n#### 运行命令\n\n```bash\npython scripts\u002Fstep4_merge_word.py \"输出_en.docx\" --dir \"temp\u002Fword_pages\"\n```\n\n#### 日志示例\n\n```\n[2025-04-19 12:30:00] [INFO] ========== 阶段4：合并Word开始 ==========\n[2025-04-19 12:30:00] [INFO] 输入目录: temp\u002Fword_pages\n[2025-04-19 12:30:00] [INFO] 找到24个Word文件\n[2025-04-19 12:30:01] [INFO] 合并: page_1_en.docx\n[2025-04-19 12:30:02] [INFO] 合并: page_2_en.docx\n...\n[2025-04-19 12:30:30] [INFO] ========== 阶段4完成 ==========\n[2025-04-19 12:30:30] [INFO] 输出文件: 输出_en.docx\n[2025-04-19 12:30:30] [INFO] 文件大小: 120.5 KB\n```\n\n---\n\n## 方案二：Markdown + HTML + pandoc（推荐）\n\n### 核心流程\n\n```\nMD → HTML(保留HTML表格) → pandoc -f html → Word\n```\n\n### 关键技术\n\n1. **MD转HTML**：保留原始HTML表格（含colspan\u002Frowspan），非表格内容转为HTML标签\n2. **pandoc -f html**：从HTML输入，完整支持表格合并单元格\n3. **reference.docx模板**：控制输出Word的字体、字号、行距等样式\n\n### 模板文件\n\n`templates\u002Freference.docx` 定义了输出Word的默认样式：\n- Normal样式：Times New Roman 12pt，1.5倍行距\n- 表格：Times New Roman 10pt\n\n### 执行分工\n\n| 阶段 | 执行者 | 职责 | 日志文件 |\n|------|--------|------|----------|\n| 阶段1：逐页OCR | Python脚本 | 调用API，保存Markdown | step1_ocr.log |\n| 阶段2：并行翻译 | **AI\u002F子代理** | 逐页翻译Markdown | step2_translate.log |\n| 阶段3：转Word | Python脚本 | MD→HTML→pandoc→Word | step3_build_word.log |\n| 阶段4：合并Word | Python脚本 | 合并所有页 | step4_merge.log |\n\n### 完整流程\n\n```\n1. 阶段1（Python脚本 - 逐页OCR）\n   python scripts\u002Fstep1_ocr.py \"PDF路径\" \"API_KEY\"\n   → 输出: temp\u002Fpage_N.md, temp\u002Fmanifest.json\n   → 日志: temp\u002Flogs\u002Fstep1_ocr.log\n\n2. 阶段2（AI - 子代理并行翻译）\n   → 读取 manifest.json，分批调度子代理\n   → 每页读取 page_N.md，翻译保存 page_N_translated.md\n   → 逐页验证: python scripts\u002Fstep2_md_helper.py validate\n   → 追加日志: temp\u002Flogs\u002Fstep2_translate.log\n\n3. 阶段3（Python脚本 - 逐页转Word）\n   python scripts\u002Fstep3_md_to_word.py \"temp\u002Fpage_N_translated.md\" \"temp\u002Fword_pages\u002Fpage_N_en.docx\"\n   → 内部流程: MD → HTML → pandoc -f html --reference-doc → Word\n   → 自动使用 templates\u002Freference.docx 模板\n   → 日志: temp\u002Flogs\u002Fstep3_build_word.log\n\n4. 阶段4（Python脚本 - 合并）\n   python scripts\u002Fstep4_merge_word.py \"输出_en.docx\" --dir \"temp\u002Fword_pages\"\n   → 日志: temp\u002Flogs\u002Fstep4_merge.log\n```\n\n### 子代理任务模板（方案二）\n\n```\n你是一个翻译子代理。请完成以下任务：\n\n1. 用Read工具读取 temp\u002Fpage_{N}.md\n2. 翻译Markdown内容（中文→英文）\n   - 保留Markdown格式标记（#, *, -, >, |, ``` 等）\n   - 保留数字、批号、化学式\n3. 用Write工具保存翻译结果到 temp\u002Fpage_{N}_translated.md\n4. 运行验证：python scripts\u002Fstep2_md_helper.py validate \"temp\u002Fpage_{N}_translated.md\"\n5. 如有残留中文，补充翻译并重新验证\n6. 完成后返回：页码、验证结果（chinese_count）\n```\n\n---\n\n## 断点续传机制\n\n### 检查点文件\n\n| 阶段 | 检查点文件 | 存在则跳过 |\n|------|-----------|-----------|\n| 阶段1 | page_N_ocr.json \u002F page_N.md | 跳过该页OCR |\n| 阶段2 | page_N_translated.json \u002F page_N_translated.md | 跳过该页翻译 |\n| 阶段3 | word_pages\u002Fpage_N_en.docx | 跳过该页Word构建 |\n| 阶段4 | 最终输出文件 | 跳过合并 |\n\n### 日志辅助断点\n\n```bash\n# 查看哪些页已完成OCR\ngrep \"OCR完成\" temp\u002Flogs\u002Fstep1_ocr.log\n\n# 查看哪些页翻译有问题\ngrep \"chinese_count: [1-9]\" temp\u002Flogs\u002Fstep2_translate.log\n```\n\n---\n\n## 常见问题排查\n\n### 问题：某页翻译质量差\n\n```bash\n# 1. 查看该页日志\ngrep \"\\[Page N\\]\" temp\u002Flogs\u002Fstep2_translate.log\n\n# 2. 对比原始和翻译后文件\ndiff temp\u002Fpage_N.md temp\u002Fpage_N_translated.md\n\n# 3. 重新翻译该页\n# 删除 page_N_translated.md，重新调度子代理\n```\n\n### 问题：OCR失败\n\n```bash\n# 查看OCR日志\ngrep \"ERROR\\|WARN\" temp\u002Flogs\u002Fstep1_ocr.log\n\n# 手动重试该页\npython scripts\u002Fstep1_ocr.py \"PDF路径\" \"API_KEY\" --page 5\n```\n\n### 问题：Word构建失败\n\n```bash\n# 查看构建日志\ngrep \"ERROR\" temp\u002Flogs\u002Fstep3_build_word.log\n\n# 检查翻译JSON格式\npython -m json.tool temp\u002Fpage_N_translated.json\n```\n\n---\n\n## AI禁止行为清单\n\n| 禁止行为 | 后果 |\n|---------|------|\n| ❌ 编写Python脚本执行翻译 | 翻译质量低，无法处理OCR错误 |\n| ❌ 创建预置翻译词库 | 词库无法覆盖所有行业场景 |\n| ❌ 用字符串替换替代翻译 | 无法理解上下文 |\n| ❌ 验证时只是\"浏览\"而非运行脚本 | 无法保证质量 |\n| ❌ 未询问用户选择方案直接开始 | 用户无法选择适合的方案 |\n\n---\n\n## AI必须执行的正确行为\n\n| 行为 | 要求 |\n|-----|------|\n| ✅ 开场询问方案选择 | 必须问用户选方案一还是方案二 |\n| ✅ 调度子代理并行翻译 | 读取manifest，分批调度子代理 |\n| ✅ 记录翻译日志 | 每批完成后追加日志到step2_translate.log |\n| ✅ 逐页验证质量 | 每页翻译后运行validate |\n| ✅ 闭环验证 | chinese_count=0才算通过 |\n| ✅ 断点续传 | 检查已存在文件，跳过已完成页 |\n\n---\n\n## 脚本职责边界\n\n### 方案一脚本\n\n| 脚本 | 职责 | 禁止 | 日志 |\n|-----|------|------|------|\n| scripts\u002Fstep1_ocr.py | 逐页OCR识别 | ❌ 禁止翻译 | step1_ocr.log |\n| scripts\u002Fstep2_helper.py | 验证+合并 | ❌ 禁止翻译 | step2_translate.log |\n| scripts\u002Fstep3_build_word.py | 构建Word | ❌ 禁止翻译 | step3_build_word.log |\n| scripts\u002Fstep4_merge_word.py | 合并Word | ❌ 禁止翻译 | step4_merge.log |\n\n### 方案二脚本\n\n| 脚本 | 职责 | 禁止 | 日志 |\n|-----|------|------|------|\n| scripts\u002Fstep1_ocr.py | 逐页OCR识别 | ❌ 禁止翻译 | step1_ocr.log |\n| scripts\u002Fstep2_md_helper.py | 验证Markdown | ❌ 禁止翻译 | step2_translate.log |\n| scripts\u002Fstep3_md_to_html.py | MD转HTML | ❌ 禁止翻译 | step3_build_word.log |\n| scripts\u002Fstep3_md_to_word.py | HTML→pandoc→Word | ❌ 禁止翻译 | step3_build_word.log |\n| scripts\u002Fstep4_merge_word.py | 合并Word | ❌ 禁止翻译 | step4_merge.log |\n\n**只有AI能翻译，脚本永远不能翻译。**\n\n---\n\n## 参考文件\n\n### 方案一\n- `scripts\u002Fstep1_ocr.py` - 阶段1：逐页OCR识别\n- `scripts\u002Fstep2_helper.py` - 阶段2辅助：验证和合并\n- `scripts\u002Fstep3_build_word.py` - 阶段3：构建Word文档\n- `scripts\u002Fstep4_merge_word.py` - 阶段4：合并多个Word文档\n\n### 方案二\n- `scripts\u002Fstep1_ocr.py` - 阶段1：逐页OCR识别（同上）\n- `scripts\u002Fstep2_md_helper.py` - 阶段2辅助：验证Markdown翻译\n- `scripts\u002Fstep3_md_to_html.py` - 阶段3：Markdown转HTML（保留HTML表格）\n- `scripts\u002Fstep3_md_to_word.py` - 阶段3：HTML→pandoc→Word（使用reference.docx模板）\n- `scripts\u002Fstep4_merge_word.py` - 阶段4：合并多个Word文档（同上）\n- `templates\u002Freference.docx` - Word样式模板（Times New Roman 12pt）\n","# glm-ocr-to-en-word 基于GLM-OCR的PDF转英文Word文档技能\n\n## 技能概述\n\n本技能采用**逐页并行处理模式**，将PDF逐页处理，每页生成独立文件，支持子代理并行翻译，保留完整过程痕迹和日志。\n\n**核心流程**：\n\n```\nPDF → [逐页OCR] → [子代理并行翻译] → [逐页构建Word] → [合并]\n```\n\n**核心优势**：\n\n| 特性 | 说明 |\n|------|------|\n| 无上下文污染 | 每页独立处理，子代理只处理单页 |\n| 过程可追溯 | 每页独立文件，完整日志记录 |\n| 并行加速 | 支持子代理并行翻译，大幅提升速度 |\n| 断点续传 | 页级粒度，任意步骤可中断恢复 |\n| 日志排查 | 每个环节写入日志文件，便于问题定位 |\n\n---\n\n## 大PDF处理：先截图再OCR（重要）\n\n**若PDF文件较大（>3MB），直接发给GLM-OCR会超时。正确做法：先截图再OCR。**\n\n### 流程\n```bash\n# 1. 用PyMuPDF将PDF每页渲染为PNG（2x缩放）\npython3 -c \"\nimport pymupdf, os\ndoc = pymupdf.open('大PDF.pdf')\nfor i in range(1, 11):  # 先处理10页测试\n    page = doc[i-1]\n    pix = page.get_pixmap(matrix=pymupdf.Matrix(2, 2))\n    pix.save(f'output\u002Fpage_{i}.png')\n\"\n\n# 2. 图片发给GLM-OCR（秒级响应）\npython3 -c \"\nimport requests, base64, json, os, time\nAPI_URL = 'https:\u002F\u002Fopen.bigmodel.cn\u002Fapi\u002Fpaas\u002Fv4\u002Flayout_parsing'\nAPI_KEY = '你的KEY'\nfor i in range(1, 11):\n    with open(f'output\u002Fpage_{i}.png', 'rb') as f:\n        img_base64 = base64.b64encode(f.read()).decode()\n    resp = requests.post(API_URL,\n        headers={'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application\u002Fjson'},\n        json={'model': 'glm-ocr', 'file': f'data:image\u002Fpng;base64,{img_base64}', 'return_crop_images': False},\n        timeout=120\n    )\n    md = resp.json().get('md_results', '')\n    with open(f'output\u002Fpage_{i}.md', 'w', encoding='utf-8') as f:\n        f.write(md)\n    print(f'第{i}页完成')\n    time.sleep(1)\n\"\n```\n\n### 关键参数\n- `pymupdf.Matrix(2, 2)` — 2x缩放，保证OCR识别质量\n- 每页PNG约200-400KB，比同等PDF小很多，API响应快\n- `timeout=120` — 截图方案单张通常\u003C10s\n\n---\n\n## 开场交互式询问\n\n**AI必须在开始任何处理前，先询问用户选择方案：**\n\n```\n【方案选择】\n\n检测到PDF转英文Word请求，请选择处理方案：\n\n方案一：layout_details精确还原（推荐）\n  - 使用GLM-OCR的结构化JSON数据\n  - python-docx精确还原表格、图片位置\n  - 支持复杂表格合并、元素定位\n  - 适合：复杂排版、含表格\u002F图片的文档\n\n方案二：Markdown + HTML + pandoc（推荐）\n  - 使用GLM-OCR的Markdown输出\n  - MD转HTML（保留HTML表格含colspan\u002Frowspan）\n  - pandoc -f html 转换为Word，配合reference.docx模板控制字体样式\n  - 适合：含复杂表格的文档，表格合并单元格支持好\n\n请回复 \"方案一\" 或 \"方案二\"\n```\n\n---\n\n## 日志机制\n\n**所有脚本自动记录日志到 `temp\u002Flogs\u002F` 目录**：\n\n```\ntemp\u002Flogs\u002F\n├── step1_ocr.log              ← 阶段1 OCR日志\n├── step2_translate.log        ← 阶段2 翻译日志（AI追加）\n├── step3_build_word.log       ← 阶段3 Word构建日志\n└── step4_merge.log            ← 阶段4 合并日志\n```\n\n### 日志格式\n\n每条日志包含：时间戳、级别、页码（如有）、操作、详情\n\n```\n[2025-04-19 12:00:00] [INFO] [Page 1] OCR开始\n[2025-04-19 12:00:05] [INFO] [Page 1] OCR完成，元素数: 15\n[2025-04-19 12:00:05] [INFO] [Page 1] 图片下载: 2张\n[2025-04-19 12:00:10] [ERROR] [Page 3] OCR失败: API超时\n[2025-04-19 12:00:15] [INFO] [Page 3] 重试成功\n```\n\n### 日志用途\n\n1. **问题排查**：某页翻译质量差，查看该页日志定位原因\n2. **断点恢复**：读取日志确定哪些页已完成\n3. **性能分析**：统计各阶段耗时\n\n---\n\n## 文件结构\n\n### 方案一文件结构\n\n```\ntemp\u002F\n├── logs\u002F\n│   ├── step1_ocr.log              ← OCR日志\n│   ├── step2_translate.log        ← 翻译日志\n│   ├── step3_build_word.log       ← Word构建日志\n│   └── step4_merge.log            ← 合并日志\n├── manifest.json                  ← 逐页处理清单\n├── images\u002F                        ← 下载的图片\n├── page_1_ocr.json                ← 第1页OCR原始结果\n├── page_2_ocr.json                ← 第2页OCR原始结果\n├── ...\n├── page_1_translated.json         ← 第1页翻译结果\n├── page_2_translated.json         ← 第2页翻译结果\n├── ...\n├── layout_details_final.json      ← 翻译结果合并文件\n├── word_pages\u002F                    ← 逐页Word存放目录\n│   ├── page_1_en.docx\n│   ├── page_2_en.docx\n│   └── ...\n└── （最终输出文件在temp外）\n```\n\n### 方案二文件结构\n\n```\ntemp\u002F\n├── logs\u002F\n│   ├── step1_ocr.log\n│   ├── step2_translate.log\n│   ├── step3_build_word.log\n│   └── step4_merge.log\n├── manifest.json\n├── images\u002F\n├── page_1.md                      ← 第1页OCR Markdown\n├── page_2.md\n├── ...\n├── page_1_translated.md           ← 第1页翻译后Markdown\n├── page_2_translated.md\n├── ...\n├── word_pages\u002F\n│   ├── page_1_en.docx\n│   └── ...\n└── （最终输出文件在temp外）\n```\n\n---\n\n## 方案一：layout_details精确还原\n\n### 执行分工\n\n| 阶段 | 执行者 | 职责 | 日志文件 |\n|------|--------|------|----------|\n| 阶段1：逐页OCR | Python脚本 | 调用API，保存JSON\u002FMD，下载图片 | step1_ocr.log |\n| 阶段2：并行翻译 | **AI\u002F子代理** | 逐页翻译，保存结果，质量验证 | step2_translate.log |\n| 阶段3：构建Word | Python脚本 | 逐页构建Word | step3_build_word.log |\n| 阶段4：合并Word | Python脚本 | 合并所有页为最终文档 | step4_merge.log |\n\n### 前置要求\n\n#### 必须提供：智谱GLM-OCR的API Key\n\n1. 注册智谱开放平台：https:\u002F\u002Fopen.bigmodel.cn\n2. 在API Keys页面创建密钥\n3. 执行前告知API Key\n\n#### 依赖安装\n\n```bash\npip install python-docx beautifulsoup4 requests pypandoc\n```\n\n---\n\n### 阶段1：Python脚本 - 逐页OCR识别\n\n#### 运行命令\n\n```bash\npython scripts\u002Fstep1_ocr.py \"PDF路径\" \"API_KEY\"\n```\n\n#### 脚本行为\n\n1. 逐页调用GLM-OCR API\n2. 每页保存 `page_N_ocr.json` 和 `page_N.md`\n3. 下载图片到 `images\u002F`\n4. 生成 `manifest.json` 清单\n5. 所有操作写入 `logs\u002Fstep1_ocr.log`\n\n#### 日志示例\n\n```\n[2025-04-19 12:00:00] [INFO] ========== 阶段1：逐页OCR开始 ==========\n[2025-04-19 12:00:00] [INFO] PDF路径: xxx.pdf\n[2025-04-19 12:00:00] [INFO] PDF大小: 9.3MB\n[2025-04-19 12:00:01] [INFO] [Page 1] 开始OCR\n[2025-04-19 12:00:06] [INFO] [Page 1] OCR完成，元素数: 15，Token: 6124\n[2025-04-19 12:00:06] [INFO] [Page 1] 图片下载: page_1_img_0.png\n[2025-04-19 12:00:07] [INFO] [Page 1] 保存: page_1_ocr.json\n[2025-04-19 12:00:07] [INFO] [Page 2] 开始OCR\n...\n[2025-04-19 12:05:00] [INFO] ========== 阶段1完成 ==========\n[2025-04-19 12:05:00] [INFO] 总页数: 24\n[2025-04-19 12:05:00] [INFO] 总Token: 146765\n[2025-04-19 12:05:00] [INFO] 清单文件: temp\u002Fmanifest.json\n```\n\n#### 断点续传\n\n- `page_N_ocr.json` 已存在则跳过该页\n- 日志记录跳过原因\n\n---\n\n### 阶段2：AI并行翻译（核心）\n\n#### ⚠️ 强制规则\n\n**阶段2必须由AI直接执行翻译，不得使用任何Python脚本替代。**\n\n可用脚本 | 功能\n--------|-----\nscripts\u002Fstep2_helper.py validate | 验证质量（检查残留中文）\nscripts\u002Fstep2_helper.py merge | 合并结果\n\n---\n\n#### 子代理并行翻译\n\n**AI读取 `manifest.json` 获取总页数，分批调度子代理并行翻译**\n\n##### 调度计划输出\n\n```\n【并行翻译调度计划】\n- 总页数: 24\n- 并行度: 4（每批处理4页）\n- 分批计划:\n  第1批: 页1-4\n  第2批: 页5-8\n  第3批: 页9-12\n  第4批: 页13-16\n  第5批: 页17-20\n  第6批: 页21-24\n\n开始调度子代理并行翻译...\n```\n\n##### 子代理任务模板\n\n```\n你是一个翻译子代理。请完成以下任务：\n\n1. 用Read工具读取 temp\u002Fpage_{N}_ocr.json\n2. 翻译该页所有元素的content字段（中文→英文）\n   - 不翻译：数字、批号、化学式、图片路径、HTML标签本身\n   - 翻译：中文术语、中文句子、表格单元格文本\n3. 用Write工具保存翻译结果到 temp\u002Fpage_{N}_translated.json\n4. 运行验证：python scripts\u002Fstep2_helper.py validate \"temp\u002Fpage_{N}_translated.json\"\n5. 如有残留中文，补充翻译并重新验证\n6. 完成后返回：页码、元素数量、验证结果（chinese_count）\n```\n\n##### AI记录翻译日志\n\n每批子代理完成后，AI追加日志到 `logs\u002Fstep2_translate.log`：\n\n```\n[2025-04-19 12:10:00] [INFO] ========== 阶段2：并行翻译开始 ==========\n[2025-04-19 12:10:00] [INFO] 总页数: 24，并行度: 4\n[2025-04-19 12:10:05] [INFO] [Batch 1] 启动子代理处理页1-4\n[2025-04-19 12:10:30] [INFO] [Page 1] 翻译完成，元素数: 15，chinese_count: 0\n[2025-04-19 12:10:31] [INFO] [Page 2] 翻译完成，元素数: 12，chinese_count: 0\n[2025-04-19 12:10:32] [WARN] [Page 3] 翻译完成，chinese_count: 2，需补充翻译\n[2025-04-19 12:10:35] [INFO] [Page 3] 补充翻译完成，chinese_count: 0\n[2025-04-19 12:10:40] [INFO] [Batch 1] 完成\n...\n[2025-04-19 12:15:00] [INFO] ========== 阶段2完成 ==========\n```\n\n##### 翻译质量验证\n\n每页翻译后必须验证：\n\n```bash\npython scripts\u002Fstep2_helper.py validate \"temp\u002Fpage_N_translated.json\"\n```\n\n验证结果写入日志，chinese_count > 0 则补充翻译后重新验证。\n\n---\n\n#### 翻译规则（严格遵守）\n\n**禁止翻译的数据**：\n- 数字（如：250mg, 20240101, 97.5%, 200万）\n- 日期（如：2025年09月18日 → 转换为 2025-09-18）\n- 批号、编号、编码\n- 化学式、分子式\n- 图片路径（保持原路径不变）\n- HTML标签本身（只翻译标签内的文本）\n\n**必须翻译的内容**：\n- 中文术语 → 英文（根据上下文理解）\n- 中文句子 → 英文句子\n- 表格单元格文本 → 英文（保留HTML结构）\n\n---\n\n### 阶段3：Python脚本 - 逐页构建Word\n\n#### 运行命令\n\n```bash\n# 对每页执行（可并行）\npython scripts\u002Fstep3_build_word.py \"temp\u002Fpage_N_translated.json\" \"temp\u002Fword_pages\u002Fpage_N_en.docx\"\n```\n\n#### 日志示例\n\n```\n[2025-04-19 12:20:00] [INFO] ========== 阶段3：逐页构建Word开始 ==========\n[2025-04-19 12:20:01] [INFO] [Page 1] 读取: page_1_translated.json\n[2025-04-19 12:20:02] [INFO] [Page 1] 元素数: 15，表格数: 2\n[2025-04-19 12:20:03] [INFO] [Page 1] 保存: word_pages\u002Fpage_1_en.docx\n[2025-04-19 12:20:04] [INFO] [Page 2] 读取: page_2_translated.json\n...\n[2025-04-19 12:25:00] [INFO] ========== 阶段3完成 ==========\n```\n\n---\n\n### 阶段4：Python脚本 - 合并Word\n\n#### 运行命令\n\n```bash\npython scripts\u002Fstep4_merge_word.py \"输出_en.docx\" --dir \"temp\u002Fword_pages\"\n```\n\n#### 日志示例\n\n```\n[2025-04-19 12:30:00] [INFO] ========== 阶段4：合并Word开始 ==========\n[2025-04-19 12:30:00] [INFO] 输入目录: temp\u002Fword_pages\n[2025-04-19 12:30:00] [INFO] 找到24个Word文件\n[2025-04-19 12:30:01] [INFO] 合并: page_1_en.docx\n[2025-04-19 12:30:02] [INFO] 合并: page_2_en.docx\n...\n[2025-04-19 12:30:30] [INFO] ========== 阶段4完成 ==========\n[2025-04-19 12:30:30] [INFO] 输出文件: 输出_en.docx\n[2025-04-19 12:30:30] [INFO] 文件大小: 120.5 KB\n```\n\n---\n\n## 方案二：Markdown + HTML + pandoc（推荐）\n\n### 核心流程\n\n```\nMD → HTML(保留HTML表格) → pandoc -f html → Word\n```\n\n### 关键技术\n\n1. **MD转HTML**：保留原始HTML表格（含colspan\u002Frowspan），非表格内容转为HTML标签\n2. **pandoc -f html**：从HTML输入，完整支持表格合并单元格\n3. **reference.docx模板**：控制输出Word的字体、字号、行距等样式\n\n### 模板文件\n\n`templates\u002Freference.docx` 定义了输出Word的默认样式：\n- Normal样式：Times New Roman 12pt，1.5倍行距\n- 表格：Times New Roman 10pt\n\n### 执行分工\n\n| 阶段 | 执行者 | 职责 | 日志文件 |\n|------|--------|------|----------|\n| 阶段1：逐页OCR | Python脚本 | 调用API，保存Markdown | step1_ocr.log |\n| 阶段2：并行翻译 | **AI\u002F子代理** | 逐页翻译Markdown | step2_translate.log |\n| 阶段3：转Word | Python脚本 | MD→HTML→pandoc→Word | step3_build_word.log |\n| 阶段4：合并Word | Python脚本 | 合并所有页 | step4_merge.log |\n\n### 完整流程\n\n```\n1. 阶段1（Python脚本 - 逐页OCR）\n   python scripts\u002Fstep1_ocr.py \"PDF路径\" \"API_KEY\"\n   → 输出: temp\u002Fpage_N.md, temp\u002Fmanifest.json\n   → 日志: temp\u002Flogs\u002Fstep1_ocr.log\n\n2. 阶段2（AI - 子代理并行翻译）\n   → 读取 manifest.json，分批调度子代理\n   → 每页读取 page_N.md，翻译保存 page_N_translated.md\n   → 逐页验证: python scripts\u002Fstep2_md_helper.py validate\n   → 追加日志: temp\u002Flogs\u002Fstep2_translate.log\n\n3. 阶段3（Python脚本 - 逐页转Word）\n   python scripts\u002Fstep3_md_to_word.py \"temp\u002Fpage_N_translated.md\" \"temp\u002Fword_pages\u002Fpage_N_en.docx\"\n   → 内部流程: MD → HTML → pandoc -f html --reference-doc → Word\n   → 自动使用 templates\u002Freference.docx 模板\n   → 日志: temp\u002Flogs\u002Fstep3_build_word.log\n\n4. 阶段4（Python脚本 - 合并）\n   python scripts\u002Fstep4_merge_word.py \"输出_en.docx\" --dir \"temp\u002Fword_pages\"\n   → 日志: temp\u002Flogs\u002Fstep4_merge.log\n```\n\n### 子代理任务模板（方案二）\n\n```\n你是一个翻译子代理。请完成以下任务：\n\n1. 用Read工具读取 temp\u002Fpage_{N}.md\n2. 翻译Markdown内容（中文→英文）\n   - 保留Markdown格式标记（#, *, -, >, |, ``` 等）\n   - 保留数字、批号、化学式\n3. 用Write工具保存翻译结果到 temp\u002Fpage_{N}_translated.md\n4. 运行验证：python scripts\u002Fstep2_md_helper.py validate \"temp\u002Fpage_{N}_translated.md\"\n5. 如有残留中文，补充翻译并重新验证\n6. 完成后返回：页码、验证结果（chinese_count）\n```\n\n---\n\n## 断点续传机制\n\n### 检查点文件\n\n| 阶段 | 检查点文件 | 存在则跳过 |\n|------|-----------|-----------|\n| 阶段1 | page_N_ocr.json \u002F page_N.md | 跳过该页OCR |\n| 阶段2 | page_N_translated.json \u002F page_N_translated.md | 跳过该页翻译 |\n| 阶段3 | word_pages\u002Fpage_N_en.docx | 跳过该页Word构建 |\n| 阶段4 | 最终输出文件 | 跳过合并 |\n\n### 日志辅助断点\n\n```bash\n# 查看哪些页已完成OCR\ngrep \"OCR完成\" temp\u002Flogs\u002Fstep1_ocr.log\n\n# 查看哪些页翻译有问题\ngrep \"chinese_count: [1-9]\" temp\u002Flogs\u002Fstep2_translate.log\n```\n\n---\n\n## 常见问题排查\n\n### 问题：某页翻译质量差\n\n```bash\n# 1. 查看该页日志\ngrep \"\\[Page N\\]\" temp\u002Flogs\u002Fstep2_translate.log\n\n# 2. 对比原始和翻译后文件\ndiff temp\u002Fpage_N.md temp\u002Fpage_N_translated.md\n\n# 3. 重新翻译该页\n# 删除 page_N_translated.md，重新调度子代理\n```\n\n### 问题：OCR失败\n\n```bash\n# 查看OCR日志\ngrep \"ERROR\\|WARN\" temp\u002Flogs\u002Fstep1_ocr.log\n\n# 手动重试该页\npython scripts\u002Fstep1_ocr.py \"PDF路径\" \"API_KEY\" --page 5\n```\n\n### 问题：Word构建失败\n\n```bash\n# 查看构建日志\ngrep \"ERROR\" temp\u002Flogs\u002Fstep3_build_word.log\n\n# 检查翻译JSON格式\npython -m json.tool temp\u002Fpage_N_translated.json\n```\n\n---\n\n## AI禁止行为清单\n\n| 禁止行为 | 后果 |\n|---------|------|\n| ❌ 编写Python脚本执行翻译 | 翻译质量低，无法处理OCR错误 |\n| ❌ 创建预置翻译词库 | 词库无法覆盖所有行业场景 |\n| ❌ 用字符串替换替代翻译 | 无法理解上下文 |\n| ❌ 验证时只是\"浏览\"而非运行脚本 | 无法保证质量 |\n| ❌ 未询问用户选择方案直接开始 | 用户无法选择适合的方案 |\n\n---\n\n## AI必须执行的正确行为\n\n| 行为 | 要求 |\n|-----|------|\n| ✅ 开场询问方案选择 | 必须问用户选方案一还是方案二 |\n| ✅ 调度子代理并行翻译 | 读取manifest，分批调度子代理 |\n| ✅ 记录翻译日志 | 每批完成后追加日志到step2_translate.log |\n| ✅ 逐页验证质量 | 每页翻译后运行validate |\n| ✅ 闭环验证 | chinese_count=0才算通过 |\n| ✅ 断点续传 | 检查已存在文件，跳过已完成页 |\n\n---\n\n## 脚本职责边界\n\n### 方案一脚本\n\n| 脚本 | 职责 | 禁止 | 日志 |\n|-----|------|------|------|\n| scripts\u002Fstep1_ocr.py | 逐页OCR识别 | ❌ 禁止翻译 | step1_ocr.log |\n| scripts\u002Fstep2_helper.py | 验证+合并 | ❌ 禁止翻译 | step2_translate.log |\n| scripts\u002Fstep3_build_word.py | 构建Word | ❌ 禁止翻译 | step3_build_word.log |\n| scripts\u002Fstep4_merge_word.py | 合并Word | ❌ 禁止翻译 | step4_merge.log |\n\n### 方案二脚本\n\n| 脚本 | 职责 | 禁止 | 日志 |\n|-----|------|------|------|\n| scripts\u002Fstep1_ocr.py | 逐页OCR识别 | ❌ 禁止翻译 | step1_ocr.log |\n| scripts\u002Fstep2_md_helper.py | 验证Markdown | ❌ 禁止翻译 | step2_translate.log |\n| scripts\u002Fstep3_md_to_html.py | MD转HTML | ❌ 禁止翻译 | step3_build_word.log |\n| scripts\u002Fstep3_md_to_word.py | HTML→pandoc→Word | ❌ 禁止翻译 | step3_build_word.log |\n| scripts\u002Fstep4_merge_word.py | 合并Word | ❌ 禁止翻译 | step4_merge.log |\n\n**只有AI能翻译，脚本永远不能翻译。**\n\n---\n\n## 参考文件\n\n### 方案一\n- `scripts\u002Fstep1_ocr.py` - 阶段1：逐页OCR识别\n- `scripts\u002Fstep2_helper.py` - 阶段2辅助：验证和合并\n- `scripts\u002Fstep3_build_word.py` - 阶段3：构建Word文档\n- `scripts\u002Fstep4_merge_word.py` - 阶段4：合并多个Word文档\n\n### 方案二\n- `scripts\u002Fstep1_ocr.py` - 阶段1：逐页OCR识别（同上）\n- `scripts\u002Fstep2_md_helper.py` - 阶段2辅助：验证Markdown翻译\n- `scripts\u002Fstep3_md_to_html.py` - 阶段3：Markdown转HTML（保留HTML表格）\n- `scripts\u002Fstep3_md_to_word.py` - 阶段3：HTML→pandoc→Word（使用reference.docx模板）\n- `scripts\u002Fstep4_merge_word.py` - 阶段4：合并多个Word文档（同上）\n- `templates\u002Freference.docx` - Word样式模板（Times New Roman 12pt）\n",{"name":5,"trigger":40,"description":7},[41,42,43,44,45,46,47,48,49,50,51,52],"PDF转英文Word","PDF转英文docx","扫描件转英文Word","GLM-OCR转英文Word","PDF识别转英文Word","PDF中译英Word","扫描件翻译转Word","PDF转md","PDF转Markdown","大PDF转文本","提取PDF内容","OCR识别PDF","main","5b2b73ce2fbb69cd70597cfbbf24c99bc9e94b4c",1,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS","https:\u002F\u002Fgithub.com\u002FFeatherHunter","The Boy, The Man, The Human.","2026-09-12 20:33:55",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add FeatherHunter\u002FSKILLS --skill glm-ocr-to-en-word",{"tool":66,"command":67},"bunx","bunx skills add FeatherHunter\u002FSKILLS --skill glm-ocr-to-en-word",{"tool":69,"command":70},"pnpm","pnpm dlx skills add FeatherHunter\u002FSKILLS --skill glm-ocr-to-en-word","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002FSKILL.md",true,[74,80,86,92,96,100,104,108,112,116,120,124,128,132],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},".key","OTHER","其他",49,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002F.key",{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"glm-ocr-to-en-word.html","REFERENCE","参考文档",26976,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002Fglm-ocr-to-en-word.html",{"path":87,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":90,"sourceHtmlUrl":91},"scripts\u002Fstep1_ocr.py","SCRIPT","脚本",10190,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002Fscripts\u002Fstep1_ocr.py",{"path":93,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":94,"sourceHtmlUrl":95},"scripts\u002Fstep2_helper.py",7383,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002Fscripts\u002Fstep2_helper.py",{"path":97,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":98,"sourceHtmlUrl":99},"scripts\u002Fstep2_md_helper.py",6174,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002Fscripts\u002Fstep2_md_helper.py",{"path":101,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":102,"sourceHtmlUrl":103},"scripts\u002Fstep3_build_word.py",16416,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002Fscripts\u002Fstep3_build_word.py",{"path":105,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":106,"sourceHtmlUrl":107},"scripts\u002Fstep3_md_to_html.py",5472,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002Fscripts\u002Fstep3_md_to_html.py",{"path":109,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":110,"sourceHtmlUrl":111},"scripts\u002Fstep3_md_to_word.py",6003,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002Fscripts\u002Fstep3_md_to_word.py",{"path":113,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":114,"sourceHtmlUrl":115},"scripts\u002Fstep4_merge_word.py",4103,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002Fscripts\u002Fstep4_merge_word.py",{"path":117,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":118,"sourceHtmlUrl":119},"step1_ocr.py",3897,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002Fstep1_ocr.py",{"path":121,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":122,"sourceHtmlUrl":123},"step2_helper.py",4365,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002Fstep2_helper.py",{"path":125,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":126,"sourceHtmlUrl":127},"step3_build_word_v2.py",13284,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002Fstep3_build_word_v2.py",{"path":129,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":130,"sourceHtmlUrl":131},"step3_build_word.py",14466,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002Fstep3_build_word.py",{"path":133,"resourceType":134,"resourceTypeDesc":135,"sizeBytes":136,"sourceHtmlUrl":137},"templates\u002Freference.docx","ASSET","资产文件",36620,"https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002Fglm-ocr-to-en-word\u002Ftemplates\u002Freference.docx",[139,159,168,177,187,193],{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":35},"01M71JPWVNC5JZ2FD4CSR3SZC1","饼干记账","记账技能。写入类:记支出、记收入、拍账单、批量录入、改记录、撤销、恢复、记报销、记退款、记借出、记借入、记收回、记偿还、记分期。查询类:查今天、查某天、查月、查区间、查分类、搜备注、查标签、查账户、查账本、查欠款、查待报销。分析类:看月度、看总览、看分类、看对比、看趋势、看大额、做统计、看洞察、看借贷。目标\u002F账户\u002F联动:设定预算、看预算、设定目标、看目标、新增账户、改账户、账户转账、看账户汇总、买东西联动、吃饭联动。**所有查询\u002F分析类唤醒词默认 invoke HTML 工作流**(scripts\u002Fbill_inject.py + templates),写入类保持文字回执。能力速查:说「饼干记账 HELP」\u002F「查帮助」\u002F「能做什么」。完整 70 个唤醒词见 references\u002F路由表.md","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F饼干记账\u002FSKILL.md",[],[141,146,147,148,149,150,151,152,153,154,155,156,157,158],"记账","invoke","templates","文字","预算","账单","统计","收入","scripts","html","支出","help","references",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":165,"publishedAt":35},"01M71JPS100K4E2JN8R3B0F9NR","贴心助理","真实助手 - 主动分析用户状态，关心用户，提供帮助与提醒。不偷懒地联动所有技能，真正像个朋友一样陪伴。","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F贴心助理\u002FSKILL.md",[],[161,166,167],"陪伴","朋友",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":174,"publishedAt":35},"01M71JPPN0WZ1ARA081J0JDNPC","美团","安装美团旅游技能(meituan-travel)向导 - 检查 mtskills 商店并安装 meituan-travel","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F美团\u002FSKILL.md",[],[170,175,176],"meituan","travel",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":183,"publishedAt":35},"01M71JPN921TSX62DXEFY1B8FJ","网易云音乐","安装网易云音乐 CLI 工具(@music163\u002Fncm-cli) - 通过 npm 全局安装","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F网易云音乐\u002FSKILL.md",[],[179,184,185,186],"工具","cli","npm",{"skillNo":188,"name":189,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":190,"categories":191,"keywords":192,"publishedAt":35},"01M71JPF82PYTK0NYMJF8Y9E48","私家大厨","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F私家大厨\u002FSKILL.md",[],[189],{"skillNo":194,"name":195,"nameZh":6,"description":196,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":197,"categories":198,"keywords":199,"publishedAt":35},"01M71JPCK6Z5NT3G258NFKEJGG","目录树","目录树技能 - 递归扫描给定目录，输出所有目录和文件的树状结构清单","https:\u002F\u002Fgithub.com\u002FFeatherHunter\u002FSKILLS\u002Fblob\u002Fmain\u002F目录树\u002FSKILL.md",[],[200,195,201,202],"目录","文件","文件导航"]