Word to PPT Files(Word 转 PPT · 严格套模板)
概述
用户同时上传 Word 文档 和 PPT 模板 时,把 Word 的内容逐字逐句套入模板,
生成一个结构与视觉与原模板完全一致的 PPT。
两条不可违背的铁律:
> 铁律一 · 内容忠实:PPT 中每一个字都必须来自 Word 原文,逐字逐句,
> 不做扩写、不做改写、不做提炼概括。只允许在必要时截断并保留省略号。
>
> 铁律二 · 模板不动:封面、目录、过渡页、母版、主题、Logo 位置、配色、
> 图片一律原样保留。内容页通过克隆模板已有页面生成,因此版式天然一致。
触发词
- 生成PPT / 做个PPT / 帮我把这个做成PPT
- 把Word套进PPT模板 / 按模板生成PPT / Word转PPT
- 用这个模板做PPT / 套模板 / 套PPT
- 我发你Word和PPT模板,生成PPT
- 上传了Word和PPT,开始生成
触发条件:用户消息中同时存在 Word 文件(.docx/.doc)与 PPT 模板(.pptx/.potx),
并表达了"生成/制作 PPT"的意图。两者缺一不可。
工作流程
阶段零:识别输入
从用户消息中找出两类文件:
| 类型 | 扩展名 | 判定方式 |
|---|---|---|
| Word 原文 | .docx .doc |
内容来源 |
| PPT 模板 | .pptx .potx |
视觉与结构来源 |
若只找到一个,向用户确认缺失的那一类,不要猜测。
若用户上传了多个 Word,询问要用哪一个(或依次生成)。
.doc / .potx 需先转换:.doc → 用 libreoffice --headless --convert-to docx,
.potx → 直接改名为 .pptx 或同样用 LibreOffice 转换。
阶段一:解析输入
运行解析脚本,得到 Word 结构清单与模板版式地图:
python3 <skill_dir>/scripts/inspect_inputs.py "<Word路径>" "<模板路径>" -o "<工作目录>"
产出(工作目录内):
| 文件 | 用途 |
|---|---|
docx_blocks.json |
Word 逐块内容(标题/段落/列表/表格/图片),文字逐字原样 |
docx_images/ |
从 Word 提取的图片文件 |
template_map.json |
模板版式清单 + 页面角色(封面/目录/过渡页/内容页)+ 样板页 |
inspect_report.txt |
人类可读摘要,务必读这个 |
阅读 inspect_report.txt,确认三件事:
- Word 大纲层级是否识别正确(
#的层数) - 模板的静态页清单(
static_slides,这些页原样保留) - 内容页样板页索引(
content_template_slide,克隆它就等于复用模板样式)
若模板中没有任何内容页可作为样板(例如模板只有封面+目录),
则退化为使用版式索引 default_content_layout 新建页,并在汇报中说明。
阶段二:编写内容映射计划
根据 docx_blocks.json 与模板结构,编写 <工作目录>/plan.json。
这是生成引擎的唯一输入契约。
映射规则(必须遵守):
- 一个 Word 一级标题 → 一张内容页(当该标题下内容不多时)
- 一个 Word 一级标题 → 多张内容页(当内容超过一页承载量时):
- 一页放不下的正文,拆到下一页,页面标题用同一标题名
- 可为后续页加"(续)"标注,但标题主体文字仍须逐字来自 Word - 表格单独成页(
page_type: "table") - 图片:
- Word 中独立成段的图片 → 单独成页(page_type: "image")
- 与正文同段的图片 → 放在正文页,放不下的另起一页 - 文字层级:Word 的一级标题 →
title;正文段落 →blocks[].level = 0;
若有二级/三级结构(列表项、子标题)→level = 1/level = 2 - 每个 slide 必须写
source_blocks,列出它承载的docx_blocks的seq,
用于生成核对清单,做到可追溯
关键:blocks[].text 必须是 Word 原文的完整拷贝,一个字都不能改。
不要为了"更好看"而改写句子、不要提炼关键词、不要补连接词。
plan.json 完整结构:
{
"output_name": "最终文件名.pptx",
"slides": [
{
"source_slide": 2,
"page_type": "content",
"title": "一、市场环境概述",
"blocks": [
{"level": 0, "text": "本年度行业整体规模达到1200亿元,同比增长18.5%。"},
{"level": 0, "text": "头部三家厂商合计市占率51.3%。"}
],
"source_blocks": [2, 3, 4, 5]
},
{
"source_slide": 2,
"page_type": "table",
"title": "二、核心经营指标",
"blocks": [],
"table": [["指标", "2024年", "2025年"], ["营业收入", "6.5", "8.6"]],
"source_blocks": [10]
},
{
"source_slide": 2,
"page_type": "image",
"title": "三、增长归因分析(图示)",
"blocks": [],
"images": ["docx_images/img_001.png"],
"source_blocks": [16]
}
]
}
字段说明:
| 字段 | 必填 | 说明 |
|---|---|---|
source_slide |
是 | 克隆模板第几页(0-based),取 content_template_slide |
page_type |
是 | content / table / image |
title |
否 | 页面标题,逐字来自 Word |
blocks |
否 | 正文要点数组,每项 {level, text},文字逐字来自 Word |
table |
否 | 二维数组,page_type=table 时使用 |
images |
否 | 图片相对路径(相对工作目录),page_type=image 时使用 |
source_blocks |
是 | 溯源用的 docx_blocks.seq 列表 |
clear_texts |
否 | 需要额外清空的模板残留文字 |
阶段三:生成 PPT
python3 <skill_dir>/scripts/build_ppt.py "<工作目录>" "<输出.pptx>" \
--checklist "<工作目录>/内容映射核对清单.md"
引擎自动完成:
- 以模板为基底打开(主题、母版、Logo、配色原样保留)
- 按
plan.json逐页克隆模板内容页(deepcopy 形状树 + 移植图片关系) - 写标题、填正文(复用模板段落的
pPr/rPr,字体字号颜色全继承) - 表格 → PPT 表格并套用模板主题
- 图片 → 按原始宽高比嵌入
- 清除所有未被写入的模板占位提示文字
- 输出 PPT 与核对清单
生成前会先做保真校验:若 plan.json 中出现任何不在 Word 原文里的文字
(改写、扩写、自造标题),脚本会直接终止并列出问题位置,不会产出失真的 PPT。
确需跳过时加 --no-strict(不建议)。
无内容页样板时的降级:若模板没有可克隆的内容页、且默认版式也没有正文容器,
引擎会自动在标题下方安全区域新建文本框承载正文,确保内容不丢失。
此时应在汇报中说明视觉一致性弱于克隆方案。
输出文件必须写入 /workspace(用户可见目录)。建议命名:
<Word文档主名>-套模板.pptx
阶段四:汇报与核对
用 present_files 呈现两个文件:
- 最终 PPT(
/workspace/xxx.pptx)— 主产出 - 内容映射核对清单(
.md)— 逐页对照 Word 原文,用于确认零遗漏零改写
汇报时说明:
- 共生成 N 页(模板原有 M 页 + 新增 K 页)
- 模板的封面/目录/过渡页/Logo/配色均已原样保留
- Word 中是否有内容未纳入(核对清单的"未纳入"章节)
- 提示用户核对清单可在编辑器中预览
脚本说明
| 脚本 | 用途 |
|---|---|
scripts/inspect_inputs.py |
解析 Word 结构(含表格/图片)+ 解析 PPT 模板版式与页面角色 |
scripts/build_ppt.py |
克隆模板页 → 填充内容 → 输出 PPT 与核对清单 |
依赖:python-docx、python-pptx、Pillow。缺失时执行
sudo pip3 install python-docx python-pptx Pillow。
保真约束(务必遵守)
内容侧:
- 绝不改写:不做同义替换、不做精简、不做润色、不调语序
- 绝不扩写:不增加 Word 中没有的句子、例子、解释、过渡语
- 可截断:单页放不下时,把后续内容移到下一页;若必须截断句子,
保留省略号并确保下一段紧接完整内容 - 不改数字:百分比、金额、单位、专有名词一律原样
- 不改标点:中英文标点、全半角保持与 Word 一致
模板侧:
- 不新增页:绝不插入空白页或非模板样式的页面
- 不动静态页:封面、目录、过渡页保持
static_slides原样 - 不动母版/主题:不修改
theme1.xml、slideMaster、slideLayout - 不动 Logo:Logo 位置、大小、文件原样(克隆页会自动带上)
- 不改配色:不调整任何形状的填充色、线条色、字体颜色
- 不删装饰:模板的装饰条、色块、图标、水印一律保留
排版侧(内容页要有层次感):
- 先分区再排版:标题区 / 正文区 / 图表区各司其职,不混写
- 层级分明:一级要点用模板的一级样式(大字号),二级用二级样式(小字号、缩进)
- 一页一个主题:不要把多个不相关章节塞进一页
- 参照模板自身:样式全部来自模板样板页,不自造字体字号
- 列表优先于段落:Word 中的并列短句转为要点,长段落保留完整句
详见 references/layout_rules.md(排版映射细则)
与 references/fidelity_rules.md(保真自检清单)。
常见问题排查
| 现象 | 原因 | 处理 |
|---|---|---|
| 标题没写入 | 标题框识别失败 | 在 plan.json 里给该页加 clear_texts,或检查模板标题是否为组合形状 |
| 残留【一级要点】等文字 | 占位文字未被覆盖 | 确认该页 blocks 非空;引擎会自动清空未使用的容器 |
| 生成页数与预期不符 | plan.json 的 slides 数量即页数 |
检查 plan.json |
| 图片没插入 | 路径不对 | images 路径相对工作目录,确认 docx_images/ 下文件存在 |
| 模板只有封面没内容页 | 无样板可克隆 | 引擎会退化用 default_content_layout,汇报中说明 |
| 中文乱码 | 编码问题 | 脚本已强制 UTF-8;检查输入文件本身 |
注意事项
- 本技能只在用户同时提供 Word 和 PPT 模板时触发,单文件场景不适用
- 绝不为了"美观"而改写内容——这是本技能与通用 PPT 生成器最大的区别
- 不询问用户"要不要改写"——本技能的定位就是忠实,直接按忠实执行
- 若 Word 内容极少(不足一页),只生成一页内容页,不强行凑页
- 若 Word 内容极多(几十页),按章节合理拆页,并在汇报中说明页数
- 输出统一写到
/workspace,文件名避免特殊字符