sslgz物理试卷讲解课件
把「试卷 + 答案」批量转成逐页讲评课件。核心不是写 PPT 文案,而是把版式、字号、混排、分页、插图裁剪、动画这些每次都重复且容易出错的机械劳动固化成脚本,让每套卷子都能稳定产出同样规格的课件。
产出物
一份 16:9 的 .pptx:
- 题干/选项:宋体 28 号加粗,数字字母 Times New Roman(一页放不下按 26→24→22→20 降,降到 20 仍是红线就拆页)
- 答案解析:红色加粗微软雅黑,浅红底 + 左侧红竖条,贴在页脚上方
- 每页页脚:楷体 27 号「知识点:……」浅青色带
- 动画:第 1 次单击出答案(作图题连答案图一起出),第 2 次单击出知识点,题干不动
- 可选:套用学校模板(自动清空模板示例页,沿用其母版与校徽)
环境
- Windows + Office(动画、清空模板、截图核验三步依赖 PowerPoint COM)
- Python 包:
python-pptx、PyMuPDF(pymupdf)、Pillow、numpy、pywin32、lxml - 字体:宋体
simsun.ttc、楷体simkai.ttf、微软雅黑msyhbd.ttc、Times New Romantimesbd.ttf(非 Windows 需改scripts/pa_lib.py里的FONT_DIR) - 脚本间通过
sys.path相互引用,运行时先cd到scripts/,或把该目录加进PYTHONPATH
工作流
1. 摸清卷子
python extract_paper.py --docx 试卷.docx --out paper.txt
python extract_paper.py --pdf 试卷.pdf --out paper_pdf.txt # 带坐标,便于定位插图
python extract_paper.py --docx 答案.docx --images ansmedia # 作图题答案图
docx 常丢公式里的数字/字母、丢题号,PDF 常把上标拆散——两份对照着读,缺失处手工补。答案里的作图答案图(受力图、实物连线图)从 --images 导出,后面给 pair.answer 用。
2. 定分页表(最重要的一步)
先写一张「页码 → 题号」的清单,再填内容。规则见 references/layout-rules.md,要点:
- 选择/填空每 1–3 题一页;一旦要降到 24 号以下,就该拆页
- 「长题干 + 四个长选项 + 插图」拆成「图示页 + 选项页」
- 作图题每小问一页,
pair左原图右答案 - 实验题:装置/数据表单独一页,四问拆 (1)(2) / (3)(4)
- 计算题:题目页 + 解答页(
style:"solve") - 综合题:材料 1 页 → 材料 2 页 → 各小问 1–2 页
- 收尾:高频易错点清单,每页 ≤ 4 条
3. 裁插图
python crop_figures.py --pdf 试卷.pdf --page 5 --list-drawings # 先看坐标
python crop_figures.py --pdf 试卷.pdf --page 5 --name q21tab \
--rect 49,585,452,670 --outdir fig --snap drawings
- 表格务必加
--snap drawings:只按肉眼估的矩形裁,必然带入上一行文字或切掉表格底边框 - 裁完必看一遍:有没有残留邻行文字、边框是否完整(用 Read 直接看 png)
- PPT 里表格类插图要放大到自然尺寸的 1.4–1.7 倍,否则投影看不清
4. 写 pages.json
结构见 references/pages-schema.md,最小示例见 assets/example-pages.json。
要点:标题写结论句(第2题|无人机对炮弹做功的判断,不是 第2题);answer 的长公式按语义拆项;页脚知识点控制在两行内。
5. 生成 pptx
# 套学校模板(自动清空示例页生成母版)
python build_deck.py --spec pages.json --out "讲评课件.pptx" --template "课件模板.pptx" --figures fig
# 无模板(自绘青底顶栏 + 深色封面)
python build_deck.py --spec pages.json --out "讲评课件.pptx" --figures fig
# 已有母版可复用,省掉 COM 步骤
python build_deck.py --spec pages.json --out "讲评课件.pptx" --base _base.pptx
看输出日志:出现 size=20、[warn] 内容超出版面、[warn] 知识点过长 都说明该拆页或压缩文字。
6. 加动画
python add_anim.py --pptx "讲评课件.pptx" --out "讲评课件_anim.pptx"
python add_anim.py --pptx "讲评课件_anim.pptx" --check # 校验触发方式(1=单击, 2=与上一动画同时)
依赖形状命名 ANSBOX/ANSACC/ANSTXT/ANSPIC/ANSCAP 与 KPBAND/KPACC/KPTXT(引擎已写好,不要改名)。
7. 截图核验(必做)
python snap_check.py --pptx "讲评课件_anim.pptx" --outdir snap --slides 1-4,18,32
逐张看:文字有没有压图片、答案框有没有压页脚、图片有没有被截断、括号有没有被拆行。发现问题回到 pages.json 改参数(缩图宽、减文字、拆页),重跑第 5–7 步。
PowerPoint 打不开网盘/带空格长路径时,先把 pptx 复制到本地无空格目录;Save() 报「文件正在使用中」时用 SaveAs() 另存;残留进程用 taskkill /F /IM POWERPNT.EXE 清掉。
8. 交付
交付 pptx,并用一两句话说清:套用了哪个模板、总页数、哪几页因为内容量降到了 24 号、有哪些图是重新裁的。
脚本清单
| 脚本 | 作用 |
|---|---|
scripts/deck_engine.py |
排版引擎:换行算法、字号自适应、答案块、页脚、封面、结构页 |
scripts/pa_lib.py |
配色/字体/度量/形状底层库(几何常量都在这里) |
scripts/build_deck.py |
命令行入口:pages.json → pptx |
scripts/crop_figures.py |
PDF 插图裁剪(去白边、吸附矢量线框、列坐标) |
scripts/extract_paper.py |
docx/pdf 文本与内嵌图片抽取 |
scripts/make_base.py |
清空模板示例页生成母版 |
scripts/add_anim.py |
逐页添加淡入动画 / 校验触发方式 |
scripts/snap_check.py |
逐页窗口截图核验 |
参考
references/format-spec.md— 字号/字体/配色/几何/形状命名/密度上限references/layout-rules.md— 分页策略、九条排版坑、环境坑、交付自检清单references/pages-schema.md— pages.json 完整字段说明