对应版本:2026-10-12
图片转 PPT 的第一版打通了主流程:上传一张幻灯片图片,多模态模型把画面拆成一份只含数据的元素描述(DrawScript),用户逐个确认元素后,导出一份由原生形状组成、能在 PowerPoint 里直接编辑的 PPTX。

出发点
用户手里往往只有一张幻灯片截图,要的不是把图片塞进 PPT,而是图片转幻灯片:标题、色块、连线都能单独选中、改字、改色。我们的做法是让多模态模型看图,说清画面里有什么、在哪、长什么样,再由本地程序把这份描述画成原生形状。
第一版的三条基本取舍都从这里来:
- 模型只负责描述,不生成文件。它输出一份 JSON 描述,PPTX 文件完全由本地引擎生成。
- 模型输出只能是数据。图片、网址、base64、XML、代码一律不收。这样导出结果始终是可编辑的形状,而不是贴图;服务端也不会因为模型的输出去执行代码或访问外部地址。
- 人来把关。模型输出可能有偏差,所以导出前每个元素都要经过用户确认。
DrawScript:只有数据的中间格式
DrawScript 记录画布宽高、可选的背景色和一组元素。坐标统一使用原图像素,元素按先后顺序叠放,后画的盖在先画的上面。这一版支持六种元素:
| 元素 | 可设置的内容 |
|---|---|
| 文字 | 文字内容、字号、粗体、斜体、颜色、对齐、字体 |
| 矩形 | 填充、边框颜色与线宽、圆角、虚线 |
| 椭圆 | 填充、边框 |
| 直线 | 颜色、线宽、虚线、箭头 |
| 折线 | 至少两个点,箭头加在最后一段 |
| 多边形 | 至少三个点,用于近似复杂图形 |
每种元素能用哪些属性都有明确清单,清单外的属性直接报错。这一版还没有图标、表格和图片;遇到图标类元素时宁可报错,也不悄悄用一个椭圆顶替。
DrawScript 是公开的格式,除了由模型生成,也可以通过「导入 DrawScript」导入一份 JSON,替换当前脚本。导入的脚本和模型输出走同一套校验,导入后所有元素都是待确认。用其他工具离线生成的脚本,也能接进同一条审阅和导出流程。

数据边界由程序守住
“只要数据”不能只靠提示词约定,模型输出写入任务之前要经过三层校验:
- 结构:只认识约定的字段;脚本里嵌入或引用原图位图直接拒绝;元素类型必须在白名单内,坐标必须是数字,个数符合元素类型。
- 语义:每种元素的属性按清单检查;颜色格式、字号、线宽、虚线样式都有取值范围。单页最多 2048 个元素,单个多边形最多 4096 个点,单段文字最多 4000 字。
- 一致性:元素编号不能重复,缺省时自动编号;脚本的宽高必须和原图一致。
超出画布的坐标不判错,而是收回画布内,并在页面上以「编译提示」列出。
经过这几层校验,脚本里能自由填写的只剩文字内容、元素名和字体名。即使模型把一个网址写进文字里,它也只会作为一段文字出现,不会被访问,也不会变成图片。拆解、导入、手动修改、对话修改、排版,所有写入都经过同一套校验,没有绕开的路径。校验后的几何就是导出时使用的几何,用户审阅时看到的位置和导出结果一致。

拆解
图片转 PPT 的成败基本由拆解决定。点「自动拆解」后,模型的输出逐段显示在「大模型输出过程」窗口里,完成后页面刷新为校验过的结果。服务同时最多处理 2 个模型调用,单次拆解最长等待 5 分钟。拆解失败时,任务标记为失败并显示原因,可以重新拆解。
审阅与确认
- 每个元素单独确认,全部确认后才能排版和导出。这条限制由服务端执行,不只是按钮置灰。
- 修改某个元素的参数,只撤销这个元素的确认;删除元素会清空全部确认,因为整体构图变了。页面上至少保留一个元素。
- 排版提供「网格排版」「居中排版」「左对齐」三种。网格放不下时直接提示,不会悄悄缩放元素。
- 对话修改:选中一个元素,用一句话说明要怎么改,模型只返回这一个元素的新描述,结果同样经过校验,改完回到待确认。这条路后来在第 05 章扩展为完整的 imageToEditablePPT-Agent。
模型与密钥
模型由用户自己提供(BYOK)。在「多模态模型设置」里选择提供方、填写 API Key 和模型名,也可以接入自定义的兼容接口;还可以通过环境变量配置,页面上的配置优先。列表里只出现能读图的提供方。没有配置模型时,拆解会提示先完成配置。
用户可以依赖的几点:
- 密钥只保存在本机服务端,浏览器只知道“是否已配置”,拿不到密钥本身。
- 错误信息里如果带出了密钥,会先被替换掉再返回。
- 服务只接受来自本机的访问,并拒绝其他网站发起的跨站请求,别的网页无法借用户的浏览器调用这个本地服务。
并发保护
每个任务带一个修订号,每次修改都要基于最新的修订号;一个操作进行中时,其他修改会被拒绝。用户双击按钮、开了两个标签页,或者在模型返回之前又改了别的内容,后到的请求都会被拦下并提示刷新后重试,任务状态不会被写乱。
这一版的任务保存在服务进程的内存中,最多同时保留 12 个,闲置超过 1 小时后清理。
导出:原生形状
- 页面尺寸按原图像素以 96 DPI 换算,字号和线宽按同一比例换算。
- 背景色设为真正的幻灯片背景。
- 文字导出为文本框,不自动换行、不自动缩放字号。
- 矩形(含圆角矩形)、椭圆、直线(含箭头)、折线、多边形都导出为原生形状,多边形使用自定义路径。
- 元素名会写进 PowerPoint 的选择窗格,方便在 PowerPoint 里继续查找和编辑。
- 导出过程不联网、不解码图片、不接收外部 XML。原图只作为模型的参考输入,不会出现在导出文件里。
改进
为了让模型输出的小偏差不至于让整份结果作废,我们在严格校验之外做了几处有限的容错:
- 同一属性的常见不同写法(例如箭头、多边形填充色)都能识别。
- 模型输出外面包着 Markdown 代码块,或单元素修改的结果多包了一层,会自动剥离;字段本身仍然严格校验。
- 坐标略超出画布时收回画布内并给出提示,不拒绝整份脚本。
上述校验规则和从上传、拆解、确认、排版到导出的完整流程都有自动化测试覆盖。
这一版的边界
- 质量依靠人工核对:没有自动检查遗漏元素和位置偏差,拆解过程中画布要等模型输出完整后才显示。第 02 章加入了完整性检查、实时预览和视觉复检。
- 校验对整份脚本生效,只要有一个元素不合规,整次拆解就会失败,需要重新拆解。第 02 章起会忽略空文本的占位元素,第 03 章起拆解失败会自动重试。
- 模型配置和任务只保存在内存中,服务重启后需要重新填写配置、重新上传图片。第 02 章起两者都会保存在本机并在重启后恢复。
- 表达能力有限:没有图标、表格和图片,复杂插画只能用多边形近似。第 03 章加入了图标和表格,第 07 章加入了从原图抠图。
下一章在这条流程上加入了自动的质量闭环:拆解后的完整性自检、边流边画的实时预览,以及截图对照原图的视觉复检。