运行时依赖
安装命令
点击复制技能文档
⚠️ 使用前须知
图片数据发送:第一步 VLM 图像分析会将截图发送到配置的 VLM 服务端点(如 OpenClaw image 工具 / MiniMax Vision / GPT-4V 等)。请勿使用本技能处理涉密或敏感的幻灯片。 文件系统:技能会生成临时 PNG 文件和输出 PPTX 文件,确保运行环境允许文件读写操作。 运行时依赖:需提前安装 npm 安装 -g pptxgenjs;如需复杂形状降级,还需安装 Python + Pillow。 PPT视觉复刻技能 (v1.5)
将静态PPT截图/信息图转换为可编辑PPTX文件的完整工作流。
核心算法 (Images2Slides论文适配) 坐标映射 (Pixel → EMU) EMU = Pixel × (914400 / DPI) Slide_X = (Image_X / Image_Width) × Slide_Width_EMU Slide_Y = (Image_Y / Image_Height) × Slide_Height_EMU
标准16:9幻灯片尺寸: 9144000 × 5143500 EMU
工作流程 阶段1: 图像分析(开放式 VLM 调用)
第一步的图片识别为开放式设计,可灵活接入任意具备图像理解能力的工具—— 如 OpenClaw 内置 image 工具(默认,MiniMax Vision VLM)、MCP VLM 服务、GPT-4V 等。 后续坐标映射和 PPT 生成逻辑与具体 VLM 解耦,保持稳定。
必须使用以下增强版 Prompt,以确保符号精度和格式完整性:
const ENHANCED_PROMPT = 分析这张PPT截图,精确输出所有可见区域的信息。
输出格式为JSON数组,每个元素包含:
{
"id": "数字",
"type": "rectangle | roundedRect | text | line | image",
"角色": "header_bar | title | subtitle | body | data_card | footer | decorator | bullet_列出",
"bounds": { "x": 像素, "y": 像素, "width": 像素, "height": 像素 },
"color": "#十六进制颜色(文字颜色或形状填充色)",
"backgroundColor": "#背景填充色(仅形状适用)",
"lineColor": "#边框颜色(如有边框)",
"lineWidth": 边框宽度,
"content": "文字内容(保持原版的所有标点符号,全角/半角符号原样保留)",
"fontSize": 字号数字(磅),
"fontFamily": "字体名称",
"fontWeight": "normal | bold",
"align": "left | center | right",
"lineSpacing": 行间距倍数(1.0/1.5/2.0),
"charSpacing": 字符间距(磅),
"bulletType": "无bullet则null,有bullet则填 ■ / ✓ / - 等符号",
"cornerRadius": 圆角大小(仅roundedRect适用),
"z索引": 叠加层级(从0开始)
}
⚠️ 特别注意:
content 必须保持原版的所有标点符号,包括全角括号()和半角括号()的区别- 不要添加或删除任何字符
- 项目符号(■、✓、1.、-)必须原样记录在 bulletType 字段
- 识别所有行间距较大的文本框,填写 lineSpacing
- 边框矩形必须填写 lineColor,填充矩形填写 backgroundColor
z索引按照视觉层叠顺序从后到前递增;
阶段2: 结构化数据解析
调用 scripts/coordinate_m应用er.js,支持4种JSON提取策略,自动容错:
const { 解析AnalysisToRegions, mapAllRegions } = require('./coordinate_m应用er');
// 解析分析结果(自动处理全角符号校正和bullet识别) const regions = 解析AnalysisToRegions(analysisText);
// 批量映射坐标 const m应用edRegions = mapAllRegions(regions, imageWidth, imageHeight);
新增功能(v1.1):
normalizeSymbols(text) — 全角/半角符号校正 检测Bullet(text) — 识别并提取bullet符号类型 4策略JSON解析容错(直接解析 → 数组提取 → 对象提取 → 代码块提取) 阶段3: PPT生成
调用 scripts/ppt_生成器.js:
const { saveFromRegions } = require('./ppt_生成器');
awAIt saveFromRegions(m应用edRegions, '输出.pptx', { imageWidth: 2100, imageHeight: 1192, background: '#FFFFFF' // 可选背景色 });
区域类型映射 VLM输出 PptxGenJS方法 v1.1新增支持 rectangle (filled) slide.添加Shape('rect') backgroundColor / lineColor rectangle (border) slide.添加Shape('rect') lineWidth / dashType roundedRect slide.添加Shape('roundRect') ✅ 新增 cornerRadius text slide.添加Text() ✅ lineSpacing / charSpacing / bullet line slide.添加Shape('line') dashType image slide.添加Image() data(base64) / path 复杂形状 slide.添加Image() + Python绘制PNG ✅ v1.2新增 复杂形状降级处理策略 (v1.2)
核心思路:pptxgenjs 无法还原的复杂图形,改用 Python/Pillow 绘制精确 PNG(透明背景)→ 嵌入 PPT 的方式替代。
何时触发降级
遇到以下情况时,应将该形状标记为 type: "complex_shape",使用降级策略处理:
形状特征 判断依据 自定义多边形路径 XML中存在 标签,包含贝塞尔曲线、不规则路径 透明渐变填充 多色渐变(3个以上 停止)或带透明度通道(alpha < 100%)的渐变 复合渐变方向 渐变角度非水平/垂直(非0/90/180/270度),如斜向渐变 发光/阴影特效 , 等复杂效果 pptxgenjs 渲染误差大 不规则遮罩/裁切 图片经过自定义路径裁切( 包裹图片) VLM识别为渐变箭头/装饰图形 从截图分析中识别出类型为装饰性渐变形状 降级处理工作流 ┌─────────────────────────────────────────────────────┐ │ 1. 判断是否为复杂形状(见上表) │ │ ├── 有原版PPTX → 从XML提取精确路径和颜色参数 │ │ └── 仅截图 → 用VLM估算形状轮廓和渐变颜色 │ │ │ │ 2. 用Python/Pillow绘制透明背景PNG │ │ ├── 绘制精确路径(参考XML坐标 或 VLM估算像素) │ │ ├── 应用渐变/透明/特效 │ │ └── 输出 RGBA 透明背景 PNG │ │ │ │ 3. 嵌入PPT(添加Image) │ │ └── 坐标与原版对应(EMU换算或比例缩放) │ └─────────────────────────────────────────────────────┘
从原版XML提取形状参数(有源文件时优先)
当有原版 .pptx 可解包时,可获取最精确的参数:
# 解包PPTX unzip original.pptx -d pptx_unpacked/ # 查看形状XML cat pptx_unpacked/ppt/slides/slide1.xml
关键字段提取:
... ...
EMU角度转换公式:
实际角度(度)= EMU角度值 / 60000 例: 16200000 / 60000 = 270°(即从上到下的渐变方向)
组合坐标转绝对坐标公式:
// grp = { off: {x, y}, ext: {cx, cy}, chOff: {x, y}, chExt: {cx, cy} } function absPos(grp, shape) { const sca