PPT 视觉质检与双向修正 (PPTX Visual QA)
Overview
做 PPT 时主模型看不到图片,单靠代码填充文本无法发现"文字溢出文本框/超出图形边界/重叠错位"这类渲染问题。本技能建立双向修正闭环:
- 正向:用 WPS 把 .pptx 渲染成 PNG,调用 vision-recognition 的视觉模型"看图",发现异常;
- 逆向:用 python-pptx 提取该页每个形状的坐标(L/T/W/H)、字号、颜色、文本,注入视觉模型的提示词——视觉模型能据此精确判断"文字是否超出该形状的边界"(这是纯看渲染图容易误判/漏判的);
- 整改:按视觉反馈用 python-pptx 改字号/位置/尺寸/对齐,重新渲染、再验证,循环到全部页面通过。
前置依赖
python-pptx、pywin32(pip install python-pptx pywin32)- WPS 或 PowerPoint 已安装(渲染用 WPS
KWPP.Application,PowerPoint COM 故障时可自动回退) - 视觉模型:依赖
vision-recognition技能(智谱 GLM-4.6V,API Key 已配置)
工作流(4 步闭环)
Step 1: 渲染页面为 PNG
python "<技能目录>/scripts/render_slide.py" --pptx "<文件.pptx>" --all --out "<临时目录>/qa" --width 1280 --height 720
--page 5只渲染第 5 页;--all全部页(输出<out>/slide01.png…slideNN.png)- 脚本自动处理中文路径问题(复制为英文临时名)
- 若 WPS 不存在,自动尝试 PowerPoint COM
Step 2: 逆向提取元素清单(给视觉模型的"参照物")
python "<技能目录>/scripts/dump_slide.py" --pptx "<文件.pptx>" --page 5 > "<临时目录>/dump05.txt"
输出每行:形状类型 名称 L=左 T=顶 W=宽 H=高(英寸) font=[字号] 颜色 "文本"。
这个清单是关键:视觉模型将依据它判断文字是否超出对应形状边界。
Step 3: 正向视觉检查(渲染图 + 元素清单)
python "<技能目录>/scripts/vision_check.py" --img "<临时目录>/qa/slide05.png" --dump "<临时目录>/dump05.txt" --focus 溢出
--focus 可选:
- 溢出:文字截断 / 超出文本框或色块边界 / 重叠
- 对齐:标题与同套页面其它页对齐方式是否一致
- 占位符:模板占位符("点击/输入/添加")是否残留
- 美观:整体排版美观度评估
多页检查建议写个小循环脚本逐页调用(注意 Windows 控制台编码:脚本已自动处理 UTF-8/GBK 双解码)。
Step 4: 整改与回归
根据视觉反馈,用 python-pptx 脚本统一修改(不要手动改 XML 除非万不得已):
- 文字超出文本框 → 缩小字号(一般 16pt→11~12pt)或加大文本框高度/宽度
- 文字超出图形色块(圆角矩形/六边形/三角形等)→ 先算色块边界(
L+W),把文本框宽度收回色块内,字号缩到能放下的尺寸;长标题可拆两行并居中 - 对齐错位 → 设置段落
PP_ALIGN.LEFT(与其他章节页一致) - 改完 重复 Step 1→3,直到该页视觉报告"无问题"
> 一次性把发现的所有问题改完再重新渲染,不要改一页验一页(省时间)。
常见陷阱(实战经验)
- python-pptx 读取的文本≠渲染结果:XML 里文本完整,但渲染时可能溢出/被裁。必须以"渲染图+视觉模型"为准,不要只看代码侧文本。
- 视觉模型偶尔漏字/误报:视觉说"某字缺失"时,裁剪该区域放大(PIL
crop+ 放大 4 倍)再次确认,或用像素统计((arr<100).sum())判断该区域是否真有笔画。 - 文本框坐标是"建议值":字号大时文字可能超框显示;判断边界用形状的
left+width、top+height。 - 修改占位符文本后:原占位文本不可再用作文本匹配的锚点(文本已被改写),改用
shape.name定位(如TextBox 2、圆角矩形 3)。 - 分组(GroupShape)元素:目录等组合内元素坐标是相对组坐标系的,dump 脚本已递归展开,看边界时注意。
- PowerShell 里多行
python -c会失败:一律写成 .py 文件执行;脚本内已统一sys.stdout为 UTF-8。
资源
scripts/
render_slide.py:WPS/COM 渲染 .pptx → PNG(Step 1)dump_slide.py:逆向提取页面元素坐标/字号/文本清单(Step 2)vision_check.py:视觉模型检查渲染图,可注入元素清单(Step 3)