0. 一句话
一句话 / 一份文档 → 一套有观点的幻灯片 → 网页里像画图一样改 → 导出 文字能直接改 的 PPTX 或保真 PDF。
它和「PPT 讲解视频」是两条线:
| 输入 | 输出 | |
|---|---|---|
| 可编辑 PPT(本文) | 主题 / 文档 | .pptx / .pdf |
| PPT 讲解视频 | 现成 PPT/PDF + 数字人形象 | .mp4 |
1. 产品形态
1.1 三个入口,同一套业务
| 入口 | 谁在用 | 形态 |
|---|---|---|
| 网页表单 | 普通用户 | 主题 或上传文档,页数 3--30(默认 12) |
| 网页编辑器 | 需要改稿的人 | 三栏工作台:页栏 / 画布 / 图层属性 |
| Agent / MCP | Claude Code、Codex 等 | create_deck 工具,从对话里抽参数,回调后给「去编辑」入口 |
三个入口共用 DeckGenService,差异只在「参数怎么来」。计费走平台的冻结/结算,产物进 OSS ------ 它不是一段脚本,是平台里的一等产品。


1.2 两条生成路径
先出大纲:表单 → [简报] → 骨架 → 分节写正文 → 薄页补写 → 一致性审校 → 大纲
→ 用户在编辑器里改大纲 → 展开(不调模型)→ 成稿
一键出稿: └────────────── 上面整条一次跑完 ──────────────┘ → 成稿
「一键出稿」和「先出大纲」同价 :因为真正贵的是内容生成,而展开这一步是纯确定性排版、不调模型。两条路只是「要不要在大纲上停一下」。
2. 设计方法:七条不肯让步的决策
2.1 不让 LLM 吐坐标
让模型直接产出每个文本框的绝对坐标,出来必是重叠、出界、字号乱。所以我们把活拆成三层:
| 层 | 谁做 | 产出 |
|---|---|---|
| 内容 | LLM | 标题、要点、数据、表格、配图语义 |
| 版式意图 | LLM | 「这页是大标题 + 三卡」还是「左图右文」,只选名字 |
| 绝对坐标 | 确定性排版器(deck_layout.py) |
box: {x, y, w, h},按 1920×1080 栅格算 |
LLM 从头到尾没见过坐标。它甚至不知道字号是多少 ------ 它只说「这是页标题」,字号由主题刻度表决定。
推论:坐标只在 deck_layout.py 一处算 。编辑器、缩略图、导出器都只是照着 box 画;多一处推导就多一份会走歪的口径。
2.2 存「语义角色 + token」,不存绝对样式
jsonc
// 不这么存
{ "fontSize": 24, "color": "#1a1a1a", "fontFamily": "PingFang SC" }
// 这么存
{ "role": "title", "style": { "colorToken": "fg-primary", "sizeStep": 5 } }
sizeStep是下标,不是 px ------ 换主题时刻度整体变,字跟着变,框不变。- 用户手改存
overrides覆盖层,就是 CSS 层叠:token 基线 + 用户覆盖。 - 圆角存的是比例 (短边的几分之几),和 PPTX 圆角矩形的
adj同口径。
这是「一键换风格」能成立的全部原因:换风格只写 deck.theme,页里的 layers 一个字不动。而且刻度与圆角沿用这份 deck 自己的快照 ------ 老稿子不会因为上新主题而整体涨缩。
2.3 模板 = 主题 × 版式组件,不做「整页模板」
| 层 | 是什么 | 我们现在的量 |
|---|---|---|
| 主题 | 视觉语言:配色 11 个 token + 字体对 + 圆角 + 字号刻度 | 17 套(4 套内置骨架 + 13 套带版式皮肤) |
| 版式组件 | 封面、目录、章节、要点、两栏、三卡、图文、表格、引文、大数字、流程、时间线、图表、矩阵、结尾 | 15 种 |
| 图示版式 | process / timeline / chart / matrix / table 五个 builder | ≥8 页的稿子至少要求 1 页图示;模型不照做时排版器会确定性换一页 |
每套皮肤给的是页面槽位 (标题位、内容区、装饰 chrome),不是「第 3 页长这样」。所以维护量是 主题 + 版式,不是 主题 × 页数。
2.4 内容流水线:先想清楚,再写,再校
一次让模型吐 30 页,后半段看不见前半段,越写越飘。实际做法是五段:
| 阶段 | 做什么 | 关键约束 |
|---|---|---|
| 内容简报 | 论点、可被反驳的判断、事实/案例/反例、叙事弧、术语表 | 只活在 worker 里,不落库;上限 4608 token |
| 骨架 | 先定标题链 + 每页版式 + 观点归属 | 不合格先带纠正重试一次,仍不合格做确定性修复(丢空章节/无标题页) |
| 分节写正文 | 按批写,每批 5 页,每批都带简报 + 已写好的页 | 后段有东西可对齐;传输失败才整份回退单趟 |
| 薄页补写 | 确定性检测「内容偏薄」的页,最多 4 页定向补写 | 结构页永不检测;补写要过「版式不变、不再判薄、内容量不缩水」的门槛 |
| 一致性审校 | 跨页取证:数字冲突、术语异名、重复断言、标题重复/标签化 | 命中的页最多再修 2 轮,修不动如实写进 notice,不阻塞交付 |
所有增强环节都是尽力而为 :失败/超时只记日志,绝不连坐整单。计费如实汇总 ------ llmQuota 是这一趟所有成功调用的实扣之和。
2.5 排版自检:两层,各查各的
worker(IR 数字) 浏览器(真实换行)
├─ 文字框出界 ├─ 文字比框高/宽
├─ 文字框互相重叠 ├─ 文字互相重叠
└─ 整块形状跑到页外 └─ 图片没加载出来
- worker 侧查 IR 数字,能覆盖全部页,但看不见字体、换行、用户手改。
- 浏览器侧 在真渲染的缩略图上量,能看见真实换行,只覆盖已渲染的页;边改边量(240ms 防抖),页栏角标实时消长。
- 导出前再实测一次:有问题弹确认框,每一行都能点 ------ 跳到那一页并选中出问题的图层;「去修改」直接落到第一处。
- 同一版内容点过「仍然导出」之后不再重复拦。
2.6 编辑即一切:初稿只是起点
- 自由画布:拖拽、缩放、旋转(90° 吸附)、层级、显示/隐藏、锁定、撤销重做 50 步
- 图层:文字(6 个语义角色)、图片、形状(矩形/圆角矩形/椭圆/三角形/线条)、表格、图表(模板皮肤还会带多边形装饰层,编辑器里可选中、可改样式)
- 文本:颜色/字体/字号档位/粗细/对齐/行高/字号缩放(覆盖层可一键清空)
- 页:增、删、复制、拖拽排序、右键菜单、键盘操作
- 单页 AI 重写 :指着一页说「这页要讲什么」,只改这一页,带乐观锁 ------ 等模型的几十秒里你手改了,结果不会盖掉你的改动
- 重出整套:会替换所有页,所以点之前弹确认框把后果讲清楚
- 演讲备注:跟着 PPTX 备注页一起导出
撤销栈只装图层与背景;笔记、换主题不进历史 ------ 撤销不该把「换了风格」也撤掉。
2.7 导出是单向投影,不是往返同步
IR → PPTX 一次投影,不做双向同步(PowerPoint 改完传回来再解析,是无底洞)。
| IR | PPTX |
|---|---|
| 1920×1080 设计 px | 1px = 6350 EMU(13.333in × 7.5in) |
sizeStep |
Pt(px / 2) |
kind: text |
add_textbox,关 autofit 、word_wrap = true |
kind: image |
add_picture,contain / stretch 两档 |
kind: shape |
add_shape(圆角矩形/椭圆/三角)与 add_connector(线)、freeform(多边形) |
kind: table |
原生表格,单元格可继续编辑 |
kind: chart |
原生柱状图(COLUMN_CLUSTERED),负值与坐标轴交给 PowerPoint |
| 复杂视觉(渐变/阴影/图标字体) | 降级为图片层:看着对,但在 PowerPoint 里改不了 |
字体在导出时按白名单写入(含东亚字体段),由用户端 PowerPoint 解析;PDF 则在服务端渲染。
保真度的天花板 :PPTX 是「结构正确 + 字体 fallback 后观感接近」;100% 保真的是 PDF(服务器渲染,不依赖用户字体)。所以对外文案只说「导出的 PPTX 里,文字都能直接改」,不说「可以随意编辑」。
3. 功能清单
3.1 生成
- 主题 / 大纲 / 上传文档(doc、pdf、txt、md、html、pptx;≤20MB)三种取材
- 出方案前可选联网检索(PPT 主题默认开):检索词只用主题,不传上传文档正文
- 页数 3--30,可指定;大纲可编辑、可整份重出、可单页让模型重写
- 自动配图(按页语义)、风格推荐、20MB 文档解析与截断
- 出稿前自动做图示版式分配(≥8 页至少 1 页图示),章节页强制带副标题,目录从章节页自动汇总
3.2 编辑
- 三栏工作台:页栏(真渲染缩略图)/ 画布 / 图层属性
- 见 2.6;另外:保存状态是一颗图标(错误 > 保存中 > 待保存 > 已保存),自动保存 900ms 防抖 + 串行化,切页前先落库
- 排版问题实时角标 + 可跳转的导出前检查
3.3 导出
PPTX(文字可改)或PDF(排版固定)- 产物 OSS 直链;PDF 由同一份 pptx 经 LibreOffice 转出,两条路的内容必然一致
3.4 平台能力
- 任务记录、阶段进度、失败重试、订阅通知
- 冻结额 / 结算与实际 token 一致;单页重写也是按 token 计费,出完报实扣
- 功能评价、产物历史、MCP 可调用
4. 技术链路一张图
浏览器 后端 (Java) worker (Python)
─────────────────────────────────────────────────────────────────────────────
表单 / Agent
│ POST /deck/outline
├──────────────────────────► 建 record + 冻结
│ │ 派发 deck_generate(stage=outline)
│ ├──────────────────────────────► 简报 → 骨架 → 分批正文
│ │ → 薄页补写 → 一致性审校
│ │ ◄──── /deck/outline/ready ───────┘(llmQuota 回传)
│ ◄── 轮询 /deck/job ────────┤
大纲编辑器
│ POST /deck/expand
├──────────────────────────► │ 派发 deck_expand(**不调模型**)
│ ├──────────────────────────────► deck_layout.py 排绝对坐标
│ │ ◄──── /deck/expand/ready ───────┘
│ ◄── /deck/job ─────────────┤
画布编辑(自动保存 /deck/update_slide)
│ POST /deck/export
├──────────────────────────► │ deck_export
│ ├──────────────────────────────► 取 IR → python-pptx
│ │ →(PDF: LibreOffice)
│ │ ◄──── callback + OSS URL ───────┘
│ ◄── 轮询 → 下载 ───────────┤
边界很清楚 :模型一律由后端代调;坐标只在 worker 的排版器算;导出器只照着 box 画。
5. 与 dashi-ppt(大师 PPT)的对比
对标的
dashi-ppt-skill(作者 chuspeeism,AGPL-3.0,GitHub 约 4.3k star,截至 2026-10)。它的公开数据:12 套主题、1,020 个版式页、8,576 个可调控件、20 个页面角色;雷达/瀑布/树图/漏斗/热力/桑基/甘特等图表,SWOT/波特五力/PEST/商业模式画布/双钻模型等分析框架;导出 HTML / PDF / 可编辑 PPTX。数据以它 README 为准,本文按公开信息对比,不臆测未公开实现。
5.1 先说结论:这是两个物种
| dashi-ppt | 我们(Deck) | |
|---|---|---|
| 本质 | 装在 Agent 里的 skill (npx dashi-ppt-skill),本地跑 |
平台里的在线产品(账号、任务、计费、产物) |
| 产物归属 | 本机文件 + 本地 HTTP 预览服务 | OSS 直链 + 任务记录 + 可回访的编辑台 |
| 谁在交付 | 用户自己的电脑(Node 20+、Chrome/Chromium) | 服务端(Python 排版 + 导出),用户只开浏览器 |
| 给谁用 | 已经用 Claude Code / Codex 的个人 | 团队 / 客户 / 需要留痕与计费的场景 |
一句话:dashi 把「做 PPT」做成一个能力,我们把「做 PPT」做成一条产品线。 两者的强项不重叠。
5.2 逐项对比
| 维度 | dashi-ppt | 我们 | 谁更强 |
|---|---|---|---|
| 排版决策 | Agent 产出 HTML/CSS,浏览器布局引擎排;版式由 1,020 个页面模板决定 | LLM 只出内容 + 版式意图,坐标由确定性排版器算;15 种版式 × 17 套主题 | 它赢在版式库广度 ;我们赢在版面可预测、不会重叠出界 |
| 模板体系 | 12 主题、20 个页面角色,共 1,020 个整页版式、8,576 个控件 | 17 主题(4 内置 + 13 皮肤)× 15 版式,槽位级皮肤 | 它赢在「打开就有好看的页」;我们赢在维护量小(主题 + 版式,不是主题 × 页数) |
| 编辑方式 | 每页一个控制台(滑杆/下拉/开关,20+ 维度)+ 就地改字、拖图、换色、重排页 | 自由画布:拖/缩/转、图层树、z-order、锁定隐藏、撤销 50 步 | 它赢在改得快、不容易改坏 ;我们赢在能改结构(挪框、改层、加形状) |
| 风格切换 | 换主题/配色(模板参数) | 换主题只写 deck.theme,图层一字不动;刻度用这份 deck 自己的快照 |
接近;我们的 token 化更彻底 |
| 可编辑 PPTX | HTML 逐节点重建成 Shape/TextFrame,文字可编辑,高级效果降级 | IR 直出 python-pptx 原生文本框/形状/表格/图表,没有「HTML→PPTX」这一跳 | 我们少一跳、少一层失真;它的浏览器渲染观感可能更接近设计稿 |
| 图表/分析模型 | 雷达、瀑布、树图、漏斗、热力、桑基、甘特 + SWOT/五力/PEST/BMC/双钻 | 原生柱状图 + 原生表格;process / timeline / matrix / chart / table 五种图示版式 | 它更强(图表类型与分析框架更多);我们的图表是 PPT 原生对象、可直接改数据 |
| 内容质量兜底 | 公开资料未描述跨页审校;靠 Agent + 模板约束 | 简报 → 骨架 → 分批 → 薄页补写 → 跨页一致性审校(数字/术语/重复断言)→ 确定性排版自检 → 浏览器实测 | 我们更强(有确定性取证,不靠模型自觉) |
| 交付与运维 | 本地跑,不上传内容(隐私好);不用账号、没有计费 | 云端:账号、配额、冻结/结算、任务记录、OSS、订阅通知 | 隐私它赢;平台化我们赢 |
| 运行依赖 | Node 20+、Chrome/Chromium/Edge;file:// 不能导 PPTX,必须走本机 HTTP 服务 |
浏览器即可;PDF 由服务端 LibreOffice 转 | 我们更适合非技术用户 |
| 许可 | AGPL-3.0:网络服务里集成会被要求开源 | 自有代码 | 商用集成我们无约束 |
| 价格形态 | 开源免费 + 自己出算力 | 500 积分/次导出;生成按 token 实扣 | 取决于场景 |
5.3 各自适合谁
选 dashi,如果你:已经在 Claude Code/Codex 里工作;要的是「好看的页 + 快速调参」;内容敏感不能上传;能接受本机装 Node 和 Chrome;不介意 AGPL。
选我们,如果你 :要一个链接就能用的产品;需要账号、计费、任务记录、产物回访;要真的能改结构 (挪框、改图层、加形状);要跨页数字/术语一致;要把「做 PPT」接进自己的 Agent/MCP 或业务流程;或者需要一份保真 PDF 交付给客户。
6. 能力边界
别说「导出的 PPT 可以随意编辑」,用户一试形状和动画就觉得被骗。准确说法:
导出的 PPTX 里,文字都能直接改。
| 能做 | 打折扣 | 做不到 |
|---|---|---|
| 原生文本框、形状、表格、柱状图 | 渐变/阴影/图标字体降级为图片层 | 动画与切换(python-pptx 不支持) |
| 文字改、框挪、图换 | 合并单元格、条件格式 | SmartArt、公式(OMML) |
| 一键换 17 套主题 | 导出的 PPTX「看着差不多」,不是逐像素 | 字体嵌入(授权墙,只有思源系可嵌) |
| 保真 PDF | 用户端字体 fallback | PPTX 反解成可编辑图层、双向同步 |
参考
- dashi-ppt-skill 仓库:https://github.com/chuspeeism/dashi-ppt-skill
- SKILL 说明:https://github.com/chuspeeism/dashi-ppt-skill/blob/main/skills/dashi-ppt/SKILL.md
- 腾讯云开发者社区评述:https://cloud.tencent.com.cn/developer/article/2723295
- 阿里云开发者社区评述:https://developer.aliyun.com/article/1754469
- 内部设计文档:
docs/可编辑PPT.md