1实现原理 · 为什么它能做到
与 docx/xlsx 同一容器哲学:`.pptx` 也是 ZIP+XML,按任务选路线——新建走 pptxgenjs(npm)编程生成;编辑既有/模板走 unzip→改 slideN.xml→zip;读取走 markitdown。
A `.pptx` is a ZIP archive of XML files. Choose your approach by task:
结构操作必须走脚本而非手工复制:add_slide.py 负责复制 slide/layout 并补齐包内注册(rels/content-type/sldIdLst),clean.py 删除孤儿部件——文件级一致性由工具保证。
`add_slide.py` does every registration a new slide needs and reports what it made
创建侧 gotcha 清单极厚(pptxgenjs 坑):颜色禁 #/8 位十六进制、透明度用 transparency、阴影 offset≥0、列表 bullet:true、组合图需 valAxes+catAxes 双轴声明、dataLabelPosition outEnd 会损坏文件等——且全部有 validate.py 兜底复检。
It reports the two chart faults above and the slide-XML defects PowerPoint refuses, and names the fix for each.
图表策略='能原生的绝不图片化':PowerPoint 可画的用 addChart(),库不支持的(趋势线/误差线)自行算 series 或后处理 OOXML,只有 PowerPoint 无原生形态的图(Sankey/network/chord)才转图片插入。
Use `addChart()` for everything PowerPoint can chart
模板编辑有 XML 安全要求:变换必须用 defusedxml.minidom 解析,禁止 xml.etree(会重写命名空间前缀损坏文件);模板槽位≠源条目(4 人模板配 3 人就删整组而非只删文字)。
If you script an XML transform, parse with `defusedxml.minidom` — round-tripping OOXML through `xml.etree.ElementTree` rewrites namespace prefixes and corrupts the deck.
QA 分三层强制:内容 QA(markitdown 文本检查+占位符残留 grep)、文件 QA(validate.py 必跑,模板派生物必须 --original 基线化)、视觉 QA(soffice 转 PDF→pdftoppm 出图逐张目检,建议 subagent 新鲜视角)。
After staring at the generating code you tend to see what you expect rather than what rendered, so look at the images fresh (a subagent works well for this if you have one)
设计层内置『反 AI-slop』指导:主题色板先行、60-70% 主色占比、避免色彩条/下划线 motif、禁默认蓝色/奶油底、字体分 QA 可信/不可信两档(LibreOffice 换字宽差异会误导溢出判断)。
**NEVER use accent lines under titles** — these are a hallmark of AI-generated slides
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| package | pptxgenjs(npm,deck 生成) |
| package | markitdown[pptx] / Pillow / defusedxml / lxml(pip:文本转储/缩略图/clean/validate) |
| package | react-icons / react / react-dom / sharp(npm,图标管线,条件安装) |
| cli | LibreOffice soffice(视觉 QA 渲染/.ppt 转换,经 soffice.py 包装) |
| cli | pdftoppm(Poppler,出图) |
4风险提醒 风险提醒:蓝色 · 知晓即可
- 生成器陷阱多且『只有 PowerPoint 会拒收』 — chart 双轴、dataLabelPosition、阴影 offset 等错误不经过其它工具暴露,漏跑 validate.py 就会交付 PowerPoint 打不开的 deck。
- 视觉 QA 依赖模型看图 — 转图目检最终靠模型/人眼;字体替换导致的溢出判断在 QA-不可信字体上不可靠(SKILL 自述)。
- 依赖面偏重 — pptxgenjs/markitdown/Pillow/defusedxml/lxml/soffice/pdftoppm + 图标管线 react-icons/sharp,环境需预装或可安装。
- 专有许可 — LICENSE.txt 为 Anthropic 服务条款式专有许可(含 ADDITIONAL RESTRICTIONS)。
- 宏/恶意模板面 — 外部 .pptx/.potx 可能携带恶意部件;skill 无宏清理(对 .pptm/宏敏感环境需宿主自行把关)。
5第二遍独立确认
- [ok] office/ 树与 docx/xlsx 一致 — diff -rq 三目录 office/ 零差异;soffice.py/validate.py 为同一文件副本。
- [ok] add_slide/clean/thumbnail 行为声明 — SKILL.md 表与正文描述(注册报路径、孤儿清理、labeled 网格)与各脚本 docstring/实现相符。
- [ok] pptxgenjs 坑清单与 validate 兜底 — 'corrupts the file' 类规则 + 'After writeFile(), run validate.py' 原文在;validate.py 确有 chart/slide 检查逻辑。
- [ok] defusedxml 安全解析 — SKILL.md 明文禁止 xml.etree 做变换并指定 defusedxml.minidom;脚本中实际使用 defusedxml。
- [ok] 网络/凭证零命中 — 脚本无网络调用;环境变量仅 soffice.py 拷贝环境设 VCL 插件与 LD_PRELOAD(无读取密钥)。
- [ok] 夸大检查 — description 'any time a .pptx or .potx file is involved'——正文覆盖 create/edit/template/read/QA 全链,无越界承诺;设计指导属 prompt 层(依赖模型遵循+validate 兜底)。
- [ok] 元数据 — 本地 HEAD==pin 41bbe19;LICENSE 专有与 frontmatter 'Proprietary' 一致。
6结论
fa29d7374c319c8e…41bbe19d1a