上一篇博客讲了 PPTX 文件本质是个 ZIP 压缩包,AI 操纵 PPT 的底层逻辑跟操纵 Word 一样,都是直接读写里面的 XML。
但跟 Word 那边不一样的是,PPT 的 XML 更复杂,工具链也没 Word 完善。所以直接让 AI 从零生成一套 PPT,大概率会遇到好几个问题:排版乱、溢出、字体不对、调不动。
所以,如果从一开始就有排版等要求,上来就用AI绝对不是个好注意。但如果你不知道如何下手去调整,你不得不接受一个成品一眼AI味的。
那本文就是教你避开上述路线。不让 AI 从零造,而是让它往你自己的模板里填字。
思路很简单。你先在 PowerPoint 里把常用的那几页模板做好,字体、字号、配色、占位符位置全部预设好。然后 AI 要做的事情就只剩下一件:把你准备好的文字,按模板的布局,一页一页填进去。
这样做有几个好处:
第一,模板是你自己做的,排版、字体、配色都是你喜欢的样子。AI 不会乱改。
第二,AI 不用管格式,只管内容。它不需要从零决定标题用什么字号、正文放在哪里,这些模板里已经写死了。
第三,溢出问题容易解决。这其实是关键。在实际安排工作流的时候,给完文字后,一定要让AI帮你提前算好每一页能装多少字,AI 填之前就知道什么时候该拆页,不会等填完了才发现装不下。
先搞清楚你的模板里有什么
我自己常用的模板叫"经典模板.pptx",是一个非常简单的模板。总共就 6 页示例页,覆盖了 5 种布局类型:
| 布局类型 | 用途 | 里面有什么 |
|---|---|---|
| 标题幻灯片 | 封面 | 一个居中的主标题占位符 + 一个副标题占位符 |
| 章节页 | 章节分隔 | 两个并排的文本框,左窄右宽(左框放编号 01、02,右框放章节标题) |
| 结束页 | 致谢封底 | 一个居中的文本框 |
| 标题和内容 | 正文页 | 一个标题横条 + 一个大的内容区 |
| 全黑 | 另一种正文页 | 上下两个文本框(上标题下内容) |
每种布局里的文本框,专业术语叫占位符(placeholder)。你打开 PowerPoint 新建一页幻灯片的时候,看到的那些虚线框就是占位符。
每个占位符有几个关键属性:
- 位置和尺寸:用 EMU 单位记录(1/914400 英寸),python-pptx 读出来是整数
- 占位符类型(ph_type):用数字区分,TITLE(标题横条)是 1,BODY(正文/居中框)是 2,CENTER_TITLE(封面主标题)是 3,SUBTITLE(封面副标题)是 4,OBJECT(正文页内容区)是 7
- 默认字体和字号:如果母版里预设了,占位符自动继承;如果没预设,python-pptx 不显式指定的话也是继承
为什么要搞清楚占位符的类型和位置?因为 AI 填字的时候,就是靠这些信息来判断"这一块是封面主标题"“这一块是章节页右框”"这一块是正文页内容区"的。
我之前跑过一个探查脚本(inspect_template.py),把经典模板.pptx 里每种布局的占位符全部枚举出来了。结果长这样:
=== 经典模板.pptx 布局探查 === 布局:标题幻灯片(封面) ph_type=3(CENTER_TITLE):宽 10" 高 2.6",位于 (0, 0) → 主标题 ph_type=4(SUBTITLE):宽 10" 高 1.3",位于 (0, 2.8") → 副标题 布局:章节页 BODY 左框:宽 1.9" 高 1.1",位于 (0.5", 3.2") → 编号 01、02 BODY 右框:宽 6.2" 高 1.0",位于 (3.2", 3.2") → 章节标题 (注意:章节页的两个框都是 BODY 类型,得靠宽度区分) 布局:标题和内容(正文页) ph_type=1(TITLE):宽 11.5" 高 0.8",位于 (0, 0) → 标题横条 ph_type=7(OBJECT):宽 11.5" 高 4.8",位于 (0, 1.0") → 内容区这段探查结果非常有用。它告诉我每个占位符在屏幕上的精确位置和尺寸,这意味着我可以提前算好每个框能装多少字,不用等 AI 填完才发现溢出。
怎么算一页能装多少字
这个公式是我自己摸出来的,不算精确但足够用:
一行字数 ≈ 占位符宽度(英寸) × 72 / 字号(pt) 总容量 ≈ 一行字数 × 最大行数这里 72 是 1 英寸等于多少 pt(点),是排版里的基本换算单位。
比如经典模板的正文页内容区,宽度 11.5",正文字号我定的是 24pt:
一行字数 ≈ 11.5 × 72 / 24 = 34.5 ≈ 29 字(保守一点) 总容量 ≈ 29 字/行 × 8 行 = 232 字为什么是 8 行?因为内容区高度 4.8",24pt 字号行高约 30pt(行高系数 1.25),换算一下就是约 8 行。
算出来之后,AI 填字之前就有了硬约束:每页正文不超 232 字、不超 8 行。给它的素材如果超过了,提前拆成两页。
我把所有位置的容量都算了一遍,汇总成一张表:
| 位置 | 字号 | 一行字数 | 总容量 |
|---|---|---|---|
| 封面主标题 | 48pt | 22 字 | 4 行 = 88 字 |
| 封面副标题 | 32pt | 29 字 | 2 行 = 58 字 |
| 章节页编号 | 48pt | 4 字 | 纯数字 01-99 没问题 |
| 章节页标题 | 48pt | 14 字 | ≤ 4 字完全够 |
| 正文页标题横条 | 40pt | 25 字 | 1 行 |
| 正文页内容区 | 24pt | 29 字 | 8 行 = 232 字 |
| PPT 里的表格 | 14pt | — | 约 12 行 |
有了这张表,AI 填字就像带着标尺干活。
字体字号谁来管
模板里的占位符默认是继承母版的字体和字号。我实操的时候索性放弃了继承,所有字号手动指定。
为什么不靠母版?因为 python-pptx 的高级 API 只看得到当前文本框上显式写的字体属性,母版预设值得扒底层 XML 才能拿到。扒 XML 太麻烦,而且就算拿到了,也不确定母版里写的是什么字体。
所以我直接在代码里硬写死:
- 封面主标题:48pt,黑体
- 封面副标题:32pt,黑体
- 章节页左框编号:48pt,黑体,加粗
- 章节页右框章节标题:48pt,黑体,加粗
- 正文页标题横条:40pt,黑体
- 正文页内容:24pt,黑体,行距 1.25,段前段后各 6pt
- PPT 里的表格:14pt,宋体
这样做的好处是字体字号完全可控,不管模板的母版里预设了啥,python-pptx 都按我指定的值写进去。坏处是模板不能随便换,换了新模板得重新探查、重新算容量。但我平时就用一个模板,所以没问题。
所以,如果按照上述流程操作,你会发现你的AI能够迅速的帮你在ppt里面填完字,而不会出现排版乱、溢出、字体不对、调不动的问题。而且当你拿给别人看,别人也看不出来任何AI的痕迹。
总结
请预制一个ppt模板。然后把模版告诉给AI。接着让AI使用python-pptx为你填写字。最后你将得到一个无AI痕迹的ppt。