PPTX 创建、编辑与分析
概述
用户可能要求你创建、编辑或分析 .pptx 文件的内容。.pptx 文件本质上是一个包含 XML 文件和其他资源的 ZIP 归档,你可以读取或编辑这些内容。针对不同任务有不同的工具和工作流可供使用。
读取与分析内容
文本提取
如果只需要读取演示文稿的文本内容,应将文档转换为 Markdown:
# Convert document to markdown
python -m markitdown path-to-file.pptx
原始 XML 访问
以下场景需要原始 XML 访问:批注、演讲者备注、幻灯片版式、动画、设计元素和复杂格式。对于这些功能,需要解包演示文稿并读取其原始 XML 内容。
解包文件
python ooxml/scripts/unpack.py <office_file> <output_dir>
注意:unpack.py 脚本位于项目根目录的 skills/pptx/ooxml/scripts/unpack.py。如果该路径不存在,请使用 find . -name "unpack.py" 查找。
关键文件结构
ppt/presentation.xml - 主演示文稿元数据和幻灯片引用
ppt/slides/slide{N}.xml - 各幻灯片内容(slide1.xml、slide2.xml 等)
ppt/notesSlides/notesSlide{N}.xml - 各幻灯片的演讲者备注
ppt/comments/modernComment_*.xml - 特定幻灯片的批注
ppt/slideLayouts/ - 幻灯片版式模板
ppt/slideMasters/ - 母版幻灯片模板
ppt/theme/ - 主题和样式信息
ppt/media/ - 图片和其他媒体文件
排版与颜色提取
当需要模仿示例设计时:始终先使用以下方法分析演示文稿的排版和颜色:
- 读取主题文件:检查
ppt/theme/theme1.xml 中的颜色(<a:clrScheme>)和字体(<a:fontScheme>)
- 采样幻灯片内容:查看
ppt/slides/slide1.xml 中实际使用的字体(<a:rPr>)和颜色
- 搜索模式:使用 grep 在所有 XML 文件中查找颜色(
<a:solidFill>、<a:srgbClr>)和字体引用
从零创建新的 PowerPoint 演示文稿(不使用模板)
从零创建新的 PowerPoint 演示文稿时,使用 html2pptx 工作流将 HTML 幻灯片转换为 PowerPoint,实现精确定位。
设计原则
关键:在创建任何演示文稿之前,先分析内容并选择合适的设计元素:
- 考虑主题内容:这个演示文稿关于什么?它暗示了什么调性、行业或氛围?
- 检查品牌标识:如果用户提到了公司/组织,考虑其品牌颜色和视觉标识
- 匹配配色与内容:选择能反映主题的颜色
- 说明你的方案:在编写代码之前解释你的设计选择
要求:
- ✅ 在编写代码之前说明基于内容的设计方案
- ✅ 仅使用 Web 安全字体:Arial、Helvetica、Times New Roman、Georgia、Courier New、Verdana、Tahoma、Trebuchet MS、Impact
- ✅ 通过大小、粗细和颜色建立清晰的视觉层次
- ✅ 确保可读性:强对比度、适当大小的文本、整齐的对齐
- ✅ 保持一致性:在幻灯片之间重复使用相同的模式、间距和视觉语言
配色方案选择
创造性地选择颜色:
- 跳出默认思维:什么颜色真正匹配这个特定主题?避免惯性选择。
- 多角度考虑:主题、行业、氛围、能量级别、目标受众、品牌标识(如提到)
- 大胆尝试:尝试意想不到的组合——医疗演示不一定要用绿色,金融不一定要用海军蓝
- 构建配色方案:选择 3-5 种协调的颜色(主色 + 辅助色 + 强调色)
- 确保对比度:文本在背景上必须清晰可读
示例配色方案(用于激发创意——选择一个、改编或自行创建):
- 经典蓝:深海军蓝 (#1C2833)、石板灰 (#2E4053)、银色 (#AAB7B8)、米白 (#F4F6F6)
- 青色与珊瑚色:青色 (#5EA8A7)、深青 (#277884)、珊瑚色 (#FE4447)、白色 (#FFFFFF)
- 大胆红:红色 (#C0392B)、亮红 (#E74C3C)、橙色 (#F39C12)、黄色 (#F1C40F)、绿色 (#2ECC71)
- 温暖粉:淡紫 (#A49393)、腮红粉 (#EED6D3)、玫瑰 (#E8B4B8)、奶油白 (#FAF7F2)
- 勃艮第奢华:勃艮第红 (#5D1D2E)、深红 (#951233)、铁锈色 (#C15937)、金色 (#997929)
- 深紫与祖母绿:紫色 (#B165FB)、深蓝 (#181B24)、祖母绿 (#40695B)、白色 (#FFFFFF)
- 奶油白与森林绿:奶油白 (#FFE1C7)、森林绿 (#40695B)、白色 (#FCFCFC)
- 粉色与紫色:粉色 (#F8275B)、珊瑚色 (#FF574A)、玫瑰 (#FF737D)、紫色 (#3D2F68)
- 青柠与梅色:青柠 (#C5DE82)、梅色 (#7C3A5F)、珊瑚色 (#FD8C6E)、蓝灰 (#98ACB5)
- 黑金:金色 (#BF9A4A)、黑色 (#000000)、奶油白 (#F4F6F6)
- 鼠尾草与赤陶:鼠尾草绿 (#87A96B)、赤陶色 (#E07A5F)、奶油白 (#F4F1DE)、炭灰 (#2C2C2C)
- 炭灰与红色:炭灰 (#292929)、红色 (#E33737)、浅灰 (#CCCBCB)
- 活力橙:橙色 (#F96D00)、浅灰 (#F2F2F2)、炭灰 (#222831)
- 森林绿:黑色 (#191A19)、绿色 (#4E9F3D)、深绿 (#1E5128)、白色 (#FFFFFF)
- 复古彩虹:紫色 (#722880)、粉色 (#D72D51)、橙色 (#EB5C18)、琥珀色 (#F08800)、金色 (#DEB600)
- 复古大地色:芥末黄 (#E3B448)、鼠尾草绿 (#CBD18F)、森林绿 (#3A6B35)、奶油白 (#F4F1DE)
- 海岸玫瑰:旧玫瑰色 (#AD7670)、海狸棕 (#B49886)、蛋壳白 (#F3ECDC)、灰绿 (#BFD5BE)
- 橙色与绿松石:浅橙 (#FC993E)、灰绿松石 (#667C6F)、白色 (#FCFCFC)
视觉细节选项
几何图案:
- 对角线分段分隔符替代水平线
- 不对称列宽(30/70、40/60、25/75)
- 90° 或 270° 旋转的文本标题
- 图片使用圆形/六边形框架
- 角落使用三角形装饰形状
- 重叠形状营造深度感
边框与框架处理:
- 单侧粗单色边框(10-20pt)
- 双线边框配对比色
- 角括号替代完整框架
- L 形边框(上+左 或 下+右)
- 标题下方下划线装饰(3-5pt 粗)
排版处理:
- 极端大小对比(72pt 标题 vs 11pt 正文)
- 全大写标题配宽字间距
- 超大展示字体的编号章节
- 等宽字体(Courier New)用于数据/统计/技术内容
- 紧缩字体(Arial Narrow)用于密集信息
- 描边文本用于强调
图表与数据样式:
- 单色图表配单强调色标注关键数据
- 水平条形图替代垂直条形图
- 散点图替代条形图
- 最少网格线或无网格线
- 数据标签直接标注在元素上(无图例)
- 关键指标使用超大数字
布局创新:
- 全出血图片配文本叠加
- 侧边栏列(20-30% 宽度)用于导航/上下文
- 模块化网格系统(3×3、4×4 区块)
- Z 形或 F 形内容流
- 彩色形状上的浮动文本框
- 杂志风格多栏布局
背景处理:
- 占幻灯片 40-60% 的纯色块
- 渐变填充(仅限垂直或对角线方向)
- 分割背景(双色、对角线或垂直)
- 从边缘到边缘的色带
- 留白作为设计元素
布局技巧
创建包含图表或表格的幻灯片时:
- 双栏布局(首选):使用全宽标题,下方分两栏——一栏放文本/要点,另一栏放特色内容。这样平衡感更好,图表/表格更易读。使用不等宽 flexbox 列(如 40%/60% 分割)以优化各内容类型的空间。
- 全幻灯片布局:让特色内容(图表/表格)占据整张幻灯片,获得最大冲击力和可读性
- 切勿垂直堆叠:不要将图表/表格放在文本下方的单栏中——这会导致可读性差和布局问题
工作流
- 强制要求 - 通读全文:从头到尾完整阅读
html2pptx.md。读取此文件时绝不要设置任何范围限制。 在开始创建演示文稿之前,完整阅读详细语法、关键格式规则和最佳实践。
- 为每张幻灯片创建一个 HTML 文件,使用正确的尺寸(如 16:9 使用 720pt × 405pt)
- 使用
<p>、<h1>-<h6>、<ul>、<ol> 放置所有文本内容
- 使用
class="placeholder" 标记将要添加图表/表格的区域(渲染为灰色背景以便查看)
- 关键:先使用 Sharp 将渐变和图标栅格化为 PNG 图片,再在 HTML 中引用
- 布局:对于包含图表/表格/图片的幻灯片,使用全幻灯片布局或双栏布局以提高可读性
- 使用
html2pptx.js 库创建并运行 JavaScript 文件,将 HTML 幻灯片转换为 PowerPoint 并保存演示文稿
- 使用
html2pptx() 函数处理每个 HTML 文件
- 使用 PptxGenJS API 向占位区域添加图表和表格
- 使用
pptx.writeFile() 保存演示文稿
- 视觉验证:生成缩略图并检查布局问题
- 创建缩略图网格:
python scripts/thumbnail.py output.pptx workspace/thumbnails --cols 4
- 读取并仔细检查缩略图:
- 文本截断:文本被标题栏、形状或幻灯片边缘截断
- 文本重叠:文本与其他文本或形状重叠
- 定位问题:内容离幻灯片边界或其他元素太近
- 对比度问题:文本与背景之间对比度不足
- 如发现问题,调整 HTML 的 margin/spacing/colors 并重新生成演示文稿
- 重复直到所有幻灯片在视觉上正确
编辑现有的 PowerPoint 演示文稿
编辑现有 PowerPoint 演示文稿中的幻灯片时,需要使用原始 Office Open XML (OOXML) 格式。这涉及解包 .pptx 文件、编辑 XML 内容并重新打包。
工作流
- 强制要求 - 通读全文:从头到尾完整阅读
ooxml.md(约 500 行)。读取此文件时绝不要设置任何范围限制。 在编辑任何演示文稿之前,完整阅读 OOXML 结构和编辑工作流的详细指南。
- 解包演示文稿:
python ooxml/scripts/unpack.py <office_file> <output_dir>
- 编辑 XML 文件(主要是
ppt/slides/slide{N}.xml 及相关文件)
- 关键:每次编辑后立即验证,在继续之前修复所有验证错误:
python ooxml/scripts/validate.py <dir> --original <file>
- 打包最终演示文稿:
python ooxml/scripts/pack.py <input_directory> <office_file>
使用模板创建新的 PowerPoint 演示文稿
需要创建遵循现有模板设计的演示文稿时,需要先复制和重新排列模板幻灯片,然后替换占位内容。
工作流
提取模板文本并创建可视化缩略图网格:
- 提取文本:
python -m markitdown template.pptx > template-content.md
- 阅读
template-content.md:完整阅读文件以了解模板演示文稿的内容。读取此文件时绝不要设置任何范围限制。
- 创建缩略图网格:
python scripts/thumbnail.py template.pptx
- 详见创建缩略图网格章节
分析模板并保存清单到文件:
- 视觉分析:查看缩略图网格以了解幻灯片布局、设计模式和视觉结构
- 创建并保存模板清单文件
template-inventory.md,包含:# Template Inventory Analysis
**Total Slides: [count]**
**IMPORTANT: Slides are 0-indexed (first slide = 0, last slide = count-1)**
## [Category Name]
- Slide 0: [Layout code if available] - Description/purpose
- Slide 1: [Layout code] - Description/purpose
- Slide 2: [Layout code] - Description/purpose
[... EVERY slide must be listed individually with its index ...]
- 使用缩略图网格:参考可视化缩略图以识别:
- 布局模式(标题幻灯片、内容布局、分节符)
- 图片占位符位置和数量
- 幻灯片组间的设计一致性
- 视觉层次和结构
- 此清单文件是下一步选择合适模板的必要条件
基于模板清单创建演示文稿大纲:
- 查看第 2 步中的可用模板。
- 为第一张幻灯片选择标题或封面模板。这应该是靠前的模板之一。
- 为其他幻灯片选择安全的、以文本为主的布局。
- 关键:匹配布局结构与实际内容:
- 单栏布局:用于统一叙述或单一主题
- 双栏布局:仅当有恰好 2 个不同项目/概念时使用
- 三栏布局:仅当有恰好 3 个不同项目/概念时使用
- 图片+文本布局:仅当有实际图片需要插入时使用
- 引用布局:仅用于真实的人物引言(附出处),不用于强调
- 切勿使用占位符数量超过实际内容的布局
- 如果有 2 个项目,不要强行放入三栏布局
- 如果有 4 个以上项目,考虑拆分为多张幻灯片或使用列表格式
- 在选择布局之前先统计实际内容条数
- 验证所选布局中的每个占位符都会被有意义的内容填充
- 为每个内容部分选择一个代表最佳布局的选项。
- 保存
outline.md,包含内容和可利用可用设计的模板映射
- 示例模板映射:
# Template slides to use (0-based indexing)
# WARNING: Verify indices are within range! Template with 73 slides has indices 0-72
# Mapping: slide numbers from outline -> template slide indices
template_mapping = [
0, # Use slide 0 (Title/Cover)
34, # Use slide 34 (B1: Title and body)
34, # Use slide 34 again (duplicate for second B1)
50, # Use slide 50 (E1: Quote)
54, # Use slide 54 (F2: Closing + Text)
]
使用 rearrange.py 复制、重排和删除幻灯片:
- 使用
scripts/rearrange.py 脚本创建按所需顺序排列的新演示文稿:python scripts/rearrange.py template.pptx working.pptx 0,34,34,50,52
- 脚本自动处理重复幻灯片的复制、未使用幻灯片的删除和重新排序
- 幻灯片索引从 0 开始(第一张为 0,第二张为 1,依此类推)
- 同一幻灯片索引可出现多次以复制该幻灯片
使用 inventory.py 脚本提取所有文本:
运行清单提取:
python scripts/inventory.py working.pptx text-inventory.json
阅读 text-inventory.json:完整阅读 text-inventory.json 文件以了解所有形状及其属性。读取此文件时绝不要设置任何范围限制。
清单 JSON 结构:
{
"slide-0": {
"shape-0": {
"placeholder_type": "TITLE", // or null for non-placeholders
"left": 1.5, // position in inches
"top": 2.0,
"width": 7.5,
"height": 1.2,
"paragraphs": [
{
"text": "Paragraph text",
// Optional properties (only included when non-default):
"bullet": true, // explicit bullet detected
"level": 0, // only included when bullet is true
"alignment": "CENTER", // CENTER, RIGHT (not LEFT)
"space_before": 10.0, // space before paragraph in points
"space_after": 6.0, // space after paragraph in points
"line_spacing": 22.4, // line spacing in points
"font_name": "Arial", // from first run
"font_size": 14.0, // in points
"bold": true,
"italic": false,
"underline": false,
"color": "FF0000" // RGB color
}
]
}
}
}
关键特性:
- 幻灯片:命名为 "slide-0"、"slide-1" 等
- 形状:按视觉位置排序(从上到下、从左到右)为 "shape-0"、"shape-1" 等
- 占位符类型:TITLE、CENTER_TITLE、SUBTITLE、BODY、OBJECT 或 null
- 默认字体大小:从版式占位符提取的
default_font_size(以 pt 为单位,如可用)
- 幻灯片编号已过滤:SLIDE_NUMBER 占位符类型的形状会自动排除在清单之外
- 项目符号:当
bullet: true 时,level 始终包含(即使为 0)
- 间距:
space_before、space_after 和 line_spacing 以 pt 为单位(仅在设置时包含)
- 颜色:
color 为 RGB(如 "FF0000"),theme_color 为主题颜色(如 "DARK_1")
- 属性:仅输出非默认值
生成替换文本并保存数据到 JSON 文件
基于上一步的文本清单:
- 关键:先验证清单中存在哪些形状——仅引用实际存在的形状
- 验证:replace.py 脚本会验证替换 JSON 中的所有形状是否存在于清单中
- 如果引用了不存在的形状,会显示错误及可用形状
- 如果引用了不存在的幻灯片,会显示错误表明该幻灯片不存在
- 所有验证错误在脚本退出前一次性显示
- 重要:replace.py 脚本内部使用 inventory.py 识别所有文本形状
- 自动清除:清单中的所有文本形状都会被清除,除非你为其提供 "paragraphs"
- 需要内容的形状添加 "paragraphs" 字段(不是 "replacement_paragraphs")
- 替换 JSON 中没有 "paragraphs" 的形状将自动清除文本
- 包含项目符号的段落会自动左对齐。当
"bullet": true 时不要设置 alignment 属性
- 为占位文本生成合适的替换内容
- 使用形状大小确定合适的内容长度
- 关键:从原始清单中包含段落属性——不要只提供文本
- 重要:当 bullet: true 时,不要在文本中包含项目符号(•、-、*)——它们会自动添加
- 基本格式规则:
- 标题通常应有
"bold": true
- 列表项应有
"bullet": true, "level": 0(当 bullet 为 true 时 level 必填)
- 保留所有对齐属性(如居中文本的
"alignment": "CENTER")
- 与默认值不同时包含字体属性(如
"font_size": 14.0、"font_name": "Lora")
- 颜色:使用
"color": "FF0000" 表示 RGB 或 "theme_color": "DARK_1" 表示主题颜色
- 替换脚本需要格式正确的段落,而非纯文本字符串
- 重叠形状:优先选择 default_font_size 更大或 placeholder_type 更合适的形状
- 将包含替换内容的更新清单保存为
replacement-text.json
- 警告:不同模板布局的形状数量不同——在创建替换内容之前始终检查实际清单
示例段落字段,展示正确的格式:
"paragraphs": [
{
"text": "New presentation title text",
"alignment": "CENTER",
"bold": true
},
{
"text": "Section Header",
"bold": true
},
{
"text": "First bullet point without bullet symbol",
"bullet": true,
"level": 0
},
{
"text": "Red colored text",
"color": "FF0000"
},
{
"text": "Theme colored text",
"theme_color": "DARK_1"
},
{
"text": "Regular paragraph text without special formatting"
}
]
未在替换 JSON 中列出的形状会自动清除:
{
"slide-0": {
"shape-0": {
"paragraphs": [...] // This shape gets new text
}
// shape-1 and shape-2 from inventory will be cleared automatically
}
}
演示文稿常见格式模式:
- 标题幻灯片:加粗文本,有时居中
- 幻灯片内的章节标题:加粗文本
- 项目列表:每项需要
"bullet": true, "level": 0
- 正文:通常不需要特殊属性
- 引用:可能有特殊对齐或字体属性
使用 replace.py 脚本应用替换
python scripts/replace.py working.pptx replacement-text.json output.pptx
该脚本将:
- 首先使用 inventory.py 的功能提取所有文本形状的清单
- 验证替换 JSON 中的所有形状是否存在于清单中
- 清除清单中识别的所有形状的文本
- 仅对替换 JSON 中定义了 "paragraphs" 的形状应用新文本
- 通过应用 JSON 中的段落属性来保留格式
- 自动处理项目符号、对齐、字体属性和颜色
- 保存更新后的演示文稿
示例验证错误:
ERROR: Invalid shapes in replacement JSON:
- Shape 'shape-99' not found on 'slide-0'. Available shapes: shape-0, shape-1, shape-4
- Slide 'slide-999' not found in inventory
ERROR: Replacement text made overflow worse in these shapes:
- slide-0/shape-2: overflow worsened by 1.25" (was 0.00", now 1.25")
创建缩略图网格
为 PowerPoint 幻灯片创建可视化缩略图网格,便于快速分析和参考:
python scripts/thumbnail.py template.pptx [output_prefix]
功能:
- 生成:
thumbnails.jpg(大型幻灯片组会生成 thumbnails-1.jpg、thumbnails-2.jpg 等)
- 默认:5 列,每网格最多 30 张幻灯片(5×6)
- 自定义前缀:
python scripts/thumbnail.py template.pptx my-grid
- 注意:如需输出到特定目录,输出前缀应包含路径(如
workspace/my-grid)
- 调整列数:
--cols 4(范围:3-6,影响每网格幻灯片数)
- 网格限制:3 列 = 12 张/网格,4 列 = 20 张,5 列 = 30 张,6 列 = 42 张
- 幻灯片从 0 开始索引(Slide 0、Slide 1 等)
使用场景:
- 模板分析:快速了解幻灯片布局和设计模式
- 内容审查:整个演示文稿的可视化概览
- 导航参考:通过视觉外观查找特定幻灯片
- 质量检查:验证所有幻灯片格式正确
示例:
# Basic usage
python scripts/thumbnail.py presentation.pptx
# Combine options: custom name, columns
python scripts/thumbnail.py template.pptx analysis --cols 4
将幻灯片转换为图片
要视觉分析 PowerPoint 幻灯片,使用两步流程将其转换为图片:
将 PPTX 转换为 PDF:
soffice --headless --convert-to pdf template.pptx
将 PDF 页面转换为 JPEG 图片:
pdftoppm -jpeg -r 150 template.pdf slide
这会生成 slide-1.jpg、slide-2.jpg 等文件。
选项:
-r 150:设置分辨率为 150 DPI(根据质量/大小平衡调整)
-jpeg:输出 JPEG 格式(如需 PNG 可用 -png)
-f N:转换的起始页(如 -f 2 从第 2 页开始)
-l N:转换的结束页(如 -l 5 到第 5 页停止)
slide:输出文件前缀
指定范围的示例:
pdftoppm -jpeg -r 150 -f 2 -l 5 template.pdf slide # Converts only pages 2-5
代码风格指南
重要:生成 PPTX 操作代码时:
- 编写简洁的代码
- 避免冗长的变量名和冗余操作
- 避免不必要的 print 语句
依赖项
必需依赖(应该已安装):
- markitdown:
pip install "markitdown[pptx]"(用于从演示文稿提取文本)
- pptxgenjs:
npm install -g pptxgenjs(用于通过 html2pptx 创建演示文稿)
- playwright:
npm install -g playwright(用于 html2pptx 中的 HTML 渲染)
- react-icons:
npm install -g react-icons react react-dom(用于图标)
- sharp:
npm install -g sharp(用于 SVG 栅格化和图片处理)
- LibreOffice:
sudo apt-get install libreoffice(用于 PDF 转换)
- Poppler:
sudo apt-get install poppler-utils(用于 pdftoppm 将 PDF 转换为图片)
- defusedxml:
pip install defusedxml(用于安全 XML 解析)
使用时机
本技能适用于执行概述中描述的工作流或操作。
限制
- 仅当任务明确匹配上述范围时才使用此技能。
- 不要将输出视为特定环境验证、测试或专家审查的替代品。
- 如果缺少必需的输入、权限、安全边界或成功标准,请停下来请求澄清。
1---2name: pptx-official3description: 用户可能要求你创建、编辑或分析 .pptx 文件的内容。.pptx 文件本质上是一个包含 XML 文件和其他资源的 ZIP 归档,你可以读取或编辑这些内容。针对不同任务有不同的工具和工作流可供使用。当用户要求创建、编辑或分析 PowerPoint 文件时使用。4---56# PPTX 创建、编辑与分析78## 概述910用户可能要求你创建、编辑或分析 .pptx 文件的内容。.pptx 文件本质上是一个包含 XML 文件和其他资源的 ZIP 归档,你可以读取或编辑这些内容。针对不同任务有不同的工具和工作流可供使用。1112## 读取与分析内容1314### 文本提取15如果只需要读取演示文稿的文本内容,应将文档转换为 Markdown:1617```bash18# Convert document to markdown19python -m markitdown path-to-file.pptx20```2122### 原始 XML 访问23以下场景需要原始 XML 访问:批注、演讲者备注、幻灯片版式、动画、设计元素和复杂格式。对于这些功能,需要解包演示文稿并读取其原始 XML 内容。2425#### 解包文件26`python ooxml/scripts/unpack.py <office_file> <output_dir>`2728**注意**:unpack.py 脚本位于项目根目录的 `skills/pptx/ooxml/scripts/unpack.py`。如果该路径不存在,请使用 `find . -name "unpack.py"` 查找。2930#### 关键文件结构31* `ppt/presentation.xml` - 主演示文稿元数据和幻灯片引用32* `ppt/slides/slide{N}.xml` - 各幻灯片内容(slide1.xml、slide2.xml 等)33* `ppt/notesSlides/notesSlide{N}.xml` - 各幻灯片的演讲者备注34* `ppt/comments/modernComment_*.xml` - 特定幻灯片的批注35* `ppt/slideLayouts/` - 幻灯片版式模板36* `ppt/slideMasters/` - 母版幻灯片模板37* `ppt/theme/` - 主题和样式信息38* `ppt/media/` - 图片和其他媒体文件3940#### 排版与颜色提取41**当需要模仿示例设计时**:始终先使用以下方法分析演示文稿的排版和颜色:421. **读取主题文件**:检查 `ppt/theme/theme1.xml` 中的颜色(`<a:clrScheme>`)和字体(`<a:fontScheme>`)432. **采样幻灯片内容**:查看 `ppt/slides/slide1.xml` 中实际使用的字体(`<a:rPr>`)和颜色443. **搜索模式**:使用 grep 在所有 XML 文件中查找颜色(`<a:solidFill>`、`<a:srgbClr>`)和字体引用4546## 从零创建新的 PowerPoint 演示文稿(不使用模板)4748从零创建新的 PowerPoint 演示文稿时,使用 **html2pptx** 工作流将 HTML 幻灯片转换为 PowerPoint,实现精确定位。4950### 设计原则5152**关键**:在创建任何演示文稿之前,先分析内容并选择合适的设计元素:531. **考虑主题内容**:这个演示文稿关于什么?它暗示了什么调性、行业或氛围?542. **检查品牌标识**:如果用户提到了公司/组织,考虑其品牌颜色和视觉标识553. **匹配配色与内容**:选择能反映主题的颜色564. **说明你的方案**:在编写代码之前解释你的设计选择5758**要求**:59- ✅ 在编写代码之前说明基于内容的设计方案60- ✅ 仅使用 Web 安全字体:Arial、Helvetica、Times New Roman、Georgia、Courier New、Verdana、Tahoma、Trebuchet MS、Impact61- ✅ 通过大小、粗细和颜色建立清晰的视觉层次62- ✅ 确保可读性:强对比度、适当大小的文本、整齐的对齐63- ✅ 保持一致性:在幻灯片之间重复使用相同的模式、间距和视觉语言6465#### 配色方案选择6667**创造性地选择颜色**:68- **跳出默认思维**:什么颜色真正匹配这个特定主题?避免惯性选择。69- **多角度考虑**:主题、行业、氛围、能量级别、目标受众、品牌标识(如提到)70- **大胆尝试**:尝试意想不到的组合——医疗演示不一定要用绿色,金融不一定要用海军蓝71- **构建配色方案**:选择 3-5 种协调的颜色(主色 + 辅助色 + 强调色)72- **确保对比度**:文本在背景上必须清晰可读7374**示例配色方案**(用于激发创意——选择一个、改编或自行创建):75761. **经典蓝**:深海军蓝 (#1C2833)、石板灰 (#2E4053)、银色 (#AAB7B8)、米白 (#F4F6F6)772. **青色与珊瑚色**:青色 (#5EA8A7)、深青 (#277884)、珊瑚色 (#FE4447)、白色 (#FFFFFF)783. **大胆红**:红色 (#C0392B)、亮红 (#E74C3C)、橙色 (#F39C12)、黄色 (#F1C40F)、绿色 (#2ECC71)794. **温暖粉**:淡紫 (#A49393)、腮红粉 (#EED6D3)、玫瑰 (#E8B4B8)、奶油白 (#FAF7F2)805. **勃艮第奢华**:勃艮第红 (#5D1D2E)、深红 (#951233)、铁锈色 (#C15937)、金色 (#997929)816. **深紫与祖母绿**:紫色 (#B165FB)、深蓝 (#181B24)、祖母绿 (#40695B)、白色 (#FFFFFF)827. **奶油白与森林绿**:奶油白 (#FFE1C7)、森林绿 (#40695B)、白色 (#FCFCFC)838. **粉色与紫色**:粉色 (#F8275B)、珊瑚色 (#FF574A)、玫瑰 (#FF737D)、紫色 (#3D2F68)849. **青柠与梅色**:青柠 (#C5DE82)、梅色 (#7C3A5F)、珊瑚色 (#FD8C6E)、蓝灰 (#98ACB5)8510. **黑金**:金色 (#BF9A4A)、黑色 (#000000)、奶油白 (#F4F6F6)8611. **鼠尾草与赤陶**:鼠尾草绿 (#87A96B)、赤陶色 (#E07A5F)、奶油白 (#F4F1DE)、炭灰 (#2C2C2C)8712. **炭灰与红色**:炭灰 (#292929)、红色 (#E33737)、浅灰 (#CCCBCB)8813. **活力橙**:橙色 (#F96D00)、浅灰 (#F2F2F2)、炭灰 (#222831)8914. **森林绿**:黑色 (#191A19)、绿色 (#4E9F3D)、深绿 (#1E5128)、白色 (#FFFFFF)9015. **复古彩虹**:紫色 (#722880)、粉色 (#D72D51)、橙色 (#EB5C18)、琥珀色 (#F08800)、金色 (#DEB600)9116. **复古大地色**:芥末黄 (#E3B448)、鼠尾草绿 (#CBD18F)、森林绿 (#3A6B35)、奶油白 (#F4F1DE)9217. **海岸玫瑰**:旧玫瑰色 (#AD7670)、海狸棕 (#B49886)、蛋壳白 (#F3ECDC)、灰绿 (#BFD5BE)9318. **橙色与绿松石**:浅橙 (#FC993E)、灰绿松石 (#667C6F)、白色 (#FCFCFC)9495#### 视觉细节选项9697**几何图案**:98- 对角线分段分隔符替代水平线99- 不对称列宽(30/70、40/60、25/75)100- 90° 或 270° 旋转的文本标题101- 图片使用圆形/六边形框架102- 角落使用三角形装饰形状103- 重叠形状营造深度感104105**边框与框架处理**:106- 单侧粗单色边框(10-20pt)107- 双线边框配对比色108- 角括号替代完整框架109- L 形边框(上+左 或 下+右)110- 标题下方下划线装饰(3-5pt 粗)111112**排版处理**:113- 极端大小对比(72pt 标题 vs 11pt 正文)114- 全大写标题配宽字间距115- 超大展示字体的编号章节116- 等宽字体(Courier New)用于数据/统计/技术内容117- 紧缩字体(Arial Narrow)用于密集信息118- 描边文本用于强调119120**图表与数据样式**:121- 单色图表配单强调色标注关键数据122- 水平条形图替代垂直条形图123- 散点图替代条形图124- 最少网格线或无网格线125- 数据标签直接标注在元素上(无图例)126- 关键指标使用超大数字127128**布局创新**:129- 全出血图片配文本叠加130- 侧边栏列(20-30% 宽度)用于导航/上下文131- 模块化网格系统(3×3、4×4 区块)132- Z 形或 F 形内容流133- 彩色形状上的浮动文本框134- 杂志风格多栏布局135136**背景处理**:137- 占幻灯片 40-60% 的纯色块138- 渐变填充(仅限垂直或对角线方向)139- 分割背景(双色、对角线或垂直)140- 从边缘到边缘的色带141- 留白作为设计元素142143### 布局技巧144**创建包含图表或表格的幻灯片时:**145- **双栏布局(首选)**:使用全宽标题,下方分两栏——一栏放文本/要点,另一栏放特色内容。这样平衡感更好,图表/表格更易读。使用不等宽 flexbox 列(如 40%/60% 分割)以优化各内容类型的空间。146- **全幻灯片布局**:让特色内容(图表/表格)占据整张幻灯片,获得最大冲击力和可读性147- **切勿垂直堆叠**:不要将图表/表格放在文本下方的单栏中——这会导致可读性差和布局问题148149### 工作流1501. **强制要求 - 通读全文**:从头到尾完整阅读 [`html2pptx.md`](html2pptx.md)。**读取此文件时绝不要设置任何范围限制。** 在开始创建演示文稿之前,完整阅读详细语法、关键格式规则和最佳实践。1512. 为每张幻灯片创建一个 HTML 文件,使用正确的尺寸(如 16:9 使用 720pt × 405pt)152 - 使用 `<p>`、`<h1>`-`<h6>`、`<ul>`、`<ol>` 放置所有文本内容153 - 使用 `class="placeholder"` 标记将要添加图表/表格的区域(渲染为灰色背景以便查看)154 - **关键**:先使用 Sharp 将渐变和图标栅格化为 PNG 图片,再在 HTML 中引用155 - **布局**:对于包含图表/表格/图片的幻灯片,使用全幻灯片布局或双栏布局以提高可读性1563. 使用 [`html2pptx.js`](scripts/html2pptx.js) 库创建并运行 JavaScript 文件,将 HTML 幻灯片转换为 PowerPoint 并保存演示文稿157 - 使用 `html2pptx()` 函数处理每个 HTML 文件158 - 使用 PptxGenJS API 向占位区域添加图表和表格159 - 使用 `pptx.writeFile()` 保存演示文稿1604. **视觉验证**:生成缩略图并检查布局问题161 - 创建缩略图网格:`python scripts/thumbnail.py output.pptx workspace/thumbnails --cols 4`162 - 读取并仔细检查缩略图:163 - **文本截断**:文本被标题栏、形状或幻灯片边缘截断164 - **文本重叠**:文本与其他文本或形状重叠165 - **定位问题**:内容离幻灯片边界或其他元素太近166 - **对比度问题**:文本与背景之间对比度不足167 - 如发现问题,调整 HTML 的 margin/spacing/colors 并重新生成演示文稿168 - 重复直到所有幻灯片在视觉上正确169170## 编辑现有的 PowerPoint 演示文稿171172编辑现有 PowerPoint 演示文稿中的幻灯片时,需要使用原始 Office Open XML (OOXML) 格式。这涉及解包 .pptx 文件、编辑 XML 内容并重新打包。173174### 工作流1751. **强制要求 - 通读全文**:从头到尾完整阅读 [`ooxml.md`](ooxml.md)(约 500 行)。**读取此文件时绝不要设置任何范围限制。** 在编辑任何演示文稿之前,完整阅读 OOXML 结构和编辑工作流的详细指南。1762. 解包演示文稿:`python ooxml/scripts/unpack.py <office_file> <output_dir>`1773. 编辑 XML 文件(主要是 `ppt/slides/slide{N}.xml` 及相关文件)1784. **关键**:每次编辑后立即验证,在继续之前修复所有验证错误:`python ooxml/scripts/validate.py <dir> --original <file>`1795. 打包最终演示文稿:`python ooxml/scripts/pack.py <input_directory> <office_file>`180181## 使用模板创建新的 PowerPoint 演示文稿182183需要创建遵循现有模板设计的演示文稿时,需要先复制和重新排列模板幻灯片,然后替换占位内容。184185### 工作流1861. **提取模板文本并创建可视化缩略图网格**:187 * 提取文本:`python -m markitdown template.pptx > template-content.md`188 * 阅读 `template-content.md`:完整阅读文件以了解模板演示文稿的内容。**读取此文件时绝不要设置任何范围限制。**189 * 创建缩略图网格:`python scripts/thumbnail.py template.pptx`190 * 详见[创建缩略图网格](#创建缩略图网格)章节1911922. **分析模板并保存清单到文件**:193 * **视觉分析**:查看缩略图网格以了解幻灯片布局、设计模式和视觉结构194 * 创建并保存模板清单文件 `template-inventory.md`,包含:195 ```markdown196 # Template Inventory Analysis197 **Total Slides: [count]**198 **IMPORTANT: Slides are 0-indexed (first slide = 0, last slide = count-1)**199200 ## [Category Name]201 - Slide 0: [Layout code if available] - Description/purpose202 - Slide 1: [Layout code] - Description/purpose203 - Slide 2: [Layout code] - Description/purpose204 [... EVERY slide must be listed individually with its index ...]205 ```206 * **使用缩略图网格**:参考可视化缩略图以识别:207 - 布局模式(标题幻灯片、内容布局、分节符)208 - 图片占位符位置和数量209 - 幻灯片组间的设计一致性210 - 视觉层次和结构211 * 此清单文件是下一步选择合适模板的必要条件2122133. **基于模板清单创建演示文稿大纲**:214 * 查看第 2 步中的可用模板。215 * 为第一张幻灯片选择标题或封面模板。这应该是靠前的模板之一。216 * 为其他幻灯片选择安全的、以文本为主的布局。217 * **关键:匹配布局结构与实际内容**:218 - 单栏布局:用于统一叙述或单一主题219 - 双栏布局:仅当有恰好 2 个不同项目/概念时使用220 - 三栏布局:仅当有恰好 3 个不同项目/概念时使用221 - 图片+文本布局:仅当有实际图片需要插入时使用222 - 引用布局:仅用于真实的人物引言(附出处),不用于强调223 - 切勿使用占位符数量超过实际内容的布局224 - 如果有 2 个项目,不要强行放入三栏布局225 - 如果有 4 个以上项目,考虑拆分为多张幻灯片或使用列表格式226 * 在选择布局之前先统计实际内容条数227 * 验证所选布局中的每个占位符都会被有意义的内容填充228 * 为每个内容部分选择一个代表**最佳**布局的选项。229 * 保存 `outline.md`,包含内容和可利用可用设计的模板映射230 * 示例模板映射:231 ```232 # Template slides to use (0-based indexing)233 # WARNING: Verify indices are within range! Template with 73 slides has indices 0-72234 # Mapping: slide numbers from outline -> template slide indices235 template_mapping = [236 0, # Use slide 0 (Title/Cover)237 34, # Use slide 34 (B1: Title and body)238 34, # Use slide 34 again (duplicate for second B1)239 50, # Use slide 50 (E1: Quote)240 54, # Use slide 54 (F2: Closing + Text)241 ]242 ```2432444. **使用 `rearrange.py` 复制、重排和删除幻灯片**:245 * 使用 `scripts/rearrange.py` 脚本创建按所需顺序排列的新演示文稿:246 ```bash247 python scripts/rearrange.py template.pptx working.pptx 0,34,34,50,52248 ```249 * 脚本自动处理重复幻灯片的复制、未使用幻灯片的删除和重新排序250 * 幻灯片索引从 0 开始(第一张为 0,第二张为 1,依此类推)251 * 同一幻灯片索引可出现多次以复制该幻灯片2522535. **使用 `inventory.py` 脚本提取所有文本**:254 * **运行清单提取**:255 ```bash256 python scripts/inventory.py working.pptx text-inventory.json257 ```258 * **阅读 text-inventory.json**:完整阅读 text-inventory.json 文件以了解所有形状及其属性。**读取此文件时绝不要设置任何范围限制。**259260 * 清单 JSON 结构:261 ```json262 {263 "slide-0": {264 "shape-0": {265 "placeholder_type": "TITLE", // or null for non-placeholders266 "left": 1.5, // position in inches267 "top": 2.0,268 "width": 7.5,269 "height": 1.2,270 "paragraphs": [271 {272 "text": "Paragraph text",273 // Optional properties (only included when non-default):274 "bullet": true, // explicit bullet detected275 "level": 0, // only included when bullet is true276 "alignment": "CENTER", // CENTER, RIGHT (not LEFT)277 "space_before": 10.0, // space before paragraph in points278 "space_after": 6.0, // space after paragraph in points279 "line_spacing": 22.4, // line spacing in points280 "font_name": "Arial", // from first run281 "font_size": 14.0, // in points282 "bold": true,283 "italic": false,284 "underline": false,285 "color": "FF0000" // RGB color286 }287 ]288 }289 }290 }291 ```292293 * 关键特性:294 - **幻灯片**:命名为 "slide-0"、"slide-1" 等295 - **形状**:按视觉位置排序(从上到下、从左到右)为 "shape-0"、"shape-1" 等296 - **占位符类型**:TITLE、CENTER_TITLE、SUBTITLE、BODY、OBJECT 或 null297 - **默认字体大小**:从版式占位符提取的 `default_font_size`(以 pt 为单位,如可用)298 - **幻灯片编号已过滤**:SLIDE_NUMBER 占位符类型的形状会自动排除在清单之外299 - **项目符号**:当 `bullet: true` 时,`level` 始终包含(即使为 0)300 - **间距**:`space_before`、`space_after` 和 `line_spacing` 以 pt 为单位(仅在设置时包含)301 - **颜色**:`color` 为 RGB(如 "FF0000"),`theme_color` 为主题颜色(如 "DARK_1")302 - **属性**:仅输出非默认值3033046. **生成替换文本并保存数据到 JSON 文件**305 基于上一步的文本清单:306 - **关键**:先验证清单中存在哪些形状——仅引用实际存在的形状307 - **验证**:replace.py 脚本会验证替换 JSON 中的所有形状是否存在于清单中308 - 如果引用了不存在的形状,会显示错误及可用形状309 - 如果引用了不存在的幻灯片,会显示错误表明该幻灯片不存在310 - 所有验证错误在脚本退出前一次性显示311 - **重要**:replace.py 脚本内部使用 inventory.py 识别所有文本形状312 - **自动清除**:清单中的所有文本形状都会被清除,除非你为其提供 "paragraphs"313 - 需要内容的形状添加 "paragraphs" 字段(不是 "replacement_paragraphs")314 - 替换 JSON 中没有 "paragraphs" 的形状将自动清除文本315 - 包含项目符号的段落会自动左对齐。当 `"bullet": true` 时不要设置 `alignment` 属性316 - 为占位文本生成合适的替换内容317 - 使用形状大小确定合适的内容长度318 - **关键**:从原始清单中包含段落属性——不要只提供文本319 - **重要**:当 bullet: true 时,不要在文本中包含项目符号(•、-、*)——它们会自动添加320 - **基本格式规则**:321 - 标题通常应有 `"bold": true`322 - 列表项应有 `"bullet": true, "level": 0`(当 bullet 为 true 时 level 必填)323 - 保留所有对齐属性(如居中文本的 `"alignment": "CENTER"`)324 - 与默认值不同时包含字体属性(如 `"font_size": 14.0`、`"font_name": "Lora"`)325 - 颜色:使用 `"color": "FF0000"` 表示 RGB 或 `"theme_color": "DARK_1"` 表示主题颜色326 - 替换脚本需要**格式正确的段落**,而非纯文本字符串327 - **重叠形状**:优先选择 default_font_size 更大或 placeholder_type 更合适的形状328 * 将包含替换内容的更新清单保存为 `replacement-text.json`329 - **警告**:不同模板布局的形状数量不同——在创建替换内容之前始终检查实际清单330331 示例段落字段,展示正确的格式:332 ```json333 "paragraphs": [334 {335 "text": "New presentation title text",336 "alignment": "CENTER",337 "bold": true338 },339 {340 "text": "Section Header",341 "bold": true342 },343 {344 "text": "First bullet point without bullet symbol",345 "bullet": true,346 "level": 0347 },348 {349 "text": "Red colored text",350 "color": "FF0000"351 },352 {353 "text": "Theme colored text",354 "theme_color": "DARK_1"355 },356 {357 "text": "Regular paragraph text without special formatting"358 }359 ]360 ```361362 **未在替换 JSON 中列出的形状会自动清除**:363 ```json364 {365 "slide-0": {366 "shape-0": {367 "paragraphs": [...] // This shape gets new text368 }369 // shape-1 and shape-2 from inventory will be cleared automatically370 }371 }372 ```373374 **演示文稿常见格式模式**:375 - 标题幻灯片:加粗文本,有时居中376 - 幻灯片内的章节标题:加粗文本377 - 项目列表:每项需要 `"bullet": true, "level": 0`378 - 正文:通常不需要特殊属性379 - 引用:可能有特殊对齐或字体属性3803817. **使用 `replace.py` 脚本应用替换**382 ```bash383 python scripts/replace.py working.pptx replacement-text.json output.pptx384 ```385386 该脚本将:387 - 首先使用 inventory.py 的功能提取所有文本形状的清单388 - 验证替换 JSON 中的所有形状是否存在于清单中389 - 清除清单中识别的所有形状的文本390 - 仅对替换 JSON 中定义了 "paragraphs" 的形状应用新文本391 - 通过应用 JSON 中的段落属性来保留格式392 - 自动处理项目符号、对齐、字体属性和颜色393 - 保存更新后的演示文稿394395 示例验证错误:396 ```397 ERROR: Invalid shapes in replacement JSON:398 - Shape 'shape-99' not found on 'slide-0'. Available shapes: shape-0, shape-1, shape-4399 - Slide 'slide-999' not found in inventory400 ```401402 ```403 ERROR: Replacement text made overflow worse in these shapes:404 - slide-0/shape-2: overflow worsened by 1.25" (was 0.00", now 1.25")405 ```406407## 创建缩略图网格408409为 PowerPoint 幻灯片创建可视化缩略图网格,便于快速分析和参考:410411```bash412python scripts/thumbnail.py template.pptx [output_prefix]413```414415**功能**:416- 生成:`thumbnails.jpg`(大型幻灯片组会生成 `thumbnails-1.jpg`、`thumbnails-2.jpg` 等)417- 默认:5 列,每网格最多 30 张幻灯片(5×6)418- 自定义前缀:`python scripts/thumbnail.py template.pptx my-grid`419 - 注意:如需输出到特定目录,输出前缀应包含路径(如 `workspace/my-grid`)420- 调整列数:`--cols 4`(范围:3-6,影响每网格幻灯片数)421- 网格限制:3 列 = 12 张/网格,4 列 = 20 张,5 列 = 30 张,6 列 = 42 张422- 幻灯片从 0 开始索引(Slide 0、Slide 1 等)423424**使用场景**:425- 模板分析:快速了解幻灯片布局和设计模式426- 内容审查:整个演示文稿的可视化概览427- 导航参考:通过视觉外观查找特定幻灯片428- 质量检查:验证所有幻灯片格式正确429430**示例**:431```bash432# Basic usage433python scripts/thumbnail.py presentation.pptx434435# Combine options: custom name, columns436python scripts/thumbnail.py template.pptx analysis --cols 4437```438439## 将幻灯片转换为图片440441要视觉分析 PowerPoint 幻灯片,使用两步流程将其转换为图片:4424431. **将 PPTX 转换为 PDF**:444 ```bash445 soffice --headless --convert-to pdf template.pptx446 ```4474482. **将 PDF 页面转换为 JPEG 图片**:449 ```bash450 pdftoppm -jpeg -r 150 template.pdf slide451 ```452 这会生成 `slide-1.jpg`、`slide-2.jpg` 等文件。453454选项:455- `-r 150`:设置分辨率为 150 DPI(根据质量/大小平衡调整)456- `-jpeg`:输出 JPEG 格式(如需 PNG 可用 `-png`)457- `-f N`:转换的起始页(如 `-f 2` 从第 2 页开始)458- `-l N`:转换的结束页(如 `-l 5` 到第 5 页停止)459- `slide`:输出文件前缀460461指定范围的示例:462```bash463pdftoppm -jpeg -r 150 -f 2 -l 5 template.pdf slide # Converts only pages 2-5464```465466## 代码风格指南467**重要**:生成 PPTX 操作代码时:468- 编写简洁的代码469- 避免冗长的变量名和冗余操作470- 避免不必要的 print 语句471472## 依赖项473474必需依赖(应该已安装):475476- **markitdown**:`pip install "markitdown[pptx]"`(用于从演示文稿提取文本)477- **pptxgenjs**:`npm install -g pptxgenjs`(用于通过 html2pptx 创建演示文稿)478- **playwright**:`npm install -g playwright`(用于 html2pptx 中的 HTML 渲染)479- **react-icons**:`npm install -g react-icons react react-dom`(用于图标)480- **sharp**:`npm install -g sharp`(用于 SVG 栅格化和图片处理)481- **LibreOffice**:`sudo apt-get install libreoffice`(用于 PDF 转换)482- **Poppler**:`sudo apt-get install poppler-utils`(用于 pdftoppm 将 PDF 转换为图片)483- **defusedxml**:`pip install defusedxml`(用于安全 XML 解析)484485## 使用时机486本技能适用于执行概述中描述的工作流或操作。487488## 限制489- 仅当任务明确匹配上述范围时才使用此技能。490- 不要将输出视为特定环境验证、测试或专家审查的替代品。491- 如果缺少必需的输入、权限、安全边界或成功标准,请停下来请求澄清。