安装方式
命令行安装
在项目根目录执行以下命令,完成 Skill 安装。
npx bzskills add MiniMax-AI/skills --skill ppt-editing-skill 使用XML安全的工作流编辑现有的PowerPoint文件或模板。适用于基于模板的演示文稿更新:分析布局,将内容映射到幻灯片,安全复制/重新排序/删除幻灯片,并行编辑幻灯片XML,清理孤立资源,并重新打包经过验证的PPTX输出。
42
下载量
命令行安装
在项目根目录执行以下命令,完成 Skill 安装。
npx bzskills add MiniMax-AI/skills --skill ppt-editing-skill name: ppt-editing-skill
description: 使用XML安全的工作流编辑现有的PowerPoint文件或模板。适用于基于模板的演示文稿更新:分析布局,将内容映射到幻灯片,安全复制/重新排序/删除幻灯片,并行编辑幻灯片XML,清理孤立资源,并重新打包经过验证的PPTX输出。
license: Proprietary. LICENSE.txt has complete terms使用现有演示文稿作为模板时:
cp /path/to/user-provided.pptx template.pptx
python -m markitdown template.pptx > template.md
查看 template.md 了解占位文本和幻灯片结构。
⚠️ 使用多样化的版式——单调的演示文稿是常见的失败模式。不要默认使用基本的标题+项目符号幻灯片。主动寻找:
避免: 每张幻灯片重复使用相同的纯文字版式。
根据内容类型匹配版式风格(例如:关键点→项目符号幻灯片,团队信息→多列布局,客户案例→引用幻灯片)。
<p:sldIdLst> 中移除)add_slide.py)<p:sldIdLst> 中重新排序幻灯片slide{N}.xml 中的文本。如有子代理可用,在此处使用——幻灯片是独立的 XML 文件,子代理可以并行编辑。
将用户提供的文件复制到当前工作目录下的 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 工具,而不是 sed 或 Python 脚本。 Edit 工具强制限定要替换的内容和位置,提高可靠性。
<a:rPr> 上使用 b="1"。这包括:<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 “协议”</a:t>
| 字符 | 名称 | Unicode | XML 实体 |
|---|---|---|---|
" | 左双引号 | U+201C | “ |
" | 右双引号 | U+201D | ” |
' | 左单引号 | U+2018 | ‘ |
' | 右单引号 | U+2019 | ’ |
<a:t> 上使用 xml:space="preserve"defusedxml.minidom,而不是 xml.etree.ElementTree(会破坏命名空间)