下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/user_de02a30f--ppt-template-clone.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_de02a30f/ppt-template-clone。- 一键复刻 PPT 模板制作同款 PPT。当用户提供 PPT 模板(pptx)与内容材料(docx/pdf/文字),要求"
- 按模板风格 / 同款风格 / 套用模板"
- 生成 PPT 时使用:学习模板风格 → 从模板 pptx 内部完整提取干净背景图并全程复用 → JSON 数据驱动 WPS COM 逐页构建,输出 PPTX。触发词:复刻PPT、同款PPT、按模板做PPT、模板风格、套用这个模板。
阅读全文 (展开查看完整说明)
概述
声明:本技能参考 cli-anything-wps 技能升级而来。作者:xujianpeng。
通过「学习模板风格 → 提取原始素材 → JSON 数据驱动构建」三步,把任意 PPT 模板的视觉风格1:1 复刻到新 PPT 上。产出仅包含 PPTX 文件(不生成 PDF)。
前置条件
- Windows 系统 + WPS Office 12.0+(COM 接口 KWPP.Application)
- Python 3.10+,依赖:
pywin32、Pillow - ⚠️ 构建前 WPS 会强制结束残留进程:提醒用户先保存正在编辑的 WPS 文档
项目目录约定
<project_dir>/ # 以输出文件名命名的独立目录
├── assets/ # 从模板提取的背景图(bg_cover/bg_section/bg_content/bg_thanks.png)
├── style_preview/ # Step 1 导出的模板页面图
├── preview/ # 成品逐页质检图
├── data.json # 页面编排文件
└── <名称>.pptx # 最终产物(仅 pptx)Step 1:学习模板风格
导出模板每页为 PNG,目检归纳风格要素:
python <skill>/scripts/export_template.py "<模板.pptx>" "<project_dir>/style_preview" 960 540用 Read 工具查看:封面、目录、章节过渡页、2-3 张内容页、结尾页。归纳并记录四类版式对应的:配色(主色/强调色/中性色)、字体层级(标题字号/正文/点缀)、版式结构(标题位置、内容区起止、页码位置)、装饰元素(水墨/商务/几何等)。后续所有排版决策必须与模板归纳结果一致,禁止套用其他风格。
字号不要靠目检,直接从 XML 读(详见文末「复刻保真度要点」第 3 条):
python - <<'PY'
import zipfile, re
z = zipfile.ZipFile(r"<模板.pptx>")
t = z.read("ppt/slides/slide3.xml").decode("utf8", "ignore")
for m in re.finditer(r'<a:p>.*?</a:p>', t, re.S):
s = m.group(0)
txt = "".join(re.findall(r'<a:t>(.*?)</a:t>', s, re.S))
if txt.strip():
print(sorted({int(x)/100 for x in re.findall(r'sz="(d+)"', s)}), repr(txt[:30]))
PYStep 2:提取原始素材(干净背景图)
不要用带文字的整页截图当背景。模板的背景大图以原始分辨率(常见 1600×900)存放在pptx 内部 ppt/media/ 中,完整提取后全程复用,风格与原模板完全一致:
python <skill>/scripts/extract_media.py "<模板.pptx>" "<project_dir>/assets"脚本输出媒体清单(尺寸/大小/判定),按面积降序。处理规则:
- 用 Read 逐一查看「候选背景大图 ★」,确认各图对应的版式
- 重命名归位:
bg_cover.png(封面)、bg_section.png(章节过渡页)、
bg_content.png(内容页)、bg_thanks.png(结尾页);同一版式多张时选最干净的一张
- 候选大图不足四类时,允许复用(如内容页背景兼作目录页背景);
完全没有干净大图时,才退化用 export_template.py 导出的整页图并裁剪掉文字区域
.tiff也要翻一翻:模板的背景大图常是imageN.tiff(3840×1152 之类),
被脚本归到「矢量图(备用)」但其实是位图,用 Pillow 转 PNG 后即可用
- 图片宽度/裁剪以 XML 为准:去
ppt/slideLayouts/slideLayout*.xml读
<a:blipFill> 的 srcRect(裁剪比例,万分之一)与 <a:off>/<a:ext>(EMU,÷12700 得 pt),按此合成干净背景图,比肉眼比对可靠得多。母版底色读 ppt/slideMasters/slideMaster1.xml 的 <p:bg>。
Step 3:JSON 数据驱动构建
内容来自用户材料(docx/pdf/文字),数据与事实严格取自材料,禁止编造。
- 按
references/element-spec.md的元素类型与硬约束,编写data.json:- 页数 12-16 页,标准页序:封面 → 目录 → 概览 → (章节页 + 内容页)× N → 总结 → 结尾
- 每页第一个元素必须是
bg;相邻页主版式不重复;所有元素y+h ≤ 518 - 数字提炼成
stat_cards,要点用list_badges,板块用info_card,页底总结用tagline
- 验证 JSON 合法后构建(只输出 PPTX,不生成 PDF):
python <skill>/scripts/build_ppt.py "<project_dir>/data.json" "<project_dir>/<名称>.pptx"- 质量检查(必做):用
export_template.py把成品导出到preview/,
逐页目检:文字溢出、元素重叠、颜色错用、页码缺失、版式连续重复。发现问题改 data.json 后重新构建,直到通过。
WPS COM 已知坑(脚本已内置处理,手工调试时注意)
| 坑 | 处理 |
|---|---|
KWPP.Application 没有 Quit() 方法 | 结束时 pres.Close() + taskkill /F /IM wpp.exe /T |
| 打开/新建弹窗口干扰自动化 | Presentations.Open(src, True, False) / Presentations.Add(0)(WithWindow=False) |
| 形状默认带阴影 | 每个形状设置 Shadow.Visible = 0 |
| 中文字体不生效 | 同时设置 Font.Name 和 Font.NameFarEast |
| 文字颜色设置失败 | 优先 Font.Color.RGB,异常时回退 Font.Fill.ForeColor.RGB;RGB 值 = R + G×256 + B×65536 |
| 文本框自动缩放破坏布局 | TextFrame.AutoSize = 0、WordWrap = -1、四边 Margin 置 0 |
| 行距倍数不生效/文字叠在一起 | ParagraphFormat.LineSpacing(磅)在 WPS 不可写;倍数必须用 LineRuleWithin = 0 + SpaceWithin = 倍数。注意 WPS 的 LineRuleWithin 与 MS 文档语义相反,传 -1 会让行距塌成 0 导致文字重叠。实测 pitch ≈ 1.19 × 字号 × SpaceWithin |
| 保存弹出提示 | app.DisplayAlerts = 1(ppAlertsNone) |
| 导出 PDF 格式码 | SaveAs(path, 32)(本技能默认不导出 PDF) |
复刻保真度要点(踩过的坑)
- 素材透明通道:
extract_media.py已改为保留 alpha。若用convert("RGB")
压平,logo/图标类 PNG 的透明区会变成白块,合成到深色背景上会露出白底。
- 背景不要用整页截图:模板背景大图(本技能实测常以
.tiff形式躺在
ppt/media/ 里,长边 3840)会被 extract_media.py 归到「矢量图(备用)」,要手动转 PNG。图片的实际摆放参数(含 srcRect 裁剪、off/ext 位置)在ppt/slideLayouts/slideLayoutN.xml 里,以 XML 为准而不是肉眼估。典型两版式:内容页 = 大图按 srcRect 裁边后拉满整页;封面/目录页 = 纯色底(取 slideMaster 的 p:bg 色)+ 一张图只占下半部分。
- 字号必须读 XML:目检字号误差可达 20%。用
re.findall(r'sz="(d+)"', slideXml) 取真实值再除以缩放比(模板 1920×1080 →本技能 960×540,即 ÷2)。同一模板里正文常见 32(=16pt),密集小字 24(=12pt),章节条 44(=22pt),页面标题 54(=27pt)。
- 字号小不是问题,行距才是:深色卡片排版靠
SpaceWithin拉开行距
(实测模板卡片 body 约 2.0 倍行距),而不是把字号调大。
- 构建后必做逐页目检:把成品导回 PNG 逐页看——文字溢出卡片、
多行文本重叠、语义色键写错(用的是 red 但画的是蓝色主题)这三类问题在缩略图阶段很难发现。