PPT审阅后再对账:让接受与拒绝有可核验的文本结果
一份PPT完成审阅后,除了保存文件,还可以多做一道核对:已经选择“接受”的文字是否保留新版,已经选择“拒绝”的文字是否恢复旧版?界面上的按钮和最终文件里的内容是两种证据。本文记录一个独立的本地核验器,只检查明确选定的普通文本对象,并把不能确定的情形留为unknown。
从已有问题确定边界
在阅读PPT-diff公开问题列表时,我发现Issue #10、#53已经讨论拒绝修订后的内容语义。因此没有再提交相同问题,也没有把新工具说成上游修复。这里处理的是一个可以独立验证的需求:给出旧版、新版、审阅后文件及明确的审阅决定,检查文件文字是否符合决定。
这个范围刻意保持有限。工具不控制PowerPoint,不代替人作决定,不检查排版、颜色、图片或整份演示文稿的视觉一致性。它要求页序和对象身份稳定;同页对象被替换后复用ID、页数相同的页面重排,都可能超出它能识别的范围。
先绑定文件,再核对决定
输入决策文件使用旧版和新版完整文件的SHA256绑定版本。生成模板时,每个检测到的文字变化默认为pending,不会自动当成已接受。如果改换了旧版或新版文件,应重新生成模板,不能把先前决定套在另一份文档上。
python review_verify.py make old.pptx new.pptx -o decisions.json
python review_verify.py verify old.pptx new.pptx reviewed.pptx decisions.json --out-dir reports
模板定位使用演示文稿中的实际页面顺序及数字shape id,而非按slide文件名排序。调用者需要明确把decision编辑为accept、reject或pending。核心规则可以写成下面的伪代码:
if decision == 'accept':
expected = new_text
elif decision == 'reject':
expected = old_text
else:
status = 'unknown'
只有三份文档中对应对象都支持且身份前提满足时,才比较实际文字与预期文字。不相等是mismatch,相等是选定范围内的pass;对象缺失、重复、字段类型不支持、页面数量不同或决定未完成,保留unknown。空决策集合也不是通过。核验未选定的修改不在结论内。
两个容易造成假通过的输入边界
独立审查中发现,直接使用XML的find读取文本体会忽略同一形状下第二个txBody。即使这种输入不符合正常结构,也不能只读第一个后给出通过。我补了回归用例,再把实现改为要求恰好一个文本体;歧义对象返回unknown。
另一处是损坏的DEFLATE压缩数据。它会抛出zlib.error,若只让程序异常退出,退出码1会与“文字确实不符”混淆。现在把它转换为输入错误,CLI退出2,不生成报告目录。退出码0表示选定文本通过,1表示不符,2表示无法核验或输入错误;自动化调用者据此区分内容结论与坏文件。
输入还设置了64MiB文件和总解压限制、2000个ZIP成员、单XML 5MiB等边界,拒绝重复ZIP路径、DTD/实体声明和外部幻灯片关系。这些措施用于约束解析范围,并不构成恶意Office文件的完整安全审计。
实测记录与报告隐私
本次19项合成ZIP/XML测试全部通过,覆盖接受、拒绝、pending、错版、重复对象、损坏压缩输入、HTML转义和输出不覆盖。另用python-pptx 1.0.2生成四份普通文本PPTX:拒绝后仍为After得到mismatch,恢复Before得到pass。没有启动真实PowerPoint,也不把合成案例称为真人审阅。
HTML交互演示由华为云免费AI开发者空间按具体需求生成,输出中途截断后补齐,并在本地检查语法和交互。浏览器实测了pending为unknown、拒绝保留新文为mismatch、恢复旧文为pass,以及修改输入后旧结果失效。演示只使用内置合成文字,不在浏览器解析或上传PPT。核心Python与测试在本地实现,不声称整个工具都由AI空间生成。
CLI只用Python标准库,不修改三份输入文件,不访问网络。报告可能包含原文,应留在本地;公开仓库只放工具、合成演示和合成报告。工具仍有明确的身份及格式限制,pass不能作为整份PPT验收结论。
源码与使用说明:https://gitcode.com/hh11211sa/ppt-review-decision-verifier 。公开讨论背景为PPT-diff的Issue #10与#53。把按钮决定和保存结果再对一遍,可以让有限范围内的审阅更容易复查;对于无法证明的部分,应让报告保留unknown。
- 点赞
- 收藏
- 关注作者
评论(0)