通过从参考模板中提取视觉风格,并使用 PptxGenJS 从头重新创建幻灯片来生成演示文稿。适用场景:用户提供 PPT……
PPT 由 Template 中生成是一项面向实际任务的技能,主要用于Generate 演示文稿, 取自参考模板的样式, 然后用 PptxGenJS.;Core 原理构建新幻灯片 : 永远不要修改现有的 PPT XML.;
该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
通过从参考模板中提取样式,再结合 PptxGenJS 从零构建全新幻灯片,实现演示文稿的自动生成。
核心原则:绝不修改现有 PPT 的 XML 结构;仅分析其视觉样式,然后完全重新绘制。
默认模板目录:{workspaceDir}/template/
每次执行时:
{workspaceDir}/template/ 目录下的所有 *.pptx 文件。.pptx 文件或指定路径。支持用户上传 .pptx 文件。处理前需执行以下检查:
{workspaceDir}/template/ 以供后续复用。# 若为 .pptx 文件,先转为 PDF 用于视觉分析:
python3 {baseDir}/scripts/pptx_to_pdf.py template.pptx /tmp/ppt_style/template.pdf
# 提取每页图像:
bash {baseDir}/scripts/extract_pages.sh /tmp/ppt_style/template.pdf /tmp/ppt_style/ 150
# 从 PPTX XML 中高精度提取样式:
python3 {baseDir}/scripts/extract_style.py template.pptx -o /tmp/ppt_style/style_raw.yaml
读取 style_raw.yaml 获取精确样式数据(十六进制颜色值、字体名称、字号(单位:pt)、位置(单位:英寸)、填充类型、线条样式等);再读取其中 3–5 页图像,用于语义理解(如元素角色判断、版式分类)。
样式提取分为两个层级:
| 层级 | 数据来源 | 需捕获内容 |
|---|---|---|
| 全局样式 | style_raw.yaml | 配色(十六进制)、排版(字体/字号/字重)、装饰性元素 |
| 单版式样式 | style_raw.yaml + 页面图像 | 元素清单:类型、角色、坐标(x/y)、尺寸(w/h)、样式属性 |
支持的元素类型包括:text、image、video、shape、line、numbered_list、step_list、tag_group、chart、table。
对于图片与视频:设置 placeholder: true,并附带 description 字段,便于用户后续手动替换。
最终结果写入 style.yaml。Schema 定义见:references/style-schema.md。
调用 pptx 技能(基于 PptxGenJS)创建幻灯片:
style.yaml 获取视觉参数。.pptx 文件。PptxGenJS 本身的生成速度极快(秒级),但为大量幻灯片编写 JS 代码可能触发上下文长度或执行时间限制。应对策略如下:
| 页数范围 | 策略 |
|---|---|
| ≤15 | 单次生成流程 |
| 16–30 | 拆分为两个 JS 文件:第 1–15 页、第 16–30 页;依次生成后,使用 pptx-merge 合并;或在一个 pres 对象中,通过两段代码块协同生成 |
| 31–100+ | 为每种版式定义一个 幻灯片工厂函数,再遍历内容数组批量生成;单个 JS 文件,数据驱动 |
大型文稿推荐采用幻灯片工厂模式:
// 根据 style.yaml 定义各类版式的工厂函数
function makeCover(pres, content) { /* ... */ }
function makeContent(pres, content) { /* ... */ }
function makeSection(pres, content) { /* ... */ }
// 内容数组 —— 易于扩展
const slides = [
{ layout: "cover", title: "...", subtitle: "..." },
{ layout: "content", title: "...", items: [...] },
// …… 可达 50+ 条目
];
slides.forEach(s => layoutFactories[s.layout](pres, s));
该方式使代码体积复杂度为 O(版式数),而非 O(页数)。
目标输出文件小于 20 MB。PptxGenJS 默认输出极小(纯文本类文稿通常为 100–500 KB)。大体积主要源于嵌入的图像资源。当输出接近 20 MB 时,执行以下措施:
style.yaml 具备复用性:一旦提取完成,即可无限次生成同风格 PPT。shrinkText: true 实现长文本自动缩放适配。style_raw.yaml 中提取的实际值(不可硬编码为 16:9)。{workspaceDir}/
├── template/ ← .pptx 模板目录(自动发现)
│ └── *.pptx ← 单个文件最大 50 MB
├── output/ ← 生成的 PPT 输出目录
│ └── *.pptx ← 单个文件最大 20 MB
/tmp/ppt_style/ ← 临时工作目录(非持久化)
├── template.pdf
├── page-*.jpg
├── style_raw.yaml ← extract_style.py 输出
└── style.yaml ← 整合后版本(含精确样式 + 语义信息)
| 问题 | 解决方案 |
|---|---|
| 模板文件 > 50 MB | 提示用户压缩文件或移除内嵌媒体资源 |
| 输出文件 > 20 MB | 启用占位符,减少图片数量或降低分辨率 |
| 页数 > 30 导致超时 | 采用幻灯片工厂模式,实施数据驱动式生成 |
| 未找到模板 | 提示用户上传 .pptx 文件或指定路径 |
| 存在多个模板 | 列出全部选项,要求用户主动选择 |
| 字体不可用 | 回退至 Arial / sans-serif;并在输出中注明 |
| 复杂渐变效果 | 在 style.yaml 中描述;建议使用背景图替代 |