PPT 演示文稿·免费版
原创免费技能。用开源库 python-pptx 生成和编辑 .pptx 演示文稿,面向中文演示场景(路演、汇报、培训、产品介绍)。所有指令均为本技能原创,仅依赖 MIT 许可的开源库。
红线(不可违反)
- 不套模板腔:每套幻灯片按具体主题定制版式与配色,禁用千篇一律的「奶油色背景+酸绿强调+卡片套件」AI 默认风
- 不编造数据:图表、数字、案例来自用户提供,不臆造;用户未提供时先用占位符并明确索要,绝不凭空填数
- 不引导付费:本技能为免费版,不引用任何付费端点
- 可运行交付:生成脚本基于 python-pptx 真实 API,能直接产出 .pptx
- 文字不溢出:文本框内容必须落在形状/页面边界内,宁缩小字号或拆页,不截断
何时使用
- 用户要求新建演示文稿(路演/汇报/培训/产品介绍)
- 用户要求编辑已有 .pptx(改文字、换图、调版式)
- 需要图表、图标、统一视觉系统
反触发:纯 Word/Excel/PDF 需求 → 转对应技能。
职责边界
- 本技能负责:叙事结构、版式设计、配色、图表、图标与图片排版、字体规范
- 本技能不负责:替用户做商业决策、生成需肖像权/版权的特定名人素材
5 分钟上手(复制即出成品)
下面这段脚本独立可跑,pip install python-pptx 后直接执行,会生成一份 3 页 deck.pptx
(封面 / 图表页 / 要点页),并在末尾自检「是否有形状超出页面」。
# RUN: fixture=empty
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.oxml.ns import qn
MAIN = RGBColor(0x1E, 0x27, 0x61) # 主色:深海行政(占 60-70% 视觉权重)
ACC = RGBColor(0xCA, 0xDC, 0xFC) # 辅色:冰蓝
SHARP = RGBColor(0xF9, 0x61, 0x67) # 锐色:珊瑚(只用在最想被看见的地方)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
prs = Presentation()
prs.slide_width, prs.slide_height = Inches(13.333), Inches(7.5)
BLANK = prs.slide_layouts[6]
def textbox(slide, l, t, w, h, text, size=18, bold=False, color=None):
tb = slide.shapes.add_textbox(l, t, w, h)
tf = tb.text_frame
tf.word_wrap = True
tf.vertical_anchor = MSO_ANCHOR.TOP
r = tf.paragraphs[0].add_run()
r.text = text
r.font.size, r.font.bold, r.font.name = Pt(size), bold, "微软雅黑"
if color is not None:
r.font.color.rgb = color
# python-pptx 只设 latin 字体,中文必须补 eastAsia,否则中文回退成宋体
ea = r.font._rPr.find(qn("a:ea"))
if ea is None:
ea = r.font._rPr.makeelement(qn("a:ea"), {}); r.font._rPr.append(ea)
ea.set("typeface", "微软雅黑")
return tb
def rect(slide, l, t, w, h, fill):
sh = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, l, t, w, h)
sh.fill.solid(); sh.fill.fore_color.rgb = fill
sh.line.fill.background(); sh.shadow.inherit = False
return sh
# ---- 第 1 页 封面:满版主色 + 短强调块 ----
s = prs.slides.add_slide(BLANK)
rect(s, 0, 0, prs.slide_width, prs.slide_height, MAIN)
rect(s, Inches(1.0), Inches(2.6), Inches(1.6), Inches(0.12), SHARP)
textbox(s, Inches(1.0), Inches(3.0), Inches(11), Inches(1.2),
"2026 年度产品汇报", size=40, bold=True, color=WHITE)
textbox(s, Inches(1.0), Inches(4.3), Inches(11), Inches(0.6),
"产品部 · 面向管理层 · 12 分钟", size=16, color=ACC)
# ---- 第 2 页 图表 + 大数字 ----
s = prs.slides.add_slide(BLANK)
textbox(s, Inches(0.8), Inches(0.5), Inches(11), Inches(0.8),
"季度营收趋势", size=28, bold=True, color=MAIN)
cd = CategoryChartData()
cd.categories = ["Q1", "Q2", "Q3", "Q4"]
cd.add_series("营收(百万元)", (12, 19, 21, 28))
ch = s.shapes.add_chart(XL_CHART_TYPE.COLUMN_CLUSTERED, Inches(0.8), Inches(1.6),
Inches(6.2), Inches(4.4), cd).chart
ch.has_legend = False
ch.plots[0].has_data_labels = True
ch.plots[0].data_labels.font.size = Pt(11)
ch.plots[0].series[0].format.fill.solid()
ch.plots[0].series[0].format.fill.fore_color.rgb = MAIN
for i, (num, lab) in enumerate([("+38%", "同比增速"), ("28", "Q4 营收"), ("4", "新客户行业")]):
top = Inches(1.6 + i * 1.5)
textbox(s, Inches(7.6), top, Inches(4.6), Inches(0.8), num, size=32, bold=True, color=SHARP)
textbox(s, Inches(7.6), top + Inches(0.62), Inches(4.6), Inches(0.4), lab, size=13, color=MAIN)
# ---- 第 3 页 编号圆点 + 文字行(不依赖 SVG 转换的图标方案)----
s = prs.slides.add_slide(BLANK)
textbox(s, Inches(0.8), Inches(0.5), Inches(11), Inches(0.8),
"下半年三个重点", size=28, bold=True, color=MAIN)
for i, (no, title, desc) in enumerate([
("01", "渠道下沉", "覆盖 12 个地级市,建立区域代理"),
("02", "交付提速", "平均交付周期从 21 天压到 9 天"),
("03", "成本优化", "云资源与外包双线压缩 18%")]):
top = Inches(1.8 + i * 1.6)
circ = s.shapes.add_shape(MSO_SHAPE.OVAL, Inches(0.9), top, Inches(0.9), Inches(0.9))
circ.fill.solid(); circ.fill.fore_color.rgb = MAIN
circ.line.fill.background(); circ.shadow.inherit = False
r = circ.text_frame.paragraphs[0].add_run()
r.text = no
r.font.size, r.font.bold, r.font.name = Pt(16), True, "微软雅黑"
r.font.color.rgb = WHITE
textbox(s, Inches(2.1), top - Inches(0.05), Inches(9), Inches(0.5), title, size=20, bold=True, color=MAIN)
textbox(s, Inches(2.1), top + Inches(0.45), Inches(9), Inches(0.5), desc, size=14,
color=RGBColor(0x44, 0x44, 0x44))
prs.save("deck.pptx")
# ---- 自检:重开文件,查页数与溢出 ----
chk = Presentation("deck.pptx")
W, H = chk.slide_width, chk.slide_height
for i, sl in enumerate(chk.slides, 1):
over = [sh.shape_type for sh in sl.shapes
if sh.left is not None and (sh.left < 0 or sh.top < 0
or sh.left + sh.width > W or sh.top + sh.height > H)]
print(f"第{i}页 形状 {len(sl.shapes)} 个,溢出 {len(over)} 个")
print("已生成 deck.pptx")
这段脚本里最容易踩的三个坑
font.name = "微软雅黑"只改了 latin 部分,中文仍是宋体 → 必须补a:ea的typeface- 图表数据标签默认关闭 →
plots[0].has_data_labels = True,否则柱子上没数字 - 形状默认带阴影和边框 →
sh.line.fill.background()+sh.shadow.inherit = False才有干净色块
主流程
第 1 步:明确叙事与目标
确认:
- 受众与场景(投资人/内部/客户培训?)
- 核心信息(一句话主张)
- 页数预期、是否要演讲备注
质检闸 1:主张与受众不明时先对齐,不盲目出图。
第 2 步:定视觉系统(先定后做)
- 从
references/palette.md选或自定一套为这个主题服务的配色(主色占 60-70% 视觉权重,1-2 辅色,1 个锐色强调) - 字体:标题用安全字体(微软雅黑/思源黑体/苹方),正文同;避免默认 Aptos
- 确立一个视觉母题并贯穿全篇(如「图标置于彩色圆形内」、卡片网格)。彩色圆形图标框是允许的母题元素;禁用的是纯装饰性色条/边框线(页面横条、卡片单边描边、侧边竖条)
质检闸 2:配色与主题强相关,不随便套蓝;母题明确且不靠装饰线。
第 3 步:版式与内容
- 每页至少一个视觉元素(图/表/图标/形状),纯文字页不可接受
- 常见版式:两栏(左文右图)、图标+文字行、2x2/2x3 网格、半幅大图+文字覆盖、大数字 stat callout、对比列、时间线。12 种版式的选择规则与一键生成脚本见
references/layouts.md - 一份模板出 N 份成品(客户提案/月报/证书)、替换后查残留、交付前程序化体检:见
references/batch.md - 需要图表时必须用原生可编辑图表(
add_chart),不要贴图:多系列/条形/折线/饼/散点、中文字体、品牌配色、CSV 直出、交付前查"有没有拿图片冒充图表":见references/charts.md - 图表用
add_chart(),设置showValue、chartColors、关闭多余图例 - 图标渲染:用 SVG→PNG(参考 references 的图标片段)或占位形状
质检闸 3:每页有视觉、字号有层级(标题 36pt+,正文 14-16pt)、无文字溢出。
第 4 步:生成与校验
prs.save('deck.pptx')- 用 LibreOffice 转 PDF 再
pdftoppm出图,逐页目检:溢出、重叠、低对比、页边距 <0.5" - 程序化体检(字号下限、单页字数、空文本框、占位符残留)见
references/batch.md
质检闸 4:目视全部页面无缺陷再交付。
第 5 步:自检清单
- [ ] 配色为主题定制,非默认蓝/奶油
- [ ] 每页有视觉元素,无纯文字页
- [ ] 标题 36pt+,正文 14-16pt,层级清晰
- [ ] 无文字溢出形状/页面边界
- [ ] 无装饰色条/边框线(用留白或底色区分)
- [ ] 图表数据来自用户输入
- [ ] 无付费引导话术残留
- [ ] 文件可正常打开
- [ ] 批量生成的话:
{{占位符}}无残留(正文 + 表格 + 备注都要查)
失败降级
- python-pptx 未装 → 给
pip install python-pptx - 指定字体缺失 → 退回安全字体并提示
- 图表类型库不支持(桑基/网络图)→ 改用图片占位并说明
- 图标渲染依赖缺失 → 用矢量形状/emoji 替代并标注
- cairosvg/SVG 转换失败 → 退化用 Pillow 画基础形状或占位图标
依赖
python-pptx(BSD,pip 安装)、可选 Pillow(图片处理)、matplotlib(图表转图)、cairosvg(SVG→PNG 图标)。无专有组件。
相关技能推荐
excel-free— Excel 表格自动生成与处理(.xlsx):报表、台账、预算、数据清洗、图表可视化。支持公式、条件格式、多 Sheet,中文财务配色,开源pdf-free— PDF 合并 / 拆分 / 提取文字表格 / 加水印 / OCR / 转 Word:一站式处理 PDF。支持批量、表单填写、加密解密、扫描件cad-free— CAD 建模 / Mechanical Design:开源参数化建模与工程图 — 零件建模、标准件库、装配体、尺寸驱动、STEP/STL/Dbom-free— BOM 表全流程:多级 BOM 展开与汇总、齐套性检查、编码规则、替代料与版本管理、成本汇总与缺料清单、常见错误排查
致谢
本技能为原创,仅使用 MIT/BSD 许可的开源库 python-pptx 等。与任何厂商的专有演示技能无隶属、无复制关系。