返回全部 Skills

ppt-editing-skill

其他 官方认证

使用XML安全的工作流编辑现有的PowerPoint文件或模板。适用于基于模板的演示文稿更新:分析布局,将内容映射到幻灯片,安全复制/重新排序/删除幻灯片,并行编辑幻灯片XML,清理孤立资源,并重新打包经过验证的PPTX输出。

42

下载量

AI SkillHub 能力展示图

安装方式

命令行安装

在项目根目录执行以下命令,完成 Skill 安装。

npx bzskills add MiniMax-AI/skills --skill ppt-editing-skill

skill.md

name: ppt-editing-skill
description: 使用XML安全的工作流编辑现有的PowerPoint文件或模板。适用于基于模板的演示文稿更新:分析布局,将内容映射到幻灯片,安全复制/重新排序/删除幻灯片,并行编辑幻灯片XML,清理孤立资源,并重新打包经过验证的PPTX输出。
license: Proprietary. LICENSE.txt has complete terms

编辑演示文稿

基于模板的工作流程

使用现有演示文稿作为模板时:

  1. 复制并分析
   cp /path/to/user-provided.pptx template.pptx
   python -m markitdown template.pptx > template.md

查看 template.md 了解占位文本和幻灯片结构。

  1. 规划幻灯片映射:为每个内容部分选择合适的模板幻灯片。

⚠️ 使用多样化的版式——单调的演示文稿是常见的失败模式。不要默认使用基本的标题+项目符号幻灯片。主动寻找:

  • 多列布局(两列、三列)
  • 图片+文字组合
  • 全出血图片+文字覆盖
  • 引用或重点提示幻灯片
  • 节分隔页
  • 统计/数字强调
  • 图标网格或图标+文字行

避免: 每张幻灯片重复使用相同的纯文字版式。

根据内容类型匹配版式风格(例如:关键点→项目符号幻灯片,团队信息→多列布局,客户案例→引用幻灯片)。

  1. 解包
  1. 构建演示文稿(自己完成,不使用子代理):
  • 删除不需要的幻灯片(从 <p:sldIdLst> 中移除)
  • 复制要重用的幻灯片(add_slide.py
  • <p:sldIdLst> 中重新排序幻灯片
  • 在步骤5之前完成所有结构更改
  1. 编辑内容:更新每个 slide{N}.xml 中的文本。

如有子代理可用,在此处使用——幻灯片是独立的 XML 文件,子代理可以并行编辑。

  1. 清理
  1. 打包

输出结构

将用户提供的文件复制到当前工作目录下的 template.pptx。这保留了原始文件并为所有后续脚本提供了可预测的名称。

cp /path/to/user-provided.pptx template.pptx
./
├── template.pptx               # 用户提供文件的副本(永不修改)
├── template.md                 # markitdown 提取结果
├── unpacked/                   # 可编辑的 XML 树
└── edited.pptx                 # 最终重新打包的文稿

最低预期交付物:edited.pptx

---

脚本

脚本用途
unpack.py提取并美化打印 PPTX
add_slide.py复制幻灯片或从版式创建
clean.py移除孤立文件
pack.py重新打包并验证

移除不在 <p:sldIdLst> 中的幻灯片、未引用的媒体、孤立的关联文件。

始终先写入 /tmp/,然后复制到最终路径。Python 的 zipfile 模块在内部使用 seek,在某些卷挂载(如 Docker 绑定挂载)上会失败。写入本地临时路径可避免此问题。

验证、修复、压缩 XML,重新编码智能引号。

---

幻灯片操作

幻灯片顺序在 ppt/presentation.xml<p:sldIdLst> 中。

重新排序:重新排列 <p:sldId> 元素。

删除:移除 <p:sldId>,然后运行 clean.py

添加:使用 add_slide.py。切勿手动复制幻灯片文件——该脚本会处理手动复制时遗漏的备注引用、Content_Types.xml 和关联关系 ID。

---

编辑内容

子代理: 如果可用,在此处使用(在完成步骤4之后)。每张幻灯片是一个独立的 XML 文件,因此子代理可以并行编辑。在给子代理的提示中,包含:

  • 要编辑的幻灯片文件路径
  • "对所有更改使用 Edit 工具"
  • 下面的格式规则和常见陷阱

对于每张幻灯片:

  1. 读取幻灯片的 XML
  2. 识别所有占位内容——文本、图片、图表、图标、标题
  3. 将每个占位替换为最终内容

使用 Edit 工具,而不是 sed 或 Python 脚本。 Edit 工具强制限定要替换的内容和位置,提高可靠性。

格式规则

  • 将所有标题、副标题和内联标签设为粗体:在 <a:rPr> 上使用 b="1"。这包括:
  • 幻灯片标题
  • 幻灯片内的章节标题
  • 行首的内联标签(例如:"状态:"、"描述:")
  • 永远不要使用 Unicode 项目符号(•):使用正确的列表格式,使用 <a:buChar><a:buAutoNum>
  • 项目符号一致性:让项目符号继承自版式。仅在需要时指定 <a:buChar><a:buNone>

---

常见陷阱

模板适配

当源内容项目少于模板时:

  • 完全移除多余元素(图片、形状、文本框),不要仅清空文本
  • 清空文本内容后检查是否存在孤立的视觉效果
  • 使用 markitdown 进行内容质量检查,以发现数量不匹配

当替换为不同长度的文本时:

  • 较短的替换:通常安全
  • 较长的替换:可能导致溢出或意外换行
  • 文本更改后使用 markitdown 验证
  • 考虑截断或拆分内容以适应模板的设计限制

模板插槽 ≠ 源项目:如果模板有4个团队成员但源有3个用户,则删除第4个成员的整个组(图片+文本框),而不仅仅是文本。

多项目内容

如果源有多个项目(编号列表、多个部分),为每个项目创建单独的 <a:p> 元素——切勿将它们连接成一个字符串

❌ 错误——所有项目放在同一个段落中:

<a:p>
  <a:r><a:rPr .../><a:t>步骤 1:执行第一项操作。步骤 2:执行第二项操作。</a:t></a:r>
</a:p>

✅ 正确——使用粗体标题分隔段落:

<a:p>
  <a:pPr algn="l"><a:lnSpc><a:spcPts val="3919"/></a:lnSpc></a:pPr>
  <a:r><a:rPr lang="en-US" sz="2799" b="1" .../><a:t>步骤 1</a:t></a:r>
</a:p>
<a:p>
  <a:pPr algn="l"><a:lnSpc><a:spcPts val="3919"/></a:lnSpc></a:pPr>
  <a:r><a:rPr lang="en-US" sz="2799" .../><a:t>执行第一项操作。</a:t></a:r>
</a:p>
<a:p>
  <a:pPr algn="l"><a:lnSpc><a:spcPts val="3919"/></a:lnSpc></a:pPr>
  <a:r><a:rPr lang="en-US" sz="2799" b="1" .../><a:t>步骤 2</a:t></a:r>
</a:p>
<!-- 继续模式 -->

复制原始段落中的 <a:pPr> 以保留行间距。在标题上使用 b="1"

智能引号

由解包/打包自动处理。但 Edit 工具会将智能引号转换为 ASCII 字符。

当添加带引号的新文本时,使用 XML 实体:

<a:t>the &#x201C;协议&#x201D;</a:t>
字符名称UnicodeXML 实体
"左双引号U+201C&#x201C;
"右双引号U+201D&#x201D;
'左单引号U+2018&#x2018;
'右单引号U+2019&#x2019;

其他

  • 空白字符:在带有前导/尾随空格的 <a:t> 上使用 xml:space="preserve"
  • XML 解析:使用 defusedxml.minidom,而不是 xml.etree.ElementTree(会破坏命名空间)