PPT 演示文稿生成(PPTX Generator)
> .pptx 本质是 XML 的 ZIP 包。本技能用 python-pptx 生成与编辑,并强制执行一套「设计感 + 反 AI 味」规范,让产出的幻灯片专业、有辨识度,而不是满屏项目符号的白底套模板。
触发词
做个 PPT、生成演示文稿、幻灯片、slides、把大纲做成 deck、读取 pptx、提取文字、编辑 pptx、套模板、加图表、加演讲者备注、课件、融资 deck、汇报材料
环境准备
python-pptx 在隔离环境里需要安装一次:
# 用 WorkBuddy 托管的 Python 建 venv 并安装(推荐,隔离干净)
"C:/Users/Administrator/.workbuddy/binaries/python/versions/3.13.12/python.exe" -m venv "C:/Users/Administrator/.workbuddy/binaries/python/envs/default"
"C:/Users/Administrator/.workbuddy/binaries/python/envs/default/Scripts/pip.exe" install python-pptx
# 之后运行脚本:
"C:/Users/Administrator/.workbuddy/binaries/python/envs/default/Scripts/python.exe" your_script.py
> 若脚本里 import pptx 失败,再装一次即可。不要全局 pip install。
创建新 deck 的核心做法
from pptx import Presentation→prs = Presentation()- 先设尺寸:
prs.slide_width = Inches(13.333); prs.slide_height = Inches(7.5)(16:9 宽屏)。默认的Presentation()是 10×7.5 英寸,不够宽。 - 用 空白版式
prs.slide_layouts[6]自由摆放,或选带占位符的版式。 - 加元素:
slide.shapes.add_textbox(left, top, width, height)、add_picture()、add_chart()、add_shape()。 - 坐标单位用 Inches / Pt / Emu,别用裸像素。
- 演讲者备注:
slide.notes_slide.notes_text_frame.text = "..."(每页一次)。 - 保存:
prs.save("deck.pptx")。
完整可改模板见 references/pptx_template.py(含标题页、两栏、图表页、图标卡、时间轴五种版式,复制即用)。
编辑已有 deck / 套模板
from pptx import Presentation
prs = Presentation("template.pptx") # 套模板:直接读模板
slide = prs.slides.add_slide(prs.slide_layouts[6])
# 改文字:遍历 slide.shapes,找到 text_frame 后改 run.text(保留格式)
# 加页:prs.slides.add_slide(...)
prs.save("out.pptx")
重要:
- 改文字用 run.text = "新内容",不要 text_frame.text = "..."——后者会把整段塌缩成一个无样式的 run,丢失字体/加粗。
- 模板里的「占位元素 ≠ 你的内容条数」:模板有 4 个团队成员位,你只有 3 个,就删掉第 4 个的整组(图+文本框),别只删文字。
- 一页一个 <a:p> 列表项;项目符号让版式继承,别在文本里写字面 •(会双 bullets)。
设计原则(不要做无聊的幻灯片)
配色:挑「为这个主题设计过」的色板
| 主题 | 主色 | 辅色 | 强调 |
|---|---|---|---|
| 午夜高管 | 1E2761 深蓝 | CADCFC 冰蓝 | FFFFFF 白 |
| 森林苔藓 | 2C5F2D 森绿 | 97BC62 苔绿 | F5F5F5 米 |
| 珊瑚能量 | F96167 珊瑚 | F9E795 金 | 2F3C7E 蓝 |
| 暖陶土 | B85042 陶土 | E7E8D1 沙 | A7BEAE 鼠尾草 |
| 海洋渐变 | 065A82 深蓝 | 1C7293 青 | 21295C 午夜 |
| 炭灰极简 | 36454F 炭 | F2F2F2 白 | 212121 黑 |
| 青绿信任 | 028090 青 | 00A896 海沫 | 02C39A 薄荷 |
| 莓果奶油 | 6D2E46 莓 | A26769 灰玫 | ECE2D0 奶油 |
| 鼠尾草静 | 84B59F 鼠尾草 | 69A297 桉 | 50808E 板岩 |
| 樱桃大胆 | 990011 樱桃 | FCF6F5 白 | 2F3C7E 蓝 |
- 主导权 > 平等:一个颜色占 60–70% 视觉重量,1–2 个辅助,1 个锐利强调。别让所有颜色一样重。
- 深/浅对比:标题+结论页用深底,内容页用浅底("三明治"结构);或全程深底显高级。
- 统一视觉母题:选一个独特元素重复——圆角图框、彩色圆里的图标。贯穿每页。别用色条/强调条纹当母题(见避坑)。
排版
- 安全字体(在你的 PowerPoint 和预览里都按宽度渲染):Arial、Calibri、Cambria、Times New Roman、Courier New、Bookman Old Style、Century Schoolbook。正文用它。
- 标题要个性、零风险:安全衬线标题(Cambria/Bookman/Century)+ 安全无衬线正文(Calibri/Arial)。
- 用户要了安全列表外的字体(Georgia、Trebuchet MS 等),容器留 ~10% 余量,别信预览的贴合度。
- 绝不用 Aptos 当默认(Office 2023 后默认,两端都不稳)。
| 元素 | 字号 |
|---|---|
| 页面标题 | 36–44pt 粗 |
| 小节标题 | 20–24pt 粗 |
| 正文 | 14–16pt |
| 注释 | 10–12pt 灰 |
每页都要有视觉元素
图片、图表、图标或形状。纯文字页会被忘记。
版式选项:两栏(左文右图)、图标+文字行(彩圆里的图标+粗标题+下描述)、2×2/2×3 网格、半出血图(一侧满图+内容叠加)。
数据展示:大数字 callout(60–72pt 大数字+小标签)、对比列(前/后、优/劣)、时间轴/流程(编号步骤+箭头)。
间距
- 边距 ≥ 0.5"
- 内容块间距 0.3–0.5"
- 留呼吸感,别塞满
反 AI 味避坑清单(生成后逐条自查)
- 不要重复同一版式——列、卡片、callout 要换着来
- 不要居中正文——段落和列表左对齐,只有标题居中
- 不要吝啬字号对比——标题 36pt+ 才能从 14–16pt 正文里跳出来
- 不要默认蓝——挑贴合主题的色
- 不要随机混间距——定 0.3" 或 0.5",全程一致
- 不要只妆一页、其余留白——要么全程精致,要么全程朴素
- 不要做纯文字页——加图/图标/图表/视觉元素
- 不要忘文本框内边距——对齐文字边缘时设
text_frame.margin_left = 0之类 - 不要低对比元素——图标和文字都要强对比
- 绝不在标题下加强调线——这是 AI 幻灯片的标志,用留白或背景色代替
- 绝不加装饰色条/强调条纹——横跨页宽的页眉页脚条、单侧竖条、卡片边缘细条、"单边边框"矩形,都像 AI 填充物。要区分卡片,用淡背景色、投影或图标,别用边条
- 不要默认奶油/米色背景——没指定就用白(FFFFFF)或品牌色;避开 F5F5DC/FAF0E6/FAEBD7/FFF8E1
- 不要发出溢出形状的文本——放不下就缩字号、拆页或放大容器
图表(用原生,别渲染成图)
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
chart_data = CategoryChartData()
chart_data.categories = ['Q1','Q2','Q3','Q4']
chart_data.add_series('营收', (12,19,21,28))
slide.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED,
Inches(1), Inches(2), Inches(8), Inches(4), chart_data)
- 设
chart.has_title、chart.plots[0].has_data_labels = True、chart.series[0].format.fill.solid()上色,别用默认裸图。 - 单系列关掉图例
chart.has_legend = False。 - 原生没有的图型(桑基、网络、和弦)才转图片插入。
QA(必须做)
生成第一版总有真实问题(重叠、溢出、错位)。改完只重渲改动的页,复查,停。
内容 QA:用 python-pptx 遍历 slide.shapes 打印每页文本,查缺漏、错序、占位残留(如 "lorem"/"TODO"/"[insert")。
视觉 QA(关键):把 pptx 转图片看每页:
# 用 LibreOffice 转 PDF(沙箱里 soffice 可能挂,必要时用系统安装版)
soffice --headless --convert-to pdf deck.pptx
pdftoppm -jpeg -r 150 deck.pdf slide
看每页图,重点查:文本溢出/截断(最常见、最显眼)、元素重叠、页脚碰内容、间距<0.3"、边距<0.5"、对齐不一致、低对比文字、模板装饰错位、残留占位内容。
文件 QA:确保 prs.save() 成功、能用 PowerPoint 打开。python-pptx 生成的文件兼容性好;若套了模板,检查模板原始占位是否清理干净。
一句话流程
列结构 → 选色板与母题 → 写 references/pptx_template.py 风格的生成脚本 → 跑出 deck → 转图逐页视觉 QA → 修溢出/重叠/对比 → 存档。