图片转 Word 文档
用途
把一组页面照片(手机拍的教材、教辅、试卷、讲义)转成一份可直接编辑、可打印的 Word 文档:文字按内容顺序重排,插图像原书那样嵌回原位,表格与选项结构还原,填空处保留手写横线。
核心思路是内容与排版分离:
- Agent 负责"看懂":读图取文、判断页序、量图坐标、写一份内容规格 JSON;
- 脚本负责"排版":字体、字号、间距、标题框线、表格底纹、插图等比缩放、页码,全部确定性生成。
不要在生成的 docx 上手工改版式。发现版式问题就改 JSON 重跑——这样能反复重生成、结果可复现。
环境
- Windows + Microsoft Word(用于把 docx 另存为 .doc / PDF)。没有 Word 时只能交付 .docx,需要向用户说明。
- Python 用受管解释器
C:\Users\Administrator\.workbuddy\binaries\python\versions\3.13.12\python.exe,依赖python-docx、pillow、pymupdf(缺失先python.exe -m pip install python-docx pillow pymupdf)。 - 下文命令中
PY指该解释器绝对路径,SKILL指本技能目录。
工作流程
1. 预览定向
PY SKILL/scripts/preview_pages.py 照片目录或若干图片 --out preview_pages.jpg
看缩略图总览,确认两件事:哪些页是 180° 倒置(页码在上、标题在下),每页是单栏还是双栏。倒置页在后续步骤统一用 --rotate 180 处理,不要先手动另存副本。
2. 判定内容顺序
内容顺序不等同拍摄顺序。 先比对每页页眉、页码,以及首尾句是否接得上(例:上一页结尾"可知两"、下一页开头"军中…")。按真实阅读顺序(页码升序)建立 p34 → p38 这样的页序映射,再开工。
读文字时按栏走:双栏页先左栏到底、再右栏;题干跨两栏时(选项分列在两栏顶部)要在转写时拼回一起。
3. 定位并裁剪插图
先出网格图,按分数坐标量图框:
PY SKILL/scripts/grid_overlay.py page34.jpg grid34.jpg --rotate 180
# 局部放大再看一次(y 区间 + x 区间 + 放大倍数)
PY SKILL/scripts/grid_overlay.py page37.jpg grid37_right.jpg --range 0.54 0.80 --xrange 0.46 0.99 --zoom 1.7
读网格图,把每个图框写进 crops.json(box = [x0,y0,x1,y1],四边各向外留 0.005—0.010 余量),再批量裁剪:
PY SKILL/scripts/crop_figures.py crops.json
脚本会打印每张图的尺寸/宽高比,并生成 crops_check.jpg 校验图。必须读这张校验图:图被裁断、裁进相邻文字、纸底发灰,都靠它发现。经验上需 2—3 轮微调 box 才能全部合格。
裁剪要点:
- 线图用
mode: gray(去底、线条变实);流程图、彩色地图用mode: color,否则浅色色块会被洗掉。 - 相邻两个图框很近时,先确认中间那行归属哪张图(如"单位:hPa"),别让两张图各被切一半。
- 图例(
→→→ 水平气压梯度力)属于图的一部分,裁进去;引导语("近地面:")留给正文。
4. 写内容规格 JSON
按 references/content-spec.md 的块类型逐段落笔。三条硬性要求:
- 文字照原文,不改写、不合并;专业符号原样保留(hPa、30°—45°、>、①)。
- 原文填空写成全角下划线
_____,长度按手写空间给。 - 每处插图在原位置放
img块;表格用table块重建,不要用截图代替表格。
5. 生成 docx
PY SKILL/scripts/build_docx.py content.json -o "输出名.docx" --debug
6. 另存 .doc 与 PDF
powershell -ExecutionPolicy Bypass -File SKILL/scripts/docx_to_doc.ps1 -Docx "F:\out\输出名.docx" -Pdf "F:\out\预览.pdf"
用户要".doc"时交付 .doc(Word 97-2003),同时保留 .docx 便于再编辑。
7. 逐页校对
PY SKILL/scripts/render_pdf.py 预览.pdf --outdir preview_png
逐张读渲染图,按下面的清单过一遍;有问题回第 3/4 步改配置重跑。
8. 交付
用 present_files 同时给出 .doc 与 .docx。清理中间产物(网格图、预览图、预览 PDF);若删除被安全钩子拦截而提示 skip,忽略即可,最后用目录列表确认实际结果。
质量清单
- 文字:无漏段、无重段;跨页断句已接回完整句子;页眉页脚不重复堆进正文。
- 页序:与真实内容顺序一致;副标题标注原书页码范围(如"第 34—38 页")。
- 图:完整、不裁字、纸底干净、居中;宽图 ≤ 12 cm,方形组图 6—9 cm。
- 表:不加多余装饰;行不跨页;表头有浅底纹;列宽按内容分配。
- 版式:标题不落在页底(脚本内置 keep-with-next);图与其引导语同页。
- 填空:横线长度够手写,句末标点仍在横线之后。
- 页码:页脚居中。
参考文件
references/content-spec.md— 内容规格 JSON 的全部块类型、样式参数、最小示例。references/pitfalls.md— 实战踩坑与修复手法(倒置页、双栏跨页、图表跨页、去底阈值、Word COM 等)。assets/example-content.json— 覆盖全部块类型的完整示例(含placeholder.png),照着改成实际内容最快:
PY scripts/build_docx.py assets/example-content.json -o demo.docx
脚本一览
| 脚本 | 作用 |
|---|---|
scripts/preview_pages.py |
照片缩略图总览,查方向与栏数 |
scripts/grid_overlay.py |
叠加分数坐标网格,量图框 |
scripts/crop_figures.py |
批量裁剪 + 去底 + 裁剪校验图 |
scripts/build_docx.py |
内容 JSON → .docx |
scripts/docx_to_doc.ps1 |
Word COM:.docx → .doc / PDF |
scripts/render_pdf.py |
PDF → PNG 逐页校对 |