PPT校对官 — 文档美化校对技能
用途
自动识别两份文档中哪份是原稿、哪份是美化后的设计稿,逐页/逐段比对标题、数据、正文、英文内容,标注信息差异,输出标准化校对报告。同时检查原稿笔误(错别字、拼写错误、标点混用、文字截断),生成原稿笔误清单。
触发条件
用户上传两份文档,并请求校对 / 比对 / 检查内容一致性,或使用触发词「校对官」。
支持格式
| 角色 | 支持格式 |
|---|---|
| 原稿 | PPTX / DOCX / PDF(含扫描版) |
| 设计稿 | PPTX / PDF(含扫描版) |
全格式组合(3×2 = 6 种)均支持。
输入项(缺一不可)
| 序号 | 输入项 | 说明 | 缺失时行为 |
|---|---|---|---|
| 1 | 原稿文件 | .pptx / .docx / .pdf | 列出缺失项,提示用户上传,暂停 |
| 2 | 设计稿文件 | .pptx / .pdf | 列出缺失项,提示用户上传,暂停 |
| 3 | 输出格式 | Markdown 报告(默认)/ Excel 表格 | 默认 Markdown,无需等待 |
| 4 | 正文校对策略 | 严格逐字比对 / 核心意思一致即通过(默认后者) | 默认核心意思一致即通过 |
> 缺少任意一项必要输入,主动列出缺失项,暂停分析。
执行步骤
Step 1 — 文件加载与自动识别
- 根据文件扩展名选择解析方式(见「多格式解析技术栈」)
- 提取全部文本:文本框、表格(逐行逐列)、组合图形(递归提取子元素文字)、段落
- 自动判断原稿 vs 设计稿,判定规则(按优先级排序):
- 文件名含V1/原稿/原始/草稿→ 原稿
- 日期更早的 → 原稿
- 文字密度更高、内容更原始的 → 原稿
- 含英文副标题、设计元素更多的 → 设计稿 - 在报告中输出识别依据(含文件格式)
Step 2 — 内容结构化提取
对每一页/每段提取以下内容:
- 页号(有明确分页的格式)
- 标题(每页/每段最显著的标题文本)
- 正文段落(按顺序保留)
- 表格数据(行列结构完整记录)
- 关键数字(百分比、年份、人数、金额等)
- 英文文本(完整保留,后续逐字母比对)
Step 3 — 逐页/逐段比对
对齐规则(按格式决定):
| 原稿格式 | 设计稿格式 | 对齐方式 |
|---|---|---|
| PPTX(有页) | PPTX/PDF(有页) | 按页码 1:1 对齐 |
| PDF(有页) | PPTX/PDF(有页) | 按页码 1:1 对齐 |
| DOCX(无固定页) | PPTX/PDF | 按内容章节/标题关键词匹配 |
- 若总页数不同,在报告中标注,并对超出页面单独罗列
- DOCX 原稿无明确分页,改为核对文字信息完整性:确保原稿中的关键文字信息(标题、数据、要点)在设计稿中完整出现,不按页强制对齐
标题比对:
- 语义必须完全一致
- 允许:分隔符样式差异(- ↔ |)、空格增减、中英文补充
- 不允许:标题关键字缺失或替换
数据比对:
- 所有数字(百分比、人数、年份、金额等)必须精确匹配
- 偏差即 🔴 标注
正文比对:
- 默认策略:核心意思一致即通过
- 允许:结构化精简(长段落拆为要点)、换行调整、同义表达、语序微调
- 不允许:信息丢失、关键描述缺失、结论改变
- 若用户要求严格逐字比对,则按逐字策略执行
英文比对:
- 逐字母校核拼写
- 大小写不一致标注
表格比对:
- 行列结构、表头、数据单元格均需一致
- 设计稿将表格内容拆为独立文本框 + 空表壳的,验证文字是否完整保留
Step 4 — 异常标注
| 异常类型 | 标记 | 说明 |
|---|---|---|
| 标题不一致 | 🔴 | 标题关键字缺失或替换 |
| 数据偏差 | 🔴 | 数字不一致 |
| 正文信息丢失 | 🟡 | 关键描述被删除 |
| 场景编号/页码错乱 | 🔴 | 编号重复或缺失 |
| 原稿笔误 | 🔴 | 错别字/拼写/截断/标点混用 |
| 设计稿新增内容 | 🟡 | 超出原稿范围,标注「待确认」 |
| 图形内容无法文本校验 | ⚠️ | 组合图形/扫描图片中的文字需肉眼核对 |
Step 5 — 生成报告
按固定模板输出 Markdown 文件,保存到工作目录。输出结构固定,新增内容只能在预留模块内补充,不能打乱原有框架。
多格式解析技术栈
PPTX 解析
- 使用
python-pptx提取文本、表格、组合图形
DOCX 解析
- 使用
python-docx提取段落、标题层级、表格 - 按文档结构(标题/章节)组织内容,不依赖分页
PDF 解析(文字版)
- 使用
pdfplumber或PyMuPDF (fitz)提取文字与表格 - 按页组织内容
PDF 解析(扫描版)
- 先判断 PDF 是否为扫描版(文字提取为空但页面含图片)
- 扫描版走 OCR 流程:优先调用
pdf-image-text-extractorskill(RedFoxHub OCR),或使用pytesseract+pdf2image本地 OCR - OCR 结果可能存在识别误差,报告中需标注「OCR 识别,建议对关键数据人工复核」
格式识别优先级
- 读取文件头/扩展名判断格式
- PPTX → python-pptx
- DOCX → python-docx
- PDF → 先尝试文字提取,为空则判定扫描版走 OCR
输出模板
输出文件命名:校对报告.md
# 文档美化校对报告
**原稿**: [文件名](格式,日期,X页)
**设计稿**: [文件名](格式,日期,X页)
**校对日期**: YYYY.MM.DD
**校对结论**: [一句话总结 + 关键数字]
---
## 识别依据
| 特征 | 原稿 | 设计稿 |
|------|------|--------|
| 文件名 | ... | ... |
| 格式 | PPTX/DOCX/PDF | PPTX/PDF |
| 日期 | ... | ... |
| 内容密度 | ... | ... |
| 其他特征 | ... | ... |
---
## 逐页/逐段校对明细
### 第N页 / 章节X - [主题]
| 检查项 | 原稿 | 设计稿 | 结论 |
|--------|------|--------|------|
| 标题 | ... | ... | ✅/🔴 ... |
| 数据 | ... | ... | ✅/🔴 ... |
| 正文 | ... | ... | ✅/🟡 ... |
| 其他 | ... | ... | ... |
---
## 原稿明显笔误清单
| 序号 | 所在页 | 错误内容 | 正确应为 | 严重程度 |
|------|--------|----------|----------|----------|
| 1 | 第X页 | 错误文本 | 正确文本 | 🔴/🟡 说明 |
---
## 设计稿需关注的问题
| 序号 | 所在页 | 问题描述 | 建议 |
|------|--------|----------|------|
| 1 | 第X页 | 问题描述 | 修改建议 |
---
## 总结
- **标题一致性**: ✅/🔴 [数量/通过率]
- **数据一致性**: ✅/🔴 [数量/通过率]
- **表格数据**: ✅/🔴 [数量/通过率]
- **正文精简**: ✅/🟡 [评价]
- **英文校核**: ✅/🔴 [评价]
- **原稿笔误**: 🔴 [N处]
- **设计稿问题**: 🟡 [N处]
---
## [预留补充模块]
> 仅在此处追加用户要求的额外分析内容,不可在以上固定模块之间插入。
内置规则(不可覆盖)
| 规则 | 内容 |
|---|---|
| 标题判定 | 语义完全一致即通过,允许分隔符样式差异(如 - ↔ |) |
| 正文判定 | 默认「核心意思一致即通过」,允许结构精简、换行、同义表达 |
| 数据判定 | 数字精确匹配,偏差即报警 🔴 |
| 英文判定 | 逐字母比对,大小写不一致标注 |
| 自动识别 | 文件名含 V1/原稿/原始/更早日期/文字密度更高 → 原稿 |
| 页对齐 | 有明确分页的按页码 1:1;DOCX 无分页按文字信息完整性核对 |
| 扫描版 PDF | 走 OCR 流程,标注识别误差风险 |
| 异常预警 | 数据不一致、场景编号错乱、内容大幅扩充 → 自动 🔴 标注 |
| 不可覆盖 | 以上规则以本次定稿为唯一标准,后续执行不得自主修改 |
提取脚本模板
from pptx import Presentation
def extract_text_pptx(pptx_path):
prs = Presentation(pptx_path)
slides = []
for slide_num, slide in enumerate(prs.slides, 1):
slide_data = {'slide_num': slide_num, 'texts': [], 'tables': []}
for shape in slide.shapes:
if hasattr(shape, "text_frame") and shape.text_frame:
for para in shape.text_frame.paragraphs:
t = para.text.strip()
if t:
slide_data['texts'].append(t)
if shape.has_table:
table_data = []
for row in shape.table.rows:
table_data.append([cell.text.strip() for cell in row.cells])
slide_data['tables'].append(table_data)
if shape.shape_type == 6:
_extract_group(shape, slide_data)
slides.append(slide_data)
return slides
def _extract_group(shape, slide_data):
try:
for child in shape.shapes:
if hasattr(child, "text_frame") and child.text_frame:
for para in child.text_frame.paragraphs:
t = para.text.strip()
if t:
slide_data['texts'].append(t)
if child.shape_type == 6:
_extract_group(child, slide_data)
except Exception:
pass
# DOCX 提取
from docx import Document
def extract_text_docx(docx_path):
doc = Document(docx_path)
paragraphs = [p.text.strip() for p in doc.paragraphs if p.text.strip()]
tables = []
for table in doc.tables:
tables.append([[cell.text.strip() for cell in row.cells] for row in table.rows])
return {'paragraphs': paragraphs, 'tables': tables}
# PDF 提取(文字版)
import fitz # PyMuPDF
def extract_text_pdf(pdf_path):
doc = fitz.open(pdf_path)
pages = []
for page_num, page in enumerate(doc, 1):
pages.append({'page_num': page_num, 'text': page.get_text()})
return pages
# 判断是否扫描版:所有页 get_text() 结果为空但页面含图片 → 走 OCR
注意事项
- 校对结论基于文本提取。设计稿使用纯图片/扫描图呈现文字时,对应页标注「含图形内容,建议肉眼核对」
- 扫描版 PDF 的 OCR 结果可能存在误差,关键数据(数字、专有名词)需提示人工复核
- 原稿笔误清单仅标注原稿问题;设计稿继承的笔误在设计稿关注问题中单独列出
- 严重程度定义:🔴 高(影响信息准确性或品牌正确性)、🟡 中(表述不完整或需确认)
- 页数不匹配时,按页码对齐后单独罗列多余页面;DOCX 无分页则按文字信息完整性核对