91 KiB
WORD 文件信息替换与还原工具需求规格说明书
1. 文档目的
本文档用于明确“WORD 文件信息替换与还原工具”的功能范围、交互方式、数据格式、兼容性约束、运行约束与验收标准,作为开发、测试和验收的统一依据。
2. 产品目标
本工具用于对 Word 文件中的文字与图像信息进行批量替换,并生成可用于严格还原的差异文件;随后可基于替换后的文件和差异文件恢复出还原文件。
工具应满足以下总体目标:
- 同时支持
*.doc和*.docx输入文件。 - 替换和恢复宿主机必须已安装支持
*.docx的 Word 或 WPS;除该明确前提外,程序及其依赖应绿色离线交付。 - 所有依赖离线打包,目标环境无需联网下载。
- 替换和还原过程静默执行,不显示 Word 打开界面。
- 支持批量处理目录及子目录中的文件。
- 还原过程采用严格匹配,不允许模糊恢复。
说明:
*.docx是优先设计、优先优化、优先验证的格式。*.doc作为兼容性支持对象,在复杂对象场景下以最终验收结果为准。
3. 术语定义
- 原始文件
[A]:待执行替换操作的 Word 文件。 - 替换后文件
[B]:执行替换操作后生成的新 Word 文件。 - 差异文件
[C]:记录替换过程所需恢复信息的数据文件。 - 还原文件
[A']:根据[B]和[C]还原生成的 Word 文件。 - 规则文件:后缀为
*.rule的 JSON 文件,用于定义文字替换规则。 - Story:Word 的逻辑文本区域,例如正文、页眉、页脚、批注、文本框等。
- Run:Word 在同一段落或容器内对连续文字进行的内部样式片段划分。视觉上连续的文字可能由多个 Run 组成。
4. 功能概述
系统包含以下三个页面:
- 替换
- 恢复
- 设置
系统主要能力包括:
- 选择原始文件目录并批量生成替换后文件与差异文件
- 基于替换后文件和差异文件生成还原文件
- 管理规则文件,配置文字替换规则
- 对规则进行合法性和兼容性检查
- 记录详细运行日志、会话配置和处理结果
5. 处理对象范围
5.1 总体范围
替换与恢复范围为全文范围,包含但不限于:
- 页眉
- 页脚
- 正文段落
- 正文中的表格
- 页眉和页脚中的表格
- 正文中的文本框
- 页眉和页脚中的文本框
- 批注
- 题注
- 超链接显示文字
- 目录显示结果
- 域显示结果
- 公式中的可解析文字内容
- 图表中的文本内容
- 图片对象
- 形状对象中的文字及可转换图形内容
5.2 图片对象范围
以下图片对象在替换与恢复范围内:
- 嵌入式图片
- 浮动图片
- 页眉页脚中的图片
- 表格单元格中的图片
- 文本框中的图片
5.3 表格支持范围
表格处理要求如下:
- 支持普通表格
- 支持合并单元格
- 支持表格单元格中的文字
- 支持表格单元格中的图片
- 不支持跨单元格匹配文字
5.4 明确不支持的处理方式
- 不支持跨段落匹配文字
- 不支持对加密文档进行处理
- 不支持对受保护文档进行处理
说明:
- 只读文档应支持处理。
- 对于不支持或无法打开的文档,系统应记录错误并跳过当前文件,继续处理后续文件。
6. 替换功能需求
6.1 功能描述
对原始文件 [A] 执行替换操作,输出:
- 替换后文件
[B] - 差异文件
[C]的 JSON 形式 - 差异文件
[C]的 BMP 形式
6.2 处理模式
替换处理支持目录批处理:
- 以用户选择的原始文件夹为输入根目录
- 自动扫描该目录及其所有子目录下的
*.doc和*.docx文件 - 用户可对扫描结果进行勾选控制
- 仅处理当前勾选的文件
6.3 输出目录与目录结构
替换输出应满足:
- 以用户选择的替换文件夹为输出根目录
- 相对于原始文件夹的目录树结构必须被完整保留
- 替换后文件与差异文件保存在替换文件夹下对应相对路径目录中
6.4 命名规则
替换模式下输出文件命名规则如下:
- 原始文件的文件基本名(不含目录与扩展名)必须纳入启用规则的匹配和替换范围
- 文件名匹配使用与正文文字一致的规则顺序、普通文本/正则模式、大小写开关、全字匹配开关和替换模板语义
- 目录路径与扩展名不参与文件名规则匹配和替换
- 若文件名未命中任何规则,则使用原始文件基本名
- 替换后文件名:
规则替换后的文件基本名-yyyyMMdd.原始后缀 - 差异文件 JSON 名:
规则替换后的文件基本名-yyyyMMdd.diff - 差异文件 BMP 名:
规则替换后的文件基本名-yyyyMMdd.bmp - 差异文件必须在文档元数据中记录原始文件名与实际替换后文件名,用于恢复时还原文件名
- 当原始文件名与实际替换后文件名不一致时,差异文件的修改记录中必须记录一条文件名变更操作,用于审计文件名变化
- 若规则替换后的文件基本名为空或包含非法文件名字符,应阻断当前扫描/执行并在日志中记录源文件、规则结果和错误原因
若出现同名冲突:
- 不覆盖现有文件
- 自动在文件名后追加自增序号
- 同一源文件产生的替换文档、
*.diff、*.bmp中任一输出发生同名冲突时,三者必须使用相同的自增序号,确保恢复扫描可按同一文件基本名配对
示例:
- 原始文件
示例.docx,文件名规则将示例替换为样例 样例-20260424.docx样例-20260424_1.docx样例-20260424.diff样例-20260424_1.diff样例-20260424.bmp样例-20260424_1.bmp
7. 文字替换规则
7.1 基本规则
每条规则用于将文字片段 alpha 替换为 beta。
规则按列表顺序依次执行。
前一条规则替换后的结果允许被后一条规则再次命中。
当多条规则命中同一位置时:
- 以规则顺序优先
7.2 规则文件格式
规则文件采用 JSON 格式保存:
- 文件后缀:
*.rule
7.3 每条规则字段
每条规则至少包含以下字段:
- 规则 ID
- 规则名称
- 是否启用
- 匹配模式
- 是否区分大小写
- 是否全字匹配
- 原文本或正则表达式
- 新文本或替换模板
- 备注
字段说明:
- 规则 ID 必须唯一
- 匹配模式取值为:
- 普通文本
- 正则表达式
- 区分大小写默认值为:否
- 全字匹配默认值为:否
7.4 普通模式与正则模式
文字替换应支持:
- 普通文本模式
- 正则表达式模式
正则模式要求:
- 支持捕获组
- 支持捕获组回填
7.5 匹配边界要求
匹配应满足:
- 允许跨 Run 匹配
- 不允许跨段落匹配
- 不允许跨单元格匹配
说明:
- 在同一段落、同一文本框、同一单元格内部,视觉连续但被拆分为多个 Run 的文本,应允许被视为同一次匹配。
7.6 样式保持要求
文字替换后必须保持以下样式不变:
- 字体
- 字号
- 颜色
- 粗体、斜体、下划线等字符样式
- 缩进
- 行间距
- 段前距
- 段后距
- 编号格式
编号相关要求:
- 编号值不变
- 编号级别不变
- 缩进不变
- 制表位不变
- 自动编号行为不变
7.7 占位要求
文字替换后不得改变原有版式。
“占位”定义为:
- 屏幕显示字符宽度
若新文本显示宽度大于原文本:
- 应对新文本进行截断
若新文本显示宽度小于原文本:
- 允许采用适当空白填充或等效方式补齐
补齐规则要求:
- 只要能够保持原版式不变且支持完整恢复,具体空白实现方式不限
- 若“补齐宽度”和“版式稳定”冲突,以版式稳定为优先
7.8 可恢复性记录要求
每一处文字替换都必须写入差异文件,至少记录:
- 替换类型,标记为“文本替换”
- 规则 ID
- 规则名称
- 规则表达式或原文本
- 当前规则命中序号
- 位置起点
- 位置终点
- 被替换前文本
- 替换后文本
- 所属对象类型
7.9 自动提取生成规则要求
系统应支持从当前启用的文档集合自动提取候选规则。
该功能要求如下:
- 入口位于替换页面
- 提取对象为替换页面文件列表中复选框已勾选的全部文档
- 当文件列表未勾选任何文件时,自动提取不得执行
- 文件列表中的高亮选中状态不影响自动提取扫描范围
- 提取范围为全部勾选文档中纳入文字替换范围的可见文本内容
- 提取范围至少包括:
- 正文
- 页眉页脚
- 表格
- 文本框
- 批注
- 超链接显示文字
- 域结果
- 公式文字
- 图表文字
- 仅提取可见文本
- 不提取隐藏文字、域代码、修订删除内容和对象内部不可见元数据
- 提取内容至少包含:
- 关键字
- 高频词
- 高频句
- 提取类别应在设置页面中可配置,默认全选
- 自动提取不设置扫描页数或字符数上限,应对全部勾选文档全文分析
- 自动提取功能优先保证
*.docx,对*.doc以实际可解析文本范围为准
提取算法与筛选要求:
- 关键字提取应支持以下算法,并允许多选:
- 按词频
TF-IDFTextRank
- 关键字提取算法默认全选
- 执行自动提取时,应对勾选文件范围按所选关键字算法各执行一轮,并对结果去重合并后进入预览
- 高频词提取应支持中文词项和英文单词两个统计选项,默认全选
- 高频句提取应支持中文句和英文句两个统计选项,默认全选
- 高频句的句子分隔符应在设置页面中可配置,默认启用常见中英文句末分隔符
- 单字和单词长度限制应在设置页面中可配置
- 中文词项最小长度默认值建议为
1 - 英文单词最小长度默认值建议为
1 - 邮箱地址默认参与提取
- 其他内容如纯数字、日期、编号序列、页码、URL 不默认排除
提取结果处理要求:
- 提取完成后,必须先展示提取结果预览,而不是直接追加
- 预览界面中,用户应可按条选择是否追加
- 预览结果应至少显示:
- 是否追加
- 提取类型
- 原文本
- 统计值
- 首次出现文档路径
- 首次出现顺序
- 提取结果应按首次出现顺序排序
- 同一原文本在同一次提取结果中去重后仅保留一次
- 用户确认后,每一条被选中的提取结果应追加为一条新规则
- 追加目标为当前会话内存中的规则列表
- 追加后应立即反映到设置页面的规则列表中
- 规则追加后,只有在用户执行“保存规则文件”后,才写入
*.rule文件
自动生成规则的默认字段要求:
- 规则 ID:系统自动生成,且必须唯一
- 自动提取生成的规则 ID 应按提取类型使用前缀:
- 关键字:
AK - 高频词:
AW - 高频句:
AS
- 关键字:
- 规则名称:系统自动生成
- 自动提取生成的规则名称建议格式为:
- 关键字:
AUTO-KW-0001 - 高频词:
AUTO-WORD-0001 - 高频句:
AUTO-SENT-0001
- 关键字:
- 是否启用:是
- 匹配模式:普通文本
- 是否区分大小写:是
- 是否全字匹配:是
- 原文本或表达式:提取结果原文
- 新文本或替换模板:默认初始化为空字符串
- 备注:应标记为自动提取,并至少记录提取类型、统计值、首次出现文档路径和提取时间
补充要求:
- 自动提取规则的“规则生效”定义为规则启用状态为“是”
- 即使新文本或替换模板为空字符串,自动提取生成的规则仍必须默认处于启用状态
- 系统不得因自动提取规则的新文本为空而自动禁用、自动填充或阻止用户执行后续替换流程
- 对于原文本为空、纯空白或无效的提取结果,不得追加
- 对于与当前规则列表中原文本相同的普通文本规则,应视为重复项并避免追加
- 若现有人工规则与自动提取结果原文本相同,则必须保留人工规则并丢弃自动提取结果
- 即使现有规则的大小写选项或新文本不同,只要原文本相同,自动提取结果仍视为重复项
- 在用户确认追加前,应执行快速去重和冲突检查
- 在用户确认追加后,应对完整规则列表执行正式合法性和兼容性检查
- 提取过程中必须显示进度,并允许用户取消
- 提取过程中不允许用户编辑规则列表
- 用户取消提取后,不得修改当前规则列表
- 追加完成后,系统应自动切换到设置页面并定位到第一条新增规则
- 系统必须提供“撤销本次自动提取追加结果”的操作
- 撤销应仅回退最近一次自动提取成功追加的规则集合
- 若未提取到任何有效结果,必须弹窗提示“未提取到可用项”
- 提取完成后,系统应通过弹窗和日志给出提取总数、成功追加数、跳过数
- 自动提取失败时,不得破坏现有规则列表,并必须写入日志
8. 图片替换规则
8.1 位图图片范围
位图图片至少支持以下格式:
- BMP
- PNG
- JPG / JPEG
- TIFF
- GIF
8.2 非位图图片范围
非位图图片或对象至少支持以下类型:
- WMF
- EMF
- SVG
- Office 形状对象
- 图表对象
8.3 位图图片替换方式
对位图图片执行如下处理:
- 在原图基础上添加随机噪声形成新图
- 噪声类型包含:
- 点噪声
- 线噪声
- 块噪声
- 噪声应基本均匀分布于全图范围
- 被修改的像素数占比不得低于原图像素总数的 50%
8.4 非位图图片替换方式
对非位图对象执行如下处理:
- 先转换为位图
- 转换后保持原显示占位不变
- 再按位图图片替换方式处理
8.5 图片属性保持要求
图片替换后必须保持以下属性不变:
- 显示尺寸
- 页面位置
- 环绕方式
- 锚点位置
- 裁剪参数
- 旋转角度
8.6 随机性要求
图片替换要求如下:
- 默认每次执行时噪声应随机不同
- 系统应支持固定随机种子,以便相同输入可重复生成相同结果
- 噪声类型比例不提供用户配置项,由系统自动设置最优方案
8.7 非位图恢复要求
非位图对象在恢复时:
- 只恢复为位图形式
- 不要求恢复为原始非位图对象类型
8.8 图片差异记录要求
每一处图片替换都必须写入差异文件,至少记录:
- 替换类型,标记为“图像替换”
- 对象位置
- 原图数据
- 若原图为非位图,则记录转换后的位图数据
- 替换后新图数据
- 随机种子
- 原图尺寸
- 替换后尺寸
- 所属对象类型
9. 其他对象处理规则
9.1 超链接
超链接仅处理:
- 显示文字
不处理:
- 目标 URL
9.2 目录
目录处理要求:
- 替换时仅处理目录当前显示结果
- 替换完成后必须自动更新目录
- 恢复完成后必须自动更新目录
9.3 域
域处理要求:
- 仅处理域显示结果
- 不处理域代码
- 替换完成和恢复完成后必须刷新域,并验证文档显示结果中不得存在“错误!未找到引用源”等交叉引用或域结果错误
- 若验证发现交叉引用或域结果错误,应拒绝输出当前文件,并在日志中记录足够定位的 Story、容器、段落和上下文片段
9.4 公式
公式处理要求:
- 解析公式中的可解析文字内容进行替换
- 不将公式整体按图像处理
9.5 图表
图表中以下文本内容均在处理范围内:
- 标题
- 坐标轴标题
- 图例
- 数据标签
- 图表内嵌数据表文本
9.6 批注
批注处理要求:
- 仅修改批注内容
- 必须保留批注作者
- 必须保留批注时间
- 必须保留批注状态
10. 还原功能需求
10.1 功能描述
通过读取替换后文件 [B] 与差异文件 [C],生成还原文件 [A']。
10.2 还原匹配原则
还原过程采用严格匹配,不允许容错查找。
即:
- 必须按差异文件中记录的位置严格定位
- 必须按差异文件中记录的当前内容进行严格比对
- 任一关键匹配条件不成立时,该处恢复失败
10.3 位置模型
差异文件中的位置定义采用以下模型:
- Story 类型
- 容器路径
- 段落索引
- 起始 Run 索引
- 起始字符偏移
- 结束 Run 索引
- 结束字符偏移
说明:
- 文本对象使用上述位置模型定位
- 非文本对象应在上述逻辑容器基础上补充对象索引定位
10.4 恢复输入格式
恢复模式下,用户一次只能选择一种差异文件输入格式:
*.diff*.bmp
若用户选择 *.bmp:
- 程序应先自动解码得到与 JSON 差异数据逻辑等价的数据
- 然后按统一恢复逻辑执行恢复
程序不应在同一次批处理中自动混用两种差异文件格式。
10.5 恢复输出目录与命名
恢复模式输出要求:
- 以用户选择的恢复文件夹为输出根目录
- 相对于替换文件夹的目录树结构必须完整保留
- 恢复时必须优先读取差异文件中的
sourceDocument.fileName
恢复文件命名规则如下:
- 对于包含文件名元数据的新差异文件:恢复输出文件名应还原为原始文件名与原始扩展名
- 示例:
示例.docx经文件名规则替换输出为样例-20260424.docx,恢复输出应为示例.docx - 对于缺少原始文件名元数据的旧差异文件,允许使用兼容命名:
替换后文件名-rcv.替换后后缀
若发生同名冲突:
- 不覆盖
- 自动追加自增序号
10.6 异常处理
还原过程中:
- 单个文件失败不应导致整个批处理终止
- 系统应记录错误并继续处理后续文件
- 处理结束后必须给出汇总结果
11. 可逆性与一致性要求
11.1 文字一致性
恢复后的 [A'] 必须在文字内容上与 [A] 完全一致。
文字内容一致的验收口径为:
- 按纯文本完全一致验收
11.2 排版一致性
恢复后的 [A'] 必须在排版上与 [A] 一致。
排版一致的验收至少包括:
- 页数一致
- 分页位置一致
- 段落分页一致
- 表格分页一致
- 行数一致
11.3 插图一致性
恢复后的插图必须与原文件在视觉上保持一致。
插图一致性验收至少同时包括:
- 肉眼比对一致
- 尺寸和位置一致
- 像素相似度达到测试规范定义阈值
说明:
- 像素相似度阈值由测试规范另行定义。
12. 规则兼容性检查
12.1 检查时机
规则兼容性检查必须在以下时机执行:
- 保存规则文件时
- 执行替换前
12.2 检查内容
兼容性检查至少覆盖:
- 正则表达式非法
- 规则自身替换后再次命中自身
- 多条规则命中同一区域
- 规则间循环影响
- 规则前后覆盖关系
- 明显不可恢复风险
12.3 检查结果处理
当发现正则语法错误等致命错误时:
- 禁止保存规则文件
- 通过日志提示错误
- 日志必须能够定位规则位置
- 日志必须提供详细错误信息
当发现兼容性风险但不属于致命错误时:
- 允许用户继续执行
- 必须弹窗提示
- 必须写入日志
12.4 执行门槛
规则兼容性检查必须在执行前完成。
对于非致命风险:
- 允许用户确认后继续执行
13. 差异文件要求
13.1 总体要求
差异文件必须同时生成两种形式:
- JSON 形式
- BMP 形式
两种形式必须双向无损转换。
13.2 JSON 差异文件
JSON 差异文件要求如下:
- 文件后缀:
*.diff - 图片差异数据必须内嵌保存
- 不允许依赖外部图片文件进行恢复
- 差异文件必须包含完整恢复所需信息
13.3 JSON 加密选项
系统必须提供 JSON 差异文件加密选项:
- 可选值:加密 / 不加密
- 默认值:加密
该选项要求:
- 记录到会话配置文件中
- 影响后续生成的
*.diff文件
说明:
- 由于系统同时必须生成不加密的
*.bmp差异文件,*.diff的加密能力仅适用于该文件自身的存储形式 - 当
*.bmp同时存在时,不应将*.diff加密视为整体差异数据的保密性保证
13.4 BMP 差异文件
BMP 差异文件要求如下:
- 文件后缀:
*.bmp - 与对应
*.diff文件同名同目录生成 - 必须能够无损还原出逻辑等价的差异数据
- BMP 文件本身不加密
13.5 校验与安全性
差异文件必须具备:
- 完整性校验
- 防篡改能力
差异文件至少应记录以下校验与识别信息:
- 原始文件指纹
- 替换后文件指纹
- 规则文件指纹
- 程序版本
- 差异算法版本
若差异文件校验失败:
- 必须拒绝恢复
- 不允许强制继续
若恢复时发现替换后文件 [B] 与差异文件 [C] 不匹配:
- 必须拒绝恢复
- 记录明确错误原因
- 不允许强制继续
14. 人机界面要求
14.1 通用界面要求
系统界面固定为以下三个 Tab 页:
- 替换
- 恢复
- 设置
批处理期间界面要求:
- 不得卡死
- 状态必须持续刷新
- 日志必须持续刷新
- 进度条必须持续刷新
14.2 目录选择对话框要求
凡涉及文件夹路径选择,均应满足:
- 单击按钮后,弹出系统现代风格的目录选择对话框
- 对话框界面风格应与文件打开对话框一致,但选择目标为文件夹
- 不使用传统树形“浏览文件夹”对话框
- 用户点击“确定”后,关闭对话框,并将所选文件夹绝对路径填入对应文本框
- 用户点击“取消”后,关闭对话框,不更新对应文本框内容
14.3 替换页面
替换页面包含以下主要控件:
- 选择原始文件夹按钮
- 原始文件夹路径文本框
- 选择替换文件夹按钮
- 替换文件夹路径文本框
- 文件列表
- 自动提取按钮
- 开始替换按钮
- 停止按钮
- 总进度条
- 单文件进度条
交互要求:
- 当原始文件夹路径文本框或替换文件夹路径文本框失去输入焦点后,应自动异步扫描原始文件夹
- 自动加载目标目录及子目录下符合后缀的文件
- 扫描过程中界面不得无响应
- 文件列表默认全部勾选
- 支持单选和多选
- 支持批量勾选和批量取消勾选
- 支持右键批量操作
- 右键菜单至少应提供:删除、启用、不启用
- 右键菜单批量操作应作用于当前选中的一行或多行
- 支持按列排序
- 自动提取按钮用于对当前勾选启用的文件集合执行关键字、高频词、高频句提取
- 当文件列表未勾选任何文件时,自动提取按钮应禁用或给出明确提示
- 当文件列表勾选了一个或多个文件时,点击自动提取按钮后,应对全部勾选文档执行提取
- 文件列表的单选或多选状态仅用于界面交互,不影响自动提取的扫描范围
- 点击自动提取后,应先进入提取结果预览流程
- 自动提取过程中必须显示处理进度,并允许用户取消
- 自动提取过程中界面不得假死
- 自动提取过程中不允许编辑规则列表
- 预览界面中,用户应可选择性勾选要追加的候选项
- 用户确认追加后,提取结果应追加到当前规则列表,并立即反映到设置页面的规则列表中
- 追加完成后,应自动切换到设置页面并定位到第一条新增规则
- 系统应提供“撤销本次自动提取追加结果”操作
- 提取完成后,必须弹出结果摘要,并将提取数量、追加数量、跳过数量写入日志
- 若未提取到任何有效结果,必须弹窗提示“未提取到可用项”
文件列表至少包含以下列:
- 原始文件路径
- 替换后文件路径
- 差异文件路径
- 文本替换次数
- 图片替换次数
- 当前状态
停止按钮语义:
- 用户点击停止后,系统应尽量完成当前正在处理的文件
- 当前文件结束后再停止后续任务
状态显示至少包含:
- 未处理
- 处理中
- 成功
- 失败
- 已停止
颜色要求:
- 成功:绿色
- 失败:红色
- 处理中:蓝色
- 已停止:灰色
运行过程中必须显示:
- 当前正在处理的文件编号 / 总文件数
- 当前规则编号与规则名称
- 当前文件命中次数
- 累计命中次数
执行完成后:
- 必须弹出汇总结果对话框
14.4 恢复页面
恢复页面包含以下主要控件:
- 选择替换文件夹按钮
- 替换文件夹路径文本框
- 选择恢复文件夹按钮
- 恢复文件夹路径文本框
- 文件列表
- 开始恢复按钮
- 停止按钮
- 总进度条
- 单文件进度条
交互要求:
- 当相关路径文本框失去输入焦点后,应自动异步扫描
- 自动加载目标目录及子目录下可恢复的文件
- 单次批处理仅允许使用一种差异文件输入格式
- 支持右键批量操作
- 右键菜单至少应提供:删除、启用、不启用
- 右键菜单批量操作应作用于当前选中的一行或多行
文件列表至少包含以下列:
- 替换后文件路径
- 差异文件路径
- 恢复文件路径
- 文本恢复次数
- 图片恢复次数
- 当前状态
停止按钮语义与替换页面一致。
执行完成后:
- 必须弹出汇总结果对话框
14.5 设置页面
设置页面包含以下主要控件:
- 打开规则文件按钮
- 规则文件路径显示区
- 保存规则文件按钮
- 规则列表
- 自动提取设置区
- 规则新增按钮
- 规则删除按钮
- 规则上移按钮
- 规则下移按钮
规则列表至少包含以下字段列:
- 规则 ID
- 规则名称
- 是否启用(复选框)
- 匹配模式
- 是否区分大小写
- 是否全字匹配
- 原文本或表达式
- 新文本或替换模板
- 备注
设置页面要求:
- 仅保留“打开”和“保存”操作
- 不提供导入、导出、另存为等独立功能
- 规则列表支持单选和多选
- 规则列表支持右键批量操作
- 规则列表右键菜单至少应提供:删除、启用、不启用
- 规则列表右键批量操作应作用于当前选中的一行或多行
- 保存时必须执行规则合法性和兼容性检查
- 检查结果必须同时输出到弹窗和日志
- 替换页面自动提取追加的规则,必须立即显示在规则列表中
- 自动提取设置区至少应提供以下配置项:
- 提取类别选择:关键字、高频词、高频句,默认全选
- 关键字提取算法选择:按词频、
TF-IDF、TextRank,支持多选,默认全选 - 关键字最大提取数量,默认
10 - 高频词最大提取数量,默认
10 - 高频句最大提取数量,默认
10 - 高频词统计选项:中文词项、英文单词,默认全选
- 高频句统计选项:中文句、英文句,默认全选
- 中文词项最小长度
- 英文单词最小长度
- 句子分隔符选项
- 是否排除邮箱地址,默认否
- 自动提取相关设置属于会话配置,重启后应从
config.json恢复
15. 日志要求
15.1 日志显示与存储
系统必须同时提供:
- 界面日志框显示
- 日志文件落盘
界面日志框要求:
- 支持复制日志内容
- 支持右键菜单
- 右键菜单至少应提供:复制全部内容、清空日志
- “复制全部内容”应复制当前日志框中的全部文本内容
- “清空日志”仅清空界面日志框显示内容,不影响已落盘日志文件
日志编码固定为:
- UTF-8
日志文件要求:
- 保存于启动目录
- 采用按天追加写入方式
- 启动目录必须可写;若不可写,则视为运行环境不满足要求
日志文件命名规则:
session-yyyyMMdd.log
15.2 日志级别与颜色
日志级别至少包括:
- INFO
- WARNING
- ERROR
显示颜色要求:
- INFO:绿色
- WARNING:橙色
- ERROR:红色
- 一般过程信息:黑色
15.3 日志内容
日志至少记录:
- 文件操作记录
- 当前处理源文件
- 生成的替换文件路径
- 生成的 JSON 差异文件路径
- 生成的 BMP 差异文件路径
- 当前处理的规则编号与规则名称
- 匹配成功的原文本
- 匹配成功的起始位置和结束位置
- 当前文件序号与总文件数
- 当前规则序号与总规则数
- 当前规则命中序号
- 恢复记录
- 恢复失败原因
- 异常堆栈
- 规则兼容性检查结果及严重级别
- 图片替换时的随机种子
- 图片替换时的尺寸信息
- 批处理汇总信息
15.4 批处理汇总
批处理汇总日志至少包含:
- 成功文件数
- 失败文件数
- 跳过文件数
- 文本替换总次数
- 图片替换总次数
- 文本恢复总次数
- 图片恢复总次数
16. 会话配置要求
16.1 基本要求
系统应以 JSON 格式保存当前会话信息:
- 文件名:
config.json - 保存目录:启动目录
会话信息变化后应自动刷新配置文件。
启动时若存在 config.json,应自动加载。
16.2 配置项
会话配置至少包含:
- 当前规则文件路径
- 替换页面的原始文件夹路径
- 替换页面的替换文件夹路径
- 恢复页面的替换文件夹路径
- 恢复页面的恢复文件夹路径
- JSON 差异文件加密开关
17. 兼容性与运行环境要求
17.1 操作系统
系统必须兼容以下离线原生纯净系统:
- Windows 7 SP1 x64
- Windows 10 x64
- Windows 11 x64
- Windows Server 2022 x64
17.2 运行架构
- 仅支持 x64
- 程序应以普通用户权限运行
- 不依赖管理员权限
- 目标机不具有管理员权限
- 目标机不具有软件安装权限
17.3 依赖要求
- 所有依赖必须随程序离线打包
- 目标系统不应要求预装第三方运行时或工具;若 .NET Framework 4.8 无法真正自包含,应在交付风险中明确说明
- 允许程序首次启动时将内置组件解压到本地临时目录
- 替换和恢复宿主机必须已安装支持
*.docx的 Word 或 WPS - 不得要求安装 Visio;Visio/OLE 等对象按可见位图表示处理
- 第三方库应选择免费授权的非商业第三方库,且可满足项目使用要求
17.4 交付形式
交付形式要求如下:
- 仅提供绿色版
- 不提供安装版
- 不要求桌面快捷方式、开始菜单或卸载项
若采用覆盖升级方式分发新版本,应保留:
config.json- 日志文件
*.rule规则文件
18. 性能与响应要求
18.1 目标性能指标
以下指标为单个文件处理的目标性能,不作为强制验收门槛:
- 替换处理 2000 页 Word 文件不超过 180 秒
- 还原处理 2000 页 Word 文件不超过 180 秒
- 替换处理 100 页 Word 文件不超过 10 秒
- 还原处理 100 页 Word 文件不超过 10 秒
说明:
- 目录扫描时间不计入上述指标
- 日志写入时间不计入上述指标
- BMP 差异文件生成时间不计入上述指标
18.2 大文件与多文件响应性
即使在大文件或多文件场景下,系统也必须满足:
- 不出现界面卡死
- 不出现状态不更新
- 不出现操作无响应
- 支持异步扫描
- 支持并行处理多个文件
并行处理要求:
- 并发度不提供用户配置项
- 由系统根据运行环境自动尽可能利用可用资源
19. 标准验收要求
19.1 标准验收样例集
项目必须提供标准验收样例集,至少覆盖:
- 页眉
- 页脚
- 文本框
- 表格
- 合并单元格
- 批注
- 目录
- 域
- 公式
- 图表
- 位图图片
- 非位图图片
*.doc*.docx
19.2 验收输出物
项目应提供:
- 测试报告
- 验收报告模板
19.3 执行前门槛
执行替换前至少满足:
- 规则文件加载成功
- 规则合法性检查通过
- 规则兼容性检查已完成
- 输入路径有效
- 输出路径有效且可写
20. 异常防护与故障处理要求
20.1 总体原则
系统应满足以下总体故障处理原则:
- 单文件失败不影响后续文件继续处理
- 文件级错误必须在日志中完整记录
- 汇总结果必须明确显示成功、失败、跳过数量
- 停止操作应在当前文件尽量处理完成后生效
- 以“可恢复性”和“一致性”为最高优先级,不得为了继续执行而牺牲可逆性
20.2 路径与目录防护
执行前必须完成路径合法性检查。
以下情况应视为非法配置并阻止执行:
- 原始文件夹与替换文件夹相同
- 原始文件夹与恢复文件夹相同
- 替换文件夹与恢复文件夹相同
- 任意两个上述目录互为父子目录
- 输出目标路径与输入源路径重合
执行过程中还必须处理以下路径异常:
- 路径过长
- 文件名或路径包含非法字符
- 输出目录不存在
- 输出目录只读
- 输出目录无写权限
对于批处理根路径非法:
- 整个批处理不得启动
对于单文件目标路径异常:
- 当前文件失败
- 记录日志
- 继续处理后续文件
20.3 原子写入与半成品防护
每个文件的替换与恢复都必须采用原子提交策略。
执行要求如下:
- 正式输出文件
[B]、*.diff、*.bmp、[A']必须先写入临时文件 - 仅当当前文件的全部必需输出均成功生成且校验通过后,才允许提交为正式文件
- 若其中任一输出生成失败、校验失败或写入失败,则该文件整体视为失败
失败时必须满足:
- 不保留正式半成品
- 尽可能清理当前文件产生的临时文件
- 日志中必须标明清理结果
20.4 文件占用与外部变更防护
系统必须检测并处理以下场景:
- 原始文件被其他进程占用
- 替换后文件目标被占用
- 差异文件目标被占用
- 恢复文件目标被占用
- 文件在扫描后至处理前被删除、移动或替换
- 文件在处理过程中被外部修改
处理要求如下:
- 当前文件失败
- 记录明确错误原因
- 继续处理后续文件
20.5 资源与环境异常防护
系统必须防护以下异常:
- 磁盘空间不足
- 临时目录不可写
- 启动目录不可写
- 内存不足
- 图片渲染失败
- 非位图转位图失败
- 并发过高导致系统无响应
处理要求如下:
- 启动目录不可写时,视为运行环境不满足要求,阻止执行
- 临时目录不可写时,视为当前批次运行环境不满足要求,阻止当前批次执行
- 单文件处理中出现资源类异常时,当前文件失败并继续后续文件
- 系统应在并发处理时自动控制资源使用,优先保证界面可响应
20.6 并发与重复处理防护
并发处理时必须满足:
- 同一源文件不得重复入队
- 同一输出目标路径不得被多个任务同时占用
- 扫描结果必须去重
- 同一差异文件目标不得被多个任务同时生成
- 同一恢复输出目标不得被多个任务同时生成
系统应采用互斥或等效机制保证上述约束。
20.7 规则执行异常防护
除规则兼容性检查外,执行期还必须防护以下问题:
- 零长度匹配导致死循环
- 正则灾难性回溯导致长时间卡死
- 非法捕获组回填引用
- 单条规则在单文件中的异常高频命中
- 规则链式替换导致处理次数异常膨胀
处理要求如下:
- 系统应设置内部安全阈值和超时保护
- 触发保护时,当前文件失败
- 日志中必须记录触发的规则、原因和触发位置
20.8 对象级异常处理策略
以下对象在解析、替换或恢复过程中若任一对象处理失败:
- 文本框
- 形状
- 图表
- 公式
- 表格
- 图片
- 批注
- 页眉页脚中的对象
则默认处理策略为:
- 跳过当前对象
- 继续处理当前文件中的后续对象
- 日志中必须记录对象类型、Story、容器路径、位置、操作 ID 和失败原因
- 文件级全局校验、打开、写入、完整性或指纹错误仍按当前文件失败处理
说明:
- 该策略用于在不破坏当前文件整体处理的前提下保留可诊断信息;不得静默隐藏局部失败
20.9 字体环境异常防护
系统必须在执行前进行字体环境检查。
检查目标包括:
- 当前处理文件中使用的字体是否在目标机可用
- 缺失字体是否可能影响排版一致性
由于目标环境可能离线且不具备字体安装权限,当发现缺失字体时:
- 不得尝试联网下载、更新或安装字体
- 当前文件继续执行替换或恢复
- 中文及东亚文字默认使用
宋体兜底 - 英文、数字及拉丁文字默认使用
Times New Roman兜底 - 日志中必须记录缺失字体清单、兜底字体和影响说明
20.10 差异文件错配与恢复防护
恢复前必须校验以下信息:
- 替换后文件
[B]与差异文件[C]的指纹对应关系 - 差异文件的完整性校验值
- 差异文件的防篡改校验结果
- 差异文件所对应的规则文件指纹
- 差异文件所对应的程序版本和算法版本
当出现以下任一情况时:
- 指纹不匹配
- 校验失败
- 防篡改校验失败
- 关键版本信息不兼容
则:
- 必须拒绝恢复
- 不允许强制继续
- 日志中必须记录明确原因
20.11 停止、崩溃与中断恢复
用户点击停止时:
- 系统应尽量完成当前文件
- 当前文件结束后停止调度新的文件
- 尚未开始的文件标记为“已停止”
程序异常退出、系统崩溃或断电后:
- 下次启动时应自动检测上次遗留的临时文件
- 对可安全清理的临时文件自动清理
- 清理结果写入日志
对于无法安全判断是否可清理的遗留文件:
- 不得自动作为正式输出使用
- 必须提示用户并记录日志
20.12 配置与规则文件损坏防护
当 config.json 缺失时:
- 系统可按默认会话配置启动
- 首次保存配置时自动生成新的
config.json - 写入日志
当 config.json 损坏或无法解析时:
- 系统必须提示用户配置文件已损坏
- 在用户确认重建默认配置或修复原配置前,禁止启动替换、恢复和自动提取等执行型任务
- 不得按损坏配置继续执行
- 写入日志
当 *.rule 文件损坏、缺失或无法解析时:
- 不允许启动替换任务
- 必须提示用户重新加载或修复规则文件
- 写入日志
20.13 日志异常防护
当批处理开始前日志文件无法创建或无法打开时:
- 不允许启动批处理任务
- 必须提示用户运行环境不满足要求
当批处理过程中日志文件追加写入失败时:
- 系统应优先保证当前文件处理流程可控结束
- 后续日志至少应继续保留在界面日志中
- 当前批次在当前文件结束后不得继续调度新的文件
- 必须提示用户日志落盘失败
21. 非功能性要求摘要
- 静默处理,不显示 Word 打开界面
- UI 在长时间处理过程中保持可响应
- 启动目录必须可写
- 差异文件必须可校验
- 差异文件 JSON 默认加密
- BMP 差异文件不加密
- 还原必须严格匹配,不允许模糊恢复
22. 附录 A:规则文件 *.rule JSON 结构
22.1 顶层结构
规则文件采用 JSON 对象作为顶层结构,建议如下:
{
"format": "dcit-rule",
"version": "1.0",
"savedAt": "2026-04-24T20:15:30+08:00",
"generator": {
"appName": "DCIT",
"appVersion": "1.0.0"
},
"rules": []
}
顶层字段定义如下:
format- 类型:
string - 必填:是
- 固定值:
dcit-rule
- 类型:
version- 类型:
string - 必填:是
- 含义:规则文件结构版本
- 类型:
savedAt- 类型:
string - 必填:是
- 含义:规则文件保存时间,采用 ISO 8601 格式
- 类型:
generator- 类型:
object - 必填:否
- 含义:生成该规则文件的程序信息
- 类型:
rules- 类型:
array - 必填:是
- 含义:规则数组
- 类型:
22.2 规则数组执行语义
rules数组中的顺序即执行顺序- 保存时必须保持用户界面中的当前排序
- 加载后必须按文件中的数组顺序恢复到界面
22.3 单条规则对象结构
每条规则对象结构如下:
{
"id": "R001",
"name": "替换合同编号",
"enabled": true,
"matchMode": "plain",
"caseSensitive": false,
"wholeWord": false,
"pattern": "合同编号",
"replacement": "文件编号",
"note": "示例规则"
}
字段定义如下:
id- 类型:
string - 必填:是
- 要求:规则唯一标识,不可重复
- 类型:
name- 类型:
string - 必填:是
- 含义:规则名称
- 类型:
enabled- 类型:
boolean - 必填:是
- 含义:规则是否启用
- 类型:
matchMode- 类型:
string - 必填:是
- 可选值:
plainregex
- 类型:
caseSensitive- 类型:
boolean - 必填:是
- 默认值:
false
- 类型:
wholeWord- 类型:
boolean - 必填:是
- 默认值:
false
- 类型:
pattern- 类型:
string - 必填:是
- 含义:普通文本模式下的匹配文本,或正则模式下的表达式
- 类型:
replacement- 类型:
string - 必填:是
- 含义:替换文本或正则回填模板
- 类型:
note- 类型:
string - 必填:否
- 含义:备注
- 类型:
22.4 规则文件约束
- 不定义作用范围字段
- 不定义图片替换参数字段
- 图片替换策略采用全局固定策略
- 当
matchMode为regex时,pattern必须通过正则合法性检查 - 当正则语法非法时,不允许保存规则文件
22.5 规则文件示例
{
"format": "dcit-rule",
"version": "1.0",
"savedAt": "2026-04-24T20:15:30+08:00",
"generator": {
"appName": "DCIT",
"appVersion": "1.0.0"
},
"rules": [
{
"id": "R001",
"name": "替换合同编号",
"enabled": true,
"matchMode": "plain",
"caseSensitive": false,
"wholeWord": false,
"pattern": "合同编号",
"replacement": "文件编号",
"note": "普通文本规则"
},
{
"id": "R002",
"name": "替换日期",
"enabled": true,
"matchMode": "regex",
"caseSensitive": false,
"wholeWord": false,
"pattern": "(20\\d{2})-(\\d{2})-(\\d{2})",
"replacement": "$1/$2/$3",
"note": "支持捕获组回填"
}
]
}
23. 附录 B:差异文件 *.diff JSON 结构
23.1 总体结构
*.diff 文件采用 JSON 对象作为顶层结构。
当 JSON 差异文件不加密时,结构建议如下:
{
"format": "dcit-diff",
"version": "1.0",
"createdAt": "2026-04-24T20:30:00+08:00",
"encrypted": false,
"app": {},
"algorithm": {},
"sourceDocument": {},
"replacedDocument": {},
"ruleFile": {},
"integrity": {},
"payload": {}
}
当 JSON 差异文件加密时,顶层结构建议如下:
{
"format": "dcit-diff",
"version": "1.0",
"createdAt": "2026-04-24T20:30:00+08:00",
"encrypted": true,
"app": {},
"algorithm": {},
"sourceDocument": {},
"replacedDocument": {},
"ruleFile": {},
"integrity": {},
"encryption": {},
"payloadCiphertext": "Base64..."
}
说明:
payload表示明文差异数据载荷payloadCiphertext表示加密后的差异数据载荷- 两种模式下,
sourceDocument、replacedDocument、ruleFile、integrity的结构保持一致 *.bmp中承载的是逻辑等价的明文差异数据,不承载payloadCiphertext
23.2 顶层公共字段
format- 类型:
string - 必填:是
- 固定值:
dcit-diff
- 类型:
version- 类型:
string - 必填:是
- 含义:差异文件结构版本
- 类型:
createdAt- 类型:
string - 必填:是
- 含义:差异文件创建时间,采用 ISO 8601 格式
- 类型:
encrypted- 类型:
boolean - 必填:是
- 含义:当前
*.diff是否加密存储
- 类型:
app- 类型:
object - 必填:是
- 含义:程序信息
- 类型:
algorithm- 类型:
object - 必填:是
- 含义:差异算法与 BMP 编码算法版本信息
- 类型:
sourceDocument- 类型:
object - 必填:是
- 含义:原始文件
[A]的识别信息
- 类型:
replacedDocument- 类型:
object - 必填:是
- 含义:替换后文件
[B]的识别信息
- 类型:
ruleFile- 类型:
object - 必填:是
- 含义:规则文件识别信息
- 类型:
integrity- 类型:
object - 必填:是
- 含义:完整性校验与防篡改信息
- 类型:
23.3 程序与算法信息结构
app 对象建议结构如下:
{
"name": "DCIT",
"version": "1.0.0"
}
algorithm 对象建议结构如下:
{
"diffVersion": "1.0",
"bmpCodecVersion": "1.0"
}
23.4 文档识别信息结构
sourceDocument 与 replacedDocument 对象建议结构如下:
{
"fileName": "示例.docx",
"relativePath": "子目录/示例.docx",
"extension": ".docx",
"fingerprintAlgorithm": "SHA-256",
"fingerprint": "Base64..."
}
字段说明:
fileName- 含义:文件名
sourceDocument.fileName必须记录原始文件[A]的原始文件名replacedDocument.fileName必须记录实际生成的替换后文件[B]文件名,包括文件名规则替换和同名自增后的最终结果
relativePath- 含义:相对根目录路径
extension- 含义:原始扩展名
fingerprintAlgorithm- 含义:文件指纹算法
fingerprint- 含义:文件指纹值
ruleFile 对象建议结构如下:
{
"fileName": "default.rule",
"version": "1.0",
"fingerprintAlgorithm": "SHA-256",
"fingerprint": "Base64..."
}
23.5 完整性与防篡改结构
integrity 对象建议结构如下:
{
"hashAlgorithm": "SHA-256",
"payloadHash": "Base64...",
"tamperProtectionAlgorithm": "HMAC-SHA256",
"tamperProtectionValue": "Base64..."
}
字段要求如下:
payloadHash用于校验明文载荷的一致性tamperProtectionValue用于防篡改校验- 恢复前必须先校验
payloadHash与tamperProtectionValue
23.6 加密结构
当 encrypted = true 时,必须包含 encryption 对象和 payloadCiphertext 字段。
encryption 对象建议结构如下:
{
"algorithm": "implementation-defined",
"keyId": "default",
"nonce": "Base64...",
"tag": "Base64..."
}
字段说明:
algorithm- 含义:加密算法标识,具体实现可由程序定义
keyId- 含义:密钥标识
nonce- 含义:随机数或初始向量
tag- 含义:认证标签
payloadCiphertext- 含义:加密后的差异载荷,使用 Base64 编码
23.7 明文载荷 payload 结构
当 encrypted = false 时,payload 建议结构如下:
{
"statistics": {
"textReplaceCount": 0,
"imageReplaceCount": 0
},
"operations": []
}
字段要求如下:
statistics- 含义:统计信息
operations- 类型:
array - 含义:按实际执行顺序记录的替换操作列表
- 当文件名发生变化时,必须包含一条文件名变更操作:
type = "fileName",objectType = "documentFileName",originalText为原始文件名,writtenText为实际替换后文件名
- 类型:
23.8 位置对象结构
所有操作对象都必须包含 position 字段。
position 对象建议结构如下:
{
"storyType": "main",
"containerPath": "/body/table[0]/row[1]/cell[2]",
"paragraphIndex": 3,
"startRunIndex": 1,
"startCharOffset": 4,
"endRunIndex": 2,
"endCharOffset": 7,
"objectIndex": null
}
字段说明:
storyType- 类型:
string - 示例值:
mainheaderfootercommenttextboxshapechartequation
- 类型:
containerPath- 类型:
string - 含义:逻辑容器路径
- 类型:
paragraphIndex- 类型:
integer - 含义:容器内段落索引
- 类型:
startRunIndex- 类型:
integer - 含义:起始 Run 索引
- 类型:
startCharOffset- 类型:
integer - 含义:起始字符偏移
- 类型:
endRunIndex- 类型:
integer - 含义:结束 Run 索引
- 类型:
endCharOffset- 类型:
integer - 含义:结束字符偏移
- 类型:
objectIndex- 类型:
integer | null - 含义:非文本对象或同容器内对象索引
- 类型:
23.9 文本替换操作对象结构
文本替换操作对象建议结构如下:
{
"operationId": "T000001",
"type": "text",
"objectType": "paragraph",
"position": {},
"rule": {
"id": "R001",
"name": "替换合同编号",
"matchMode": "plain",
"pattern": "合同编号",
"hitIndex": 1
},
"originalText": "合同编号",
"replacementTemplateResult": "文件编号",
"writtenText": "文件编号 ",
"displayWidthOriginal": 8,
"displayWidthWritten": 8,
"truncated": false,
"paddingApplied": true
}
字段说明:
operationId- 类型:
string - 含义:操作唯一标识
- 类型:
type- 类型:
string - 固定值:
text
- 类型:
objectType- 类型:
string - 示例值:
paragraphtableCelltextboxcommenthyperlinkDisplayfieldResultequationTextchartText
- 类型:
rule- 类型:
object - 含义:命中的规则信息
- 类型:
originalText- 类型:
string - 含义:替换前文本
- 类型:
replacementTemplateResult- 类型:
string - 含义:规则替换模板展开后的结果,尚未进行截断或补齐
- 类型:
writtenText- 类型:
string - 含义:实际写入
[B]的文本
- 类型:
displayWidthOriginal- 类型:
integer - 含义:原文本显示宽度
- 类型:
displayWidthWritten- 类型:
integer - 含义:写入文本显示宽度
- 类型:
truncated- 类型:
boolean - 含义:是否发生截断
- 类型:
paddingApplied- 类型:
boolean - 含义:是否发生补齐
- 类型:
23.10 图像替换操作对象结构
图像替换操作对象建议结构如下:
{
"operationId": "I000001",
"type": "image",
"objectType": "inlineImage",
"position": {},
"sourceKind": "bitmap",
"originalImage": {
"format": "png",
"widthPx": 800,
"heightPx": 600,
"data": "Base64..."
},
"convertedBitmapImage": null,
"newImage": {
"format": "png",
"widthPx": 800,
"heightPx": 600,
"data": "Base64..."
},
"seed": 123456789,
"noiseSummary": {
"modifiedPixelRatio": 0.53
},
"layout": {
"displayWidthEmu": 3657600,
"displayHeightEmu": 2743200,
"wrapMode": "inline",
"rotationDegree": 0
}
}
字段说明:
type- 固定值:
image
- 固定值:
objectType- 示例值:
inlineImagefloatingImageheaderImagetextboxImageshapeImage
- 示例值:
sourceKind- 可选值:
bitmapconvertedFromVector
- 可选值:
originalImage- 含义:原始图像数据
convertedBitmapImage- 含义:当原对象为非位图时,记录转换后的位图数据;位图源对象时为
null
- 含义:当原对象为非位图时,记录转换后的位图数据;位图源对象时为
newImage- 含义:替换后图像数据
seed- 含义:用于生成噪声的随机种子
noiseSummary.modifiedPixelRatio- 含义:修改像素比例,必须大于等于
0.5
- 含义:修改像素比例,必须大于等于
layout- 含义:用于校验图像占位与布局属性未变化
23.11 payload 示例
{
"statistics": {
"textReplaceCount": 1,
"imageReplaceCount": 1
},
"operations": [
{
"operationId": "T000001",
"type": "text",
"objectType": "paragraph",
"position": {
"storyType": "main",
"containerPath": "/body",
"paragraphIndex": 0,
"startRunIndex": 0,
"startCharOffset": 0,
"endRunIndex": 0,
"endCharOffset": 4,
"objectIndex": null
},
"rule": {
"id": "R001",
"name": "替换合同编号",
"matchMode": "plain",
"pattern": "合同编号",
"hitIndex": 1
},
"originalText": "合同编号",
"replacementTemplateResult": "文件编号",
"writtenText": "文件编号",
"displayWidthOriginal": 8,
"displayWidthWritten": 8,
"truncated": false,
"paddingApplied": false
},
{
"operationId": "I000001",
"type": "image",
"objectType": "inlineImage",
"position": {
"storyType": "main",
"containerPath": "/body",
"paragraphIndex": 2,
"startRunIndex": 0,
"startCharOffset": 0,
"endRunIndex": 0,
"endCharOffset": 0,
"objectIndex": 0
},
"sourceKind": "bitmap",
"originalImage": {
"format": "png",
"widthPx": 800,
"heightPx": 600,
"data": "Base64..."
},
"convertedBitmapImage": null,
"newImage": {
"format": "png",
"widthPx": 800,
"heightPx": 600,
"data": "Base64..."
},
"seed": 123456789,
"noiseSummary": {
"modifiedPixelRatio": 0.53
},
"layout": {
"displayWidthEmu": 3657600,
"displayHeightEmu": 2743200,
"wrapMode": "inline",
"rotationDegree": 0
}
}
]
}
24. 附录 C:会话配置文件 config.json 结构
24.1 总体结构
config.json 采用 JSON 对象作为顶层结构,建议如下:
{
"format": "dcit-config",
"version": "1.0",
"savedAt": "2026-04-24T21:00:00+08:00",
"settings": {
"ruleFilePath": "D:\\rules\\default.rule",
"jsonDiffEncryption": true,
"autoExtract": {
"enabledTypes": {
"keyword": true,
"highFrequencyWord": true,
"highFrequencySentence": true
},
"keywordAlgorithms": ["frequency", "tfIdf", "textRank"],
"maxKeywordCount": 10,
"maxHighFrequencyWordCount": 10,
"maxHighFrequencySentenceCount": 10,
"wordStatisticsOptions": {
"chineseToken": true,
"englishWord": true
},
"sentenceStatisticsOptions": {
"chineseSentence": true,
"englishSentence": true
},
"minChineseTokenLength": 1,
"minEnglishWordLength": 1,
"sentenceDelimiters": ["。", "!", "?", ".", "!", "?", ";", ";"],
"excludeEmailAddress": false
}
},
"replacePage": {
"sourceFolder": "D:\\input",
"replaceFolder": "D:\\output_replace"
},
"restorePage": {
"replaceFolder": "D:\\output_replace",
"restoreFolder": "D:\\output_restore"
}
}
24.2 顶层字段定义
format- 类型:
string - 必填:是
- 固定值:
dcit-config
- 类型:
version- 类型:
string - 必填:是
- 含义:配置文件结构版本
- 类型:
savedAt- 类型:
string - 必填:是
- 含义:配置保存时间,采用 ISO 8601 格式
- 类型:
settings- 类型:
object - 必填:是
- 含义:全局设置
- 类型:
replacePage- 类型:
object - 必填:是
- 含义:替换页面会话信息
- 类型:
restorePage- 类型:
object - 必填:是
- 含义:恢复页面会话信息
- 类型:
24.3 settings 对象结构
settings 对象建议结构如下:
{
"ruleFilePath": "D:\\rules\\default.rule",
"jsonDiffEncryption": true,
"autoExtract": {
"enabledTypes": {
"keyword": true,
"highFrequencyWord": true,
"highFrequencySentence": true
},
"keywordAlgorithms": ["frequency", "tfIdf", "textRank"],
"maxKeywordCount": 10,
"maxHighFrequencyWordCount": 10,
"maxHighFrequencySentenceCount": 10,
"wordStatisticsOptions": {
"chineseToken": true,
"englishWord": true
},
"sentenceStatisticsOptions": {
"chineseSentence": true,
"englishSentence": true
},
"minChineseTokenLength": 1,
"minEnglishWordLength": 1,
"sentenceDelimiters": [
"。",
"!",
"?",
".",
"!",
"?",
";",
";"
],
"excludeEmailAddress": false
}
}
字段定义如下:
ruleFilePath- 类型:
string - 必填:否
- 含义:当前规则文件的绝对路径
- 类型:
jsonDiffEncryption- 类型:
boolean - 必填:是
- 含义:是否默认对
*.diff采用加密存储
- 类型:
autoExtract- 类型:
object - 必填:否
- 含义:自动提取相关会话设置
- 类型:
autoExtract 对象字段定义如下:
enabledTypes- 类型:
object - 必填:是
- 含义:自动提取类别开关
- 类型:
keywordAlgorithms- 类型:
array - 必填:是
- 默认值:
["frequency", "tfIdf", "textRank"] - 允许值:
frequency、tfIdf、textRank - 含义:关键字提取算法集合,按配置顺序轮询执行
- 类型:
maxKeywordCount- 类型:
integer - 必填:是
- 默认值:
10
- 类型:
maxHighFrequencyWordCount- 类型:
integer - 必填:是
- 默认值:
10
- 类型:
maxHighFrequencySentenceCount- 类型:
integer - 必填:是
- 默认值:
10
- 类型:
wordStatisticsOptions- 类型:
object - 必填:是
- 含义:高频词统计选项
- 类型:
sentenceStatisticsOptions- 类型:
object - 必填:是
- 含义:高频句统计选项
- 类型:
minChineseTokenLength- 类型:
integer - 必填:是
- 默认值:
1
- 类型:
minEnglishWordLength- 类型:
integer - 必填:是
- 默认值:
1
- 类型:
sentenceDelimiters- 类型:
array - 必填:是
- 含义:句子分隔符列表
- 类型:
excludeEmailAddress- 类型:
boolean - 必填:是
- 默认值:
false - 含义:是否在自动提取中排除邮箱地址
- 类型:
24.4 replacePage 对象结构
replacePage 对象建议结构如下:
{
"sourceFolder": "D:\\input",
"replaceFolder": "D:\\output_replace"
}
字段定义如下:
sourceFolder- 类型:
string - 必填:否
- 含义:替换页面当前原始文件夹绝对路径
- 类型:
replaceFolder- 类型:
string - 必填:否
- 含义:替换页面当前替换文件夹绝对路径
- 类型:
24.5 restorePage 对象结构
restorePage 对象建议结构如下:
{
"replaceFolder": "D:\\output_replace",
"restoreFolder": "D:\\output_restore"
}
字段定义如下:
replaceFolder- 类型:
string - 必填:否
- 含义:恢复页面当前替换文件夹绝对路径
- 类型:
restoreFolder- 类型:
string - 必填:否
- 含义:恢复页面当前恢复文件夹绝对路径
- 类型:
24.6 配置文件保存与加载约束
config.json必须使用 UTF-8 编码- 所有路径字段均采用绝对路径
- 缺失字段按默认值处理
- 文件缺失时,系统可按默认会话配置启动,并在首次保存时生成
- 文件损坏或无法解析时,系统必须提示用户并阻止执行型任务,直到用户确认重建默认配置或修复原配置文件
25. 附录 D:日志格式与日志样例
25.1 日志文件基本要求
日志文件采用纯文本格式:
- 编码:UTF-8
- 行结束符:CRLF
- 按天追加写入
- 保存于启动目录
25.2 单行日志格式
建议单行日志采用如下格式:
[<LEVEL>] <yyyyMMdd:HHmmss.fff> [<EVENT_CODE>] [Job=<JOB_ID>] [File="<ABS_PATH>"] [Rule=<RULE_ID>] <MESSAGE>
字段说明如下:
<LEVEL>- 可选值:
INFO、WARNING、ERROR
- 可选值:
<yyyyMMdd:HHmmss.fff>- 含义:本地时间戳,精确到毫秒
<EVENT_CODE>- 含义:事件编码
[Job=<JOB_ID>]- 可选字段
- 含义:批处理任务或文件任务标识
[File="<ABS_PATH>"]- 可选字段
- 含义:相关文件绝对路径
[Rule=<RULE_ID>]- 可选字段
- 含义:相关规则 ID
<MESSAGE>- 含义:日志正文
25.3 事件编码建议
日志事件编码至少建议包含:
APP_STARTAPP_EXITCONFIG_LOADCONFIG_SAVERULE_LOADRULE_SAVERULE_CHECK_OKRULE_CHECK_WARNRULE_CHECK_ERROREXTRACT_STARTEXTRACT_PREVIEWEXTRACT_APPENDEXTRACT_UNDOEXTRACT_CANCELEXTRACT_EMPTYEXTRACT_DONEEXTRACT_SKIPSCAN_STARTSCAN_DONEFILE_STARTTEXT_MATCHTEXT_WRITEIMAGE_REPLACEDIFF_WRITEBMP_WRITERESTORE_STARTRESTORE_APPLYFILE_SUCCESSFILE_FAILFILE_STOPPEDSUMMARYSTACK
25.4 异常堆栈记录格式
当需要记录异常堆栈时:
- 先输出一条主错误日志
- 再按堆栈行逐行输出
STACK事件
示例:
[ERROR] 20260424:210512.314 [FILE_FAIL] [Job=J0008] [File="D:\input\a.docx"] 文件处理失败:无法写入差异文件
[ERROR] 20260424:210512.315 [STACK] [Job=J0008] IOException: access denied
[ERROR] 20260424:210512.316 [STACK] [Job=J0008] at DiffWriter.Commit(...)
25.5 日志样例
普通启动样例:
[INFO] 20260424:210000.102 [APP_START] 程序启动
[INFO] 20260424:210000.130 [CONFIG_LOAD] 配置加载成功
[INFO] 20260424:210001.004 [RULE_LOAD] [File="D:\rules\default.rule"] 规则文件加载成功,共 12 条规则
扫描样例:
[INFO] 20260424:210005.217 [SCAN_START] [File="D:\input"] 开始扫描目录
[INFO] 20260424:210006.884 [SCAN_DONE] [File="D:\input"] 扫描完成,共发现 36 个文件
文字匹配样例:
[INFO] 20260424:210015.011 [FILE_START] [Job=J0001] [File="D:\input\sample.docx"] 开始处理文件
[INFO] 20260424:210015.428 [TEXT_MATCH] [Job=J0001] [File="D:\input\sample.docx"] [Rule=R001] 命中位置=/body p=0 start=(0,0) end=(0,4) 原文="合同编号"
[INFO] 20260424:210015.431 [TEXT_WRITE] [Job=J0001] [File="D:\input\sample.docx"] [Rule=R001] 写入文本="文件编号"
图片替换样例:
[INFO] 20260424:210016.223 [IMAGE_REPLACE] [Job=J0001] [File="D:\input\sample.docx"] 对象=/body p=2 obj=0 seed=123456789 modifiedPixelRatio=0.53
规则检查警告样例:
[WARNING] 20260424:210020.044 [RULE_CHECK_WARN] [Rule=R008] 规则可能与后续规则重叠命中,允许用户确认后继续
批处理汇总样例:
[INFO] 20260424:210530.992 [SUMMARY] 成功=34 失败=2 跳过=0 文本替换=1280 图片替换=96 文本恢复=0 图片恢复=0
26. 附录 E:BMP 差异文件编码规则
26.1 目标
本附录定义如何将逻辑等价的明文差异数据无损编码为 *.bmp 文件,并确保能够从 *.bmp 无损恢复出逻辑等价的 JSON 差异数据。
26.2 编码输入
BMP 编码输入为“逻辑等价的明文差异数据”。
具体要求如下:
- 若当前
*.diff文件为未加密形式,则以其规范化 JSON 结构作为输入 - 若当前
*.diff文件为加密形式,则在内存中使用等价的明文差异数据作为输入 *.bmp不承载payloadCiphertext*.bmp不提供保密性,仅提供可逆承载能力
26.3 规范化 JSON 串行化规则
在编码为 BMP 之前,必须先将差异数据序列化为规范化 JSON 字节流。
规范化规则如下:
- 编码为 UTF-8
- 不写入 BOM
- 对象字段按本 SRS 定义顺序输出
- 数组元素顺序保持原始执行顺序
- 不输出无意义空白
- 字符串按 JSON 标准转义
说明:
- 只要解码后得到的差异数据在结构和语义上与原始差异数据等价,即视为满足要求
26.4 二进制封装结构
规范化 JSON 字节流在映射到像素前,必须先封装为二进制载荷。
二进制封装结构定义如下:
Magic- 长度:8 字节
- 固定 ASCII 内容:
DCITBMP1
HeaderVersion- 长度:2 字节
- 类型:无符号整数,小端序
- 固定值:
1
Flags- 长度:2 字节
- 类型:无符号整数,小端序
- 当前固定值:
0
PayloadLength- 长度:8 字节
- 类型:无符号整数,小端序
- 含义:规范化 JSON 字节流长度
PayloadSha256- 长度:32 字节
- 含义:规范化 JSON 字节流的 SHA-256 值
PayloadBytes- 长度:
PayloadLength - 含义:规范化 JSON 字节流本体
- 长度:
封装后的字节流记为 BlobBytes。
26.5 像素映射规则
BlobBytes 必须映射为 8 位灰度 BMP 图像。
映射规则如下:
- BMP 使用 8 位灰度色板
- 色板中第
i个颜色的 RGB 值必须为(i, i, i),其中i取值范围为0..255 BlobBytes中每个字节值直接映射为一个像素灰度值- 映射顺序为按行优先,从左到右、从上到下
26.6 图像宽高计算规则
为保证编码确定性,BMP 宽高采用如下固定规则:
width = 1024height = ceil(length(BlobBytes) / 1024)
若 length(BlobBytes) = 0,则:
width = 1024height = 1
26.7 尾部填充规则
若最后一个像素行未被 BlobBytes 填满,则:
- 剩余像素全部填充为灰度值
0
说明:
- 这些尾部填充值不属于逻辑载荷
- 解码时必须依据
PayloadLength精确截取有效数据
26.8 BMP 行对齐说明
BMP 文件行对齐所引入的字节填充属于 BMP 文件格式自身要求。
该部分:
- 不属于逻辑差异数据
- 解码时必须忽略 BMP 行对齐填充,仅按像素值恢复
BlobBytes
26.9 解码规则
从 *.bmp 恢复差异数据时,解码流程如下:
- 读取 BMP 像素数据
- 按行优先顺序恢复灰度字节流
- 读取并校验
Magic - 读取
HeaderVersion - 读取
Flags - 读取
PayloadLength - 读取
PayloadSha256 - 按
PayloadLength截取PayloadBytes - 校验
PayloadSha256 - 将
PayloadBytes按 UTF-8 解析为规范化 JSON - 反序列化为逻辑等价的差异数据对象
若任一步失败,则:
- 必须判定该
*.bmp文件无效 - 必须拒绝恢复
- 必须写入日志
26.10 *.bmp 转 *.diff 输出规则
当系统需要根据 *.bmp 生成等价 *.diff 文件时:
- 输出内容应为规范化后的明文 JSON 差异数据
- 输出编码为 UTF-8
- 不写入 BOM
- 输出结构必须满足本 SRS 第 23 章定义
26.11 BMP 编码示意
编码过程示意如下:
Diff Object
-> Canonical JSON UTF-8 Bytes
-> BlobBytes(Magic + Header + Payload)
-> 8-bit Grayscale Pixel Stream
-> BMP File
解码过程示意如下:
BMP File
-> 8-bit Grayscale Pixel Stream
-> BlobBytes
-> Canonical JSON UTF-8 Bytes
-> Diff Object
27. 附录 F:测试用例矩阵
27.1 目的与使用方式
本附录给出本项目的最小可执行测试用例矩阵,用于指导:
- 开发阶段联调验证
- 系统测试与回归测试
- 标准验收样例集执行
- 交付前功能覆盖检查
说明如下:
级别=必测表示应纳入正式测试与交付前回归级别=建议表示建议覆盖,但不作为单独阻断项- 若单个用例涉及多个对象类型,则应分别在
*.docx与*.doc上至少各验证一组样例 - 所有涉及“恢复一致性”的用例,均应同时检查文本一致、对象一致性约束和日志记录完整性
27.2 核心替换功能测试矩阵
| 用例 ID | 级别 | 测试目标 | 输入或前置条件 | 预期结果 |
|---|---|---|---|---|
| TC-RPL-001 | 必测 | 正文普通文本替换 | *.docx 正文含普通段落文本,配置普通文本规则 |
成功命中并替换,生成 [B]、*.diff、*.bmp,日志记录命中次数 |
| TC-RPL-002 | 必测 | *.doc 基本文本替换 |
*.doc 文档含普通段落文本,配置普通文本规则 |
成功完成替换,输出文件可打开,日志无未处理异常 |
| TC-RPL-003 | 必测 | 页眉文本替换 | 页眉内含普通文本 | 页眉文本成功替换,恢复后与原文一致 |
| TC-RPL-004 | 必测 | 页眉表格替换 | 页眉中含表格及单元格文字 | 表格内文字成功替换,表格结构保持不变 |
| TC-RPL-005 | 必测 | 文本框文字替换 | 正文和页眉中均含文本框文字 | 文本框内文字成功替换,文本框位置和尺寸不变 |
| TC-RPL-006 | 必测 | 合并单元格表格替换 | 表格存在横向或纵向合并单元格 | 合并单元格结构保持不变,允许跨 Run 匹配,不允许跨单元格匹配 |
| TC-RPL-007 | 必测 | 批注内容替换 | 文档存在批注文本 | 仅批注内容变化,作者、时间、状态保持不变 |
| TC-RPL-008 | 必测 | 超链接显示文字替换 | 文档含超链接 | 仅显示文字发生替换,目标 URL 保持不变 |
| TC-RPL-009 | 必测 | 目录项相关文本替换 | 文档含目录及其源标题文本 | 替换完成后自动更新目录,目录显示结果与正文一致 |
| TC-RPL-010 | 必测 | 域结果替换 | 文档含域结果显示文本 | 仅域结果参与替换,域代码不修改 |
| TC-RPL-011 | 必测 | 公式内文字替换 | 文档含可解析公式对象 | 公式中可解析文字成功替换,排版不明显异常 |
| TC-RPL-012 | 必测 | 图表文本替换 | 图表含标题、轴标题、图例、数据标签、数据表 | 所有已定义范围的图表文本均参与替换 |
| TC-RPL-013 | 必测 | 嵌入式位图替换 | 文档含 PNG、JPG、BMP、TIFF、GIF 等位图 | 图片完成噪声替换,尺寸、位置、环绕、锚点、裁剪、旋转保持不变 |
| TC-RPL-014 | 必测 | 浮动图片替换 | 文档含浮动位图图片 | 浮动属性保持不变,图片成功替换 |
| TC-RPL-015 | 必测 | 非位图对象图片替换 | 文档含 WMF、EMF、SVG、Office 形状或等价非位图对象 | 成功转换后按图片策略替换,并在恢复后达到视觉一致 |
| TC-RPL-016 | 必测 | 规则顺序执行 | 两条规则前后存在依赖关系 | 严格按列表顺序执行,后一条允许命中前一条替换结果 |
| TC-RPL-017 | 必测 | 区分大小写开关 | 同一原文大小写混合,规则开启或关闭大小写敏感 | 开启时仅命中大小写完全一致项,关闭时大小写无关命中 |
| TC-RPL-018 | 必测 | 全字匹配开关 | 规则原文为词边界敏感内容 | 开启时仅全字命中,关闭时允许部分命中 |
| TC-RPL-019 | 必测 | 正则捕获组回填 | 配置包含捕获组和替换模板的规则 | 正则命中成功,替换结果符合回填模板 |
| TC-RPL-020 | 必测 | 跨 Run 匹配 |
同一段落内视觉连续文本被拆成多个 Run |
应成功命中并替换 |
| TC-RPL-021 | 必测 | 不跨段落匹配 | 目标文本被分布在两个段落 | 不应命中,日志中不产生错误 |
| TC-RPL-022 | 必测 | 不跨单元格匹配 | 目标文本分布在两个不同单元格 | 不应命中,表格结构保持不变 |
| TC-RPL-023 | 必测 | 过长替换文本截断 | 新文本显示宽度大于原文本允许宽度 | 应按规则截断,且尽量保持版式不变 |
| TC-RPL-024 | 必测 | 过短替换文本补齐 | 新文本显示宽度小于原文本 | 应采用可逆方式补齐,恢复后可完全回到原文本 |
| TC-RPL-025 | 必测 | 页脚文本替换 | 页脚内含普通文本 | 页脚文本成功替换,恢复后与原文一致 |
| TC-RPL-026 | 必测 | 页脚表格替换 | 页脚中含表格及单元格文字 | 表格内文字成功替换,页脚表格结构保持不变 |
| TC-RPL-027 | 必测 | 页脚文本框替换 | 页脚中含文本框文字 | 文本框内文字成功替换,文本框位置和尺寸保持不变 |
| TC-RPL-028 | 必测 | 页眉页脚图片替换 | 页眉或页脚中含嵌入式或浮动图片 | 图片成功替换,尺寸、位置、环绕和锚点保持不变 |
| TC-RPL-029 | 必测 | 图片随机噪声默认变化 | 相同输入、未设置固定随机种子时执行两次替换 | 两次图片替换结果应存在噪声差异,且均可成功恢复 |
| TC-RPL-030 | 必测 | 固定随机种子可复现 | 对同一输入设置相同固定随机种子重复替换 | 图片替换结果保持一致,且恢复结果一致 |
| TC-RPL-031 | 必测 | 替换输出目录结构一致性 | 原始文件夹包含多级子目录并执行替换 | 替换后文件、*.diff、*.bmp 均保留相对目录树结构 |
| TC-RPL-032 | 必测 | 替换输出重名自动重命名 | 替换输出目录已存在同名目标文件 | 新输出采用自增序号重命名,不覆盖既有文件;同一源文件的替换文档、*.diff、*.bmp 自增序号一致 |
| TC-RPL-033 | 必测 | 文件名参与规则替换 | 原始文件名命中启用规则,正文可无命中 | 替换后文件、*.diff、*.bmp 均使用规则替换后的文件基本名加日期后缀保存;差异元数据和 payload.operations 均记录文件名变更 |
| TC-RPL-034 | 必测 | 文件名替换非法结果防护 | 文件名规则替换结果为空或包含非法文件名字符 | 系统阻断当前扫描/执行,日志记录源文件、替换后文件名结果和错误原因 |
| TC-RPL-035 | 必测 | 文件名变更修改记录 | 文件名因规则、日期后缀或同名自增导致最终输出名与原始文件名不同 | 差异文件 payload.operations 包含 type=fileName、objectType=documentFileName 的记录,原始文件名和实际替换后文件名准确 |
27.3 恢复与一致性测试矩阵
| 用例 ID | 级别 | 测试目标 | 输入或前置条件 | 预期结果 |
|---|---|---|---|---|
| TC-RST-001 | 必测 | 从 *.diff 恢复文本 |
使用替换输出的 [B] + *.diff |
成功恢复出 [A'],文本内容与原始 [A] 完全一致 |
| TC-RST-002 | 必测 | 从 *.bmp 恢复文本 |
使用替换输出的 [B] + *.bmp |
先解码为等价差异数据,再恢复成功 |
| TC-RST-003 | 必测 | 文本与图片同时恢复 | 文档同时包含文本替换和图片替换 | 文本和图片均恢复成功 |
| TC-RST-004 | 必测 | 严格位置匹配恢复 | 差异文件中的位置与当前文档严格一致 | 正常恢复,不启用容错查找 |
| TC-RST-005 | 必测 | 位置不匹配恢复失败 | 人工修改 [B] 后再执行恢复 |
恢复被拒绝,日志明确给出失败原因 |
| TC-RST-006 | 必测 | 目录自动更新 | 恢复后文档含目录 | 恢复完成后自动更新目录显示结果 |
| TC-RST-007 | 必测 | 交叉引用错误验证 | 恢复后文档显示结果中存在“错误!未找到引用源”或等价域错误文本 | 恢复输出被拒绝,日志记录 Story、容器、段落和上下文片段 |
| TC-RST-008 | 必测 | 编号段落一致性 | 原文包含多级编号列表 | 恢复后编号值、级别、缩进、制表位、自动编号行为均一致 |
| TC-RST-009 | 必测 | 表格与文本框一致性 | 原文含表格、页眉表格、文本框 | 恢复后结构、位置、内容与原文一致 |
| TC-RST-010 | 必测 | 图片视觉一致性 | 原文含位图和非位图对象 | 恢复后应满足肉眼一致、尺寸与位置一致,并满足像素相似度阈值要求 |
| TC-RST-011 | 必测 | 路径结构一致性 | 目录批处理替换后执行恢复 | 恢复输出目录保留原目录树结构 |
| TC-RST-012 | 必测 | 重名自动重命名 | 目标恢复目录已有同名输出 | 新输出采用自增序号重命名,不覆盖原文件 |
| TC-RST-013 | 建议 | 多轮替换后恢复验证 | 同一文件多次独立处理,存在多个版本输出 | 每组 [B] + C 仅对应恢复其本轮结果,不得串用 |
| TC-RST-014 | 必测 | 单批次差异文件格式不混用 | 同一恢复批次同时勾选 *.diff 和 *.bmp 两类输入 |
系统拒绝混合执行,提示用户单次批处理仅允许一种差异文件格式 |
| TC-RST-015 | 必测 | 规则文件指纹错配恢复失败 | [B] 与差异文件匹配,但差异文件中的规则文件指纹与当前恢复上下文不一致 |
恢复被拒绝,日志明确记录规则文件指纹错配 |
| TC-RST-016 | 必测 | 程序或算法版本不兼容恢复失败 | 差异文件中的程序版本或算法版本与当前程序不兼容 | 恢复被拒绝,日志明确记录版本不兼容原因 |
| TC-RST-017 | 必测 | 恢复原始文件名 | 原始文件名经规则替换后生成 [B],差异文件记录 sourceDocument.fileName |
恢复输出使用原始文件名和原始扩展名;若同名冲突则自动追加自增序号 |
27.4 规则文件与差异文件测试矩阵
| 用例 ID | 级别 | 测试目标 | 输入或前置条件 | 预期结果 |
|---|---|---|---|---|
| TC-RULE-001 | 必测 | 打开规则文件 | 使用合法 *.rule 文件 |
成功加载全部规则,顺序与文件内一致 |
| TC-RULE-002 | 必测 | 保存规则文件 | 编辑后保存 *.rule |
成功保存为 UTF-8 JSON,内容满足附录 A 定义 |
| TC-RULE-003 | 必测 | 非法正则禁止保存 | 规则中包含非法正则表达式 | 保存失败,弹窗提示,日志能定位规则位置和详细错误 |
| TC-RULE-004 | 必测 | 规则兼容性检查告警 | 存在重叠命中或重复命中风险 | 弹窗提示并写日志,允许用户继续 |
| TC-RULE-005 | 必测 | 规则兼容性检查阻断 | 存在无法解析或必然错误规则 | 禁止保存或禁止执行,并写日志 |
| TC-RULE-006 | 必测 | 差异文件 JSON 明文保存 | 会话配置为 jsonDiffEncryption=false |
输出明文 *.diff,结构符合附录 B |
| TC-RULE-007 | 必测 | 差异文件 JSON 加密保存 | 会话配置为 jsonDiffEncryption=true |
输出加密 *.diff,恢复时可正确解密 |
| TC-RULE-008 | 必测 | BMP 与 JSON 等价性 | 同一替换结果同时生成 *.diff 与 *.bmp |
*.bmp 可无损还原出逻辑等价的明文差异数据 |
| TC-RULE-009 | 必测 | 差异文件完整性校验 | 人工篡改 *.diff 或 *.bmp |
校验失败,拒绝恢复,不允许强制继续 |
| TC-RULE-010 | 必测 | 指纹错配阻断 | 使用不匹配的 [B]、规则文件或差异文件组合 |
恢复失败,日志标明错配类型 |
| TC-RULE-011 | 必测 | 自动提取预览流程 | 在替换页面勾选一个或多个文件并点击自动提取 | 基于全部勾选文件生成关键字、高频词、高频句候选结果并展示预览,不直接写入规则列表 |
| TC-RULE-012 | 必测 | 自动提取选择性追加 | 在预览中仅勾选部分候选项 | 仅被勾选的候选项被追加为规则 |
| TC-RULE-013 | 必测 | 自动提取规则默认属性 | 执行自动提取并追加后检查新增规则字段 | 新增规则默认满足“启用=是、普通文本、区分大小写=是、全字匹配=是、原文本=提取结果、新文本为空字符串”,且系统不因新文本为空而自动禁用规则 |
| TC-RULE-014 | 必测 | 自动提取去重 | 当前规则列表中已存在相同原文本规则,再次执行自动提取 | 不重复追加,弹窗和日志给出跳过数量 |
| TC-RULE-015 | 必测 | 自动提取不覆盖人工规则 | 自动提取结果与人工规则原文本相同 | 自动提取结果被丢弃,人工规则保持不变 |
| TC-RULE-016 | 必测 | 自动提取命名与备注 | 执行自动提取并追加后检查新增规则的 ID、名称、备注 | ID 前缀、名称格式和备注内容满足 SRS 要求 |
| TC-RULE-017 | 必测 | 自动提取空结果提示 | 文档无有效候选项 | 弹窗提示“未提取到可用项”,不修改规则列表 |
| TC-RULE-018 | 必测 | 自动提取撤销 | 完成一次自动提取追加后执行撤销 | 最近一次自动提取新增的规则被整体回退 |
| TC-RULE-019 | 必测 | 自动提取关键字算法轮询 | 关键字算法同时勾选按词频、TF-IDF、TextRank |
系统按配置顺序对勾选文件范围各执行一轮,并对结果去重合并后进入预览 |
| TC-RULE-020 | 必测 | 自动提取邮箱与单字默认纳入 | 使用包含邮箱地址、单字、单词的勾选文件集合执行自动提取 | 邮箱地址参与提取,单字和单词按最小长度设置纳入统计 |
| TC-RULE-021 | 必测 | 执行前规则兼容性复检 | 规则文件已成功保存后,执行前再引入兼容性风险条件 | 启动执行前再次触发规则兼容性检查,弹窗和日志同时给出结果 |
| TC-RULE-022 | 必测 | 自动提取多文件跨文档去重 | 多个勾选文件中存在相同候选原文本 | 预览和追加结果中仅保留一条规则,并保留首次出现文档路径和顺序 |
| TC-RULE-023 | 必测 | 自动提取仅写入会话内存直到保存 | 自动提取追加规则后不执行保存规则文件,直接关闭或重新加载 | 内存规则变化不写入 *.rule 文件,原规则文件内容保持不变 |
| TC-RULE-024 | 必测 | 自动提取追加前后双阶段检查 | 自动提取结果中包含重复项和追加后才暴露的兼容性问题 | 追加前执行快速去重和冲突检查,追加后执行完整合法性和兼容性检查 |
| TC-RULE-025 | 必测 | BMP 文件命名与输出位置 | 执行替换并生成差异文件 | *.bmp 与 *.diff 同名同目录生成 |
| TC-RULE-026 | 必测 | 自动提取范围以勾选集为准 | 文件列表高亮选择与复选框勾选集合不一致 | 自动提取仅扫描勾选文件,高亮选中状态不影响结果 |
27.5 异常与防护测试矩阵
| 用例 ID | 级别 | 测试目标 | 输入或前置条件 | 预期结果 |
|---|---|---|---|---|
| TC-EXC-001 | 必测 | 不支持加密文档 | 输入为加密文档 | 当前文件失败并记录错误,后续文件继续 |
| TC-EXC-002 | 必测 | 不支持受保护文档 | 输入为受保护文档 | 当前文件失败并记录错误,后续文件继续 |
| TC-EXC-003 | 必测 | 支持只读文档 | 输入为只读文档 | 可正常读取并处理 |
| TC-EXC-004 | 必测 | 目录重叠阻断 | 原始目录与替换目录或恢复目录相同或互为父子目录 | 禁止执行,弹窗并写日志 |
| TC-EXC-005 | 必测 | 原子写入保护 | 生成 [B] 后、写入 *.diff 前制造故障 |
不保留正式半成品,仅允许保留临时文件用于清理 |
| TC-EXC-006 | 必测 | 输出文件被占用 | 目标输出文件被其他进程占用 | 当前文件失败并记录原因,后续文件继续 |
| TC-EXC-007 | 必测 | 源文件处理中被修改 | 处理过程中外部修改源文件 | 当前文件失败并记录错误,后续文件继续 |
| TC-EXC-008 | 必测 | 磁盘空间不足 | 输出盘或临时目录空间不足 | 当前文件失败,日志明确记录空间异常 |
| TC-EXC-009 | 必测 | 临时目录不可写 | 临时目录权限不足 | 当前批次禁止启动,提示并写日志 |
| TC-EXC-010 | 必测 | 字体缺失兜底 | 目标机缺少影响排版的关键字体 | 当前文件继续处理,中文/东亚字体使用宋体兜底,英文和数字使用 Times New Roman 兜底,日志记录缺失字体和兜底说明 |
| TC-EXC-011 | 必测 | 零长度匹配防护 | 正则规则可产生零长度命中 | 执行期被阻断或安全跳过,不发生死循环 |
| TC-EXC-012 | 必测 | 灾难性回溯防护 | 构造高风险正则输入 | 执行可控失败或超时终止,程序不假死 |
| TC-EXC-013 | 必测 | 命中次数异常上限防护 | 单规则在单文件内产生异常大量命中 | 触发防护并记录日志 |
| TC-EXC-014 | 必测 | 停止按钮行为 | 执行批处理过程中点击停止 | 尽量完成当前文件后停止,其余未开始文件标记为“已停止” |
| TC-EXC-015 | 必测 | 崩溃后临时文件清理 | 制造异常中断后重启程序 | 启动时发现并清理无效临时文件,日志记录清理过程 |
| TC-EXC-016 | 必测 | 重复入队防护 | 同一源文件因扫描或并发被重复加入任务队列 | 系统应去重,不重复处理同一源文件 |
| TC-EXC-017 | 必测 | 配置文件损坏处理 | config.json 内容损坏 |
禁止按损坏配置继续执行,提示并写日志,直到用户确认重建默认配置或修复原配置 |
| TC-EXC-018 | 必测 | 规则文件损坏处理 | *.rule 文件内容损坏 |
加载失败并提示,不得带病执行 |
| TC-EXC-019 | 必测 | 自动提取取消保护 | 自动提取过程中执行取消 | 当前规则列表保持不变,日志记录取消事件 |
| TC-EXC-020 | 必测 | 自动提取失败不破坏规则列表 | 自动提取过程中制造解析异常 | 现有规则列表保持不变,日志记录失败原因 |
| TC-EXC-021 | 必测 | 配置文件缺失处理 | 启动时不存在 config.json |
系统按默认会话配置启动,不阻断执行,首次保存时生成新的 config.json |
| TC-EXC-022 | 必测 | 批处理前日志文件不可创建 | 启动目录日志文件无法创建或打开 | 当前批处理不得启动,并提示运行环境不满足要求 |
| TC-EXC-023 | 必测 | 运行中日志落盘失败 | 批处理过程中日志文件追加写入失败 | 当前文件可控结束,界面日志继续保留,当前批次结束后不再调度新任务 |
| TC-EXC-024 | 必测 | 单文件失败后继续后续文件 | 批处理中首个文件失败,后续文件仍可正常处理 | 当前失败文件被记录,后续文件继续执行,汇总结果正确统计成功和失败数量 |
27.6 UI、日志与会话配置测试矩阵
| 用例 ID | 级别 | 测试目标 | 输入或前置条件 | 预期结果 |
|---|---|---|---|---|
| TC-UI-001 | 必测 | 三页签存在性 | 启动程序 | 存在“替换”“恢复”“设置”三个固定页签 |
| TC-UI-002 | 必测 | 现代目录选择对话框 | 点击目录选择按钮 | 弹出文件选择风格的目录选择对话框,而非老式树形浏览目录框 |
| TC-UI-003 | 必测 | 失焦自动扫描 | 修改原始目录输入框后移出焦点 | 自动异步扫描,不阻塞界面 |
| TC-UI-004 | 必测 | 文件列表排序 | 点击文件列表列头 | 列表按所选列排序 |
| TC-UI-005 | 必测 | 进度显示 | 批处理执行中 | 显示总进度条、单文件进度条、当前文件、已处理数量、累计命中数 |
| TC-UI-006 | 必测 | 当前规则显示 | 批处理执行中 | 显示当前规则 ID 和规则名称 |
| TC-UI-007 | 必测 | 行状态颜色 | 文件成功、失败、处理中、已停止 | 颜色分别符合绿色、红色、蓝色、灰色定义 |
| TC-UI-008 | 必测 | 完成汇总弹窗 | 替换或恢复批处理完成 | 弹出汇总结果,包含成功数、失败数、停止数及替换恢复统计 |
| TC-UI-009 | 必测 | 日志编码与内容 | 执行任一处理流程 | 日志文件为 UTF-8,包含路径、规则 ID、事件码、失败原因等字段 |
| TC-UI-010 | 必测 | 异常堆栈日志 | 制造处理期异常 | 日志中先写主错误,再写 STACK 事件 |
| TC-UI-011 | 必测 | 会话配置持久化 | 修改 jsonDiffEncryption 等设置后重启程序 |
设置写入 config.json 并可正确恢复 |
| TC-UI-012 | 建议 | 长日志连续写入 | 长时间批处理大量文件 | 界面持续响应,日志正常追加,不出现明显卡死 |
| TC-UI-013 | 必测 | 自动提取按钮使能条件 | 文件列表分别处于未勾选、勾选一个、勾选多个状态 | 仅在至少勾选一个文件时允许执行自动提取,未勾选时禁用或明确提示 |
| TC-UI-014 | 必测 | 自动提取结果同步显示 | 在替换页面执行自动提取后切换到设置页面 | 新增规则应立即显示在规则列表中 |
| TC-UI-015 | 必测 | 自动提取进度与取消 | 执行大文档自动提取 | 界面显示提取进度,可取消,且界面保持响应 |
| TC-UI-016 | 必测 | 自动提取后自动定位 | 自动提取成功追加规则后 | 自动切换到设置页面并定位到第一条新增规则 |
| TC-UI-017 | 必测 | 自动提取期间禁止编辑规则 | 自动提取进行中尝试编辑规则列表 | 编辑入口被禁用或阻断 |
| TC-UI-018 | 必测 | 自动提取设置持久化 | 修改自动提取设置并重启程序 | 自动提取相关设置从 config.json 正确恢复 |
| TC-UI-019 | 必测 | 目录选择取消不修改路径 | 打开目录选择对话框后点击“取消” | 对应路径文本框内容保持不变 |
| TC-UI-020 | 必测 | 文件列表批量勾选与取消勾选 | 在替换页面文件列表执行批量勾选和批量取消勾选 | 复选框状态批量更新正确,自动提取和批处理范围随之变化 |
| TC-UI-021 | 必测 | 恢复页失焦自动扫描 | 修改恢复页相关路径输入框后移出焦点 | 自动异步扫描可恢复文件,不阻塞界面 |
| TC-UI-022 | 必测 | 自动提取预览字段完整性 | 执行自动提取进入预览界面 | 预览列表至少显示是否追加、提取类型、原文本、统计值、首次出现文档路径、首次出现顺序 |
| TC-UI-023 | 必测 | 会话配置自动刷新 | 修改会话配置项但不重启程序 | config.json 随配置变化自动刷新,内容与当前会话一致 |
| TC-UI-024 | 必测 | 日志框右键菜单 | 在日志框打开右键菜单并执行复制全部内容、清空日志 | 菜单项完整,复制操作覆盖全部日志文本,清空操作仅清空界面日志框 |
| TC-UI-025 | 必测 | 替换页文件列表右键批量操作 | 在替换页选择多行后执行删除、启用、不启用 | 所选行被批量删除或批量更新勾选状态,界面状态同步刷新 |
| TC-UI-026 | 必测 | 恢复页文件列表右键批量操作 | 在恢复页选择多行后执行删除、启用、不启用 | 所选行被批量删除或批量更新勾选状态,界面状态同步刷新 |
| TC-UI-027 | 必测 | 规则列表右键批量操作 | 在设置页规则列表选择多行后执行删除、启用、不启用 | 所选规则被批量删除或批量更新启用状态,规则列表与执行状态同步刷新 |
27.7 兼容性与运行环境测试矩阵
| 用例 ID | 级别 | 测试目标 | 输入或前置条件 | 预期结果 |
|---|---|---|---|---|
| TC-CMP-001 | 必测 | Win7 SP1 x64 兼容性 | 在 Win7 SP1 x64 环境运行绿色版 | 程序可启动、可执行基本替换与恢复流程 |
| TC-CMP-002 | 必测 | x64 平台约束 | 在 x64 目标机运行 | 程序可正常运行 |
| TC-CMP-003 | 必测 | 无管理员权限运行 | 目标机普通用户权限,无管理员权限 | 程序可正常启动并完成处理 |
| TC-CMP-004 | 必测 | 无软件安装权限运行 | 目标机禁止安装软件 | 绿色版可直接运行,不依赖安装流程 |
| TC-CMP-005 | 必测 | 启动目录可写要求 | 启动目录可写 | 程序可正常创建日志与配置文件 |
| TC-CMP-006 | 必测 | 启动目录不可写阻断 | 启动目录不可写 | 视为环境不满足,程序拒绝继续运行并提示原因 |
| TC-CMP-007 | 建议 | 首次启动解压内置组件 | 完全离线环境首次运行 | 可成功解压所需组件并进入可用状态 |
| TC-CMP-008 | 必测 | Word/WPS 宿主机前提 | 替换/恢复宿主机安装支持 docx 的 Word 或 WPS | 程序可调用宿主能力完成域刷新、doc/docx 转换或相关文档处理 |
| TC-CMP-009 | 必测 | 无 Visio 依赖 | 文档包含 Visio/OLE 对象且目标机未安装 Visio | 按可见位图处理和恢复,不要求安装 Visio |
27.8 响应性与目标性能测试矩阵
| 用例 ID | 级别 | 测试目标 | 输入或前置条件 | 预期结果 |
|---|---|---|---|---|
| TC-PRF-001 | 建议 | 100 页替换目标性能 | 单个 100 页文档执行替换 | 目标值为不超过 10 秒;若未达到,不单独作为强制阻断项 |
| TC-PRF-002 | 建议 | 100 页恢复目标性能 | 单个 100 页文档执行恢复 | 目标值为不超过 10 秒;若未达到,不单独作为强制阻断项 |
| TC-PRF-003 | 必测 | 大文件界面响应性 | 单个大文件处理过程中观察界面 | 不得出现界面卡死、状态不更新、操作无响应 |
| TC-PRF-004 | 必测 | 多文件批处理响应性 | 多文件批处理执行过程中观察界面 | 不得出现界面卡死、状态不更新、操作无响应 |
| TC-PRF-005 | 建议 | 并发处理稳定性 | 开启多文件并行处理 | 应能利用环境资源并保持正确性,不出现重复处理、输出冲突或死锁 |
27.9 标准验收样例集覆盖要求
标准验收样例集至少应覆盖以下样例类别,并与本章测试矩阵建立一一映射关系:
*.docx正文、页眉、页脚*.doc正文、页眉、页脚- 文本框、批注、表格、合并单元格
- 超链接显示文字、目录、域结果
- 公式、图表
- 位图图片、非位图图片
- 嵌入式图片、浮动图片
- 自动提取关键字、高频词、高频句
- 规则顺序、正则、大小写、全字匹配、跨
Run - 恢复严格匹配、差异错配、完整性校验失败
- 无管理员权限、无安装权限、启动目录可写与不可写场景
测试报告中至少应包含以下映射信息:
- 样例编号
- 对应用例 ID
- 输入文件路径
- 规则文件路径
- 执行时间
- 结果判定
- 失败原因
- 日志位置