一、方案背景
在企业合同管理场景中,传统的“在线 Word 编辑”模式存在以下核心问题:
- 合同格式、条款高度敏感,人工编辑极易引入错误
- 编辑权限粒度粗,无法区分“谁能改哪一部分”
- 编辑态、审批态、签署态不一致,存在法律风险
- 文档自由编辑难以满足审计、留痕与合规要求
为解决上述问题,本方案提出 “合同结构化编辑” 思路:
合同内容不再由用户直接编辑,而是由系统通过受控功能写入; 用户在编辑器中始终处于只读状态。
OnlyOffice 作为成熟的 Office 文档渲染与编辑引擎,在中国版 9.2.1 之后引入了“用户只读模式”,为该方案提供了关键的技术支撑。
二、总体设计目标
- 固化合同模板中的法律结构、核心条款与版式
- 将可变内容抽象为结构化数据,由系统统一维护与校验
- 禁止用户直接编辑文档内容,仅允许通过系统功能操作
- 保证合同内容修改的正确性、可控性与可审计性
三、核心设计思想
3.1 编辑权上移:从“人”到“系统”
传统模式:
- 用户 = 编辑者
- 系统 = 存储与展示
本方案模式:
- 用户 = 业务操作触发者(只读)
- 系统 = 唯一内容修改者
这意味着:
-
❌ 不允许光标进文档
-
❌ 不允许直接敲字
-
✅ 只允许通过:
- 表单填写
- 选择器
- 勾选条款
- 系统按钮
合同的所有内容变更,均由系统通过 API 或插件写入 OnlyOffice 文档。
在这个模式下:
| 行为主体 | 是否可修改文档 |
|---|---|
| 用户(键盘 / 鼠标) | ❌ |
| 连接器(JS API) | ✅ |
| 插件 | ✅ |
3.2 模板前置固化
合同模板在设计阶段即完成固化,模板本身不允许在实例阶段被随意修改。
模板固化的不是只有文字,而是 四类确定性内容:
| 类型 | 是否可编辑 | 说明 |
|---|---|---|
| 法律结构(章节、条款顺序) | ❌ | 防止结构被破坏 |
| 条款正文(核心法律条款) | ❌ | 确保法律一致性 |
| 样式与排版(字体、页眉页脚) | ❌ | 确保打印与签署一致 |
| 编号规则 / 引用关系 | ❌ | 防止条款错乱 |
模板发布后,进入“法律可信态”。
3.3 可变内容结构化
合同中允许变化的内容,不再以自由文本形式存在,而是抽象为结构化字段或受控模块。
典型可变内容包括:
- 合同主体信息(甲乙方)
- 金额、币种、税率
- 合同期限(起止日期)
- 可选条款
- 补充说明
这些内容由系统统一维护,并在写入前进行完整校验。
👉 合同不是“写出来的”,而是“生成出来的”
四、OnlyOffice 技术实现方案
4.1 关键能力:用户只读模式
OnlyOffice 中国版自 9.2.1 起支持“用户只读模式”,其核心能力是:
- 禁止用户通过 UI(键盘、鼠标)编辑文档
- 允许连接器(JS API)和插件修改文档内容
该能力完美匹配“用户只读 + 系统可写”的合同结构化编辑场景。
注意:该模式目前处于实验性阶段,仅支持 Word / Excel / PPT 的 PC 模式。
4.2 配置说明
用户只读模式需要在 editorConfig 中进行全局配置,且 三个字段必须同时正确设置。
"editorConfig": {
"customization": {
// 用户只读模式:true 开启,false 关闭
"readOnly": true
},
"permissions": {
// 编辑器需要具备编辑权限,供系统使用
"edit": true
},
// 编辑器必须处于编辑模式
"mode": "edit"
}
字段语义说明
| 字段 | 作用 | 控制对象 |
|---|---|---|
| customization.readOnly | 禁止用户手动编辑 | 用户行为 |
| permissions.edit | 允许修改文档内容 | 系统 / API |
| mode = edit | 编辑器底层支持写操作 | 编辑器引擎 |
缺少任一字段,都会导致该模式无法生效。
4.3 系统写入方式
在用户只读模式下,合同内容的修改通过以下方式完成:
- OnlyOffice JS API
- OnlyOffice 插件机制
- 系统后端通过连接器触发写入逻辑
常见写入操作包括:
- 替换占位符字段(主体信息、金额等)
- 插入或移除可选条款
- 在固定位置写入补充说明
- 更新自动编号、目录等
五、典型业务流程
- 法务设计并发布合同模板(结构与样式固化)
- 业务人员基于模板创建合同实例
- 用户在编辑器中只读查看合同内容
- 通过系统表单填写主体信息、金额、期限等
- 系统校验数据合法性
- 系统通过 OnlyOffice API 写入文档
- 合同进入审批流程
- 审批完成后生成最终签署版本(PDF / OFD)
六、风险控制与边界说明
6.1 补充说明的约束
补充说明虽为可变内容,但仍需严格控制:
- 固定插入位置
- 限制长度与格式
- 不允许破坏原有条款结构
- 建议纳入审批流程
6.2 编辑态与签署态分离
本方案强烈建议:
- 编辑阶段使用 Word(OnlyOffice)
- 签署阶段生成 PDF / OFD 并冻结内容
- 存证、归档使用不可变格式
以确保最终法律版本的一致性与可信性。
七、OnlyOffice API 调用示例与写入策略
本方案中,OnlyOffice 不承担“用户编辑器”角色,而是作为受控文档写入与渲染引擎存在。所有内容修改均由系统通过 API 或插件完成。
7.1 写入原则
在合同结构化编辑场景中,所有写入操作需遵循以下原则:
- 禁止自由定位写入:仅允许在模板预定义位置写入
- 字段优先于文本:能用占位符替换的,不直接写自由文本
- 最小写入范围:避免整段或整篇重写
- 幂等性:同一业务操作可重复执行,结果一致
7.2 占位符字段替换(主体信息 / 金额 / 日期)
模板设计建议
在合同模板中,使用明确、唯一的占位符标识变量字段,例如:
${partyA.name}${partyB.address}${contract.amount}${contract.startDate}
占位符应:
- 不参与编号
- 不跨段落
- 不嵌套复杂样式
JS API 写入示例(逻辑示意)
- 系统收集并校验业务数据
- 调用 OnlyOffice JS API 搜索占位符
- 使用替换 API 精确替换内容
该方式可避免用户误删字段或格式错乱。
7.3 可选条款的插入与移除
模板设计方式
- 可选条款在模板中以“隐藏块”或占位锚点形式存在
- 每个条款具备唯一 ID(如
clause_optional_01)
写入策略
- 勾选条款 → 插入对应内容块
- 取消勾选 → 移除对应内容块
- 插入后触发编号与目录更新
该方式确保条款顺序、编号与引用关系的正确性。
7.4 补充说明的受控写入
补充说明是唯一允许较高自由度的内容,但仍需受控:
- 固定写入位置(如“补充条款”章节)
- 系统创建段落,不允许覆盖原有内容
- 限制长度、样式与段落数
建议补充说明写入后自动标记为“需法务确认”。
7.5 自动更新能力
在每次系统写入完成后,建议统一触发:
- 条款编号刷新
- 目录更新
- 交叉引用修正
以确保合同整体结构始终一致。
八、与审批流 / 电子签章的完整闭环架构
合同结构化编辑并非孤立能力,其最终目标是服务于审批、签署与合规存证。
8.1 总体架构分层
整体闭环可划分为五个层次:
- 模板层(Template)
- 合同实例层(Instance)
- 编辑控制层(OnlyOffice)
- 审批与签署层
- 存证与归档层
8.2 合同生命周期流程说明
阶段一:模板发布
- 法务设计合同模板
- 固化结构、条款与样式
- 定义可变字段与可选条款
阶段二:合同生成
- 业务人员选择模板
- 系统创建合同实例
- 初始化 OnlyOffice 文档
阶段三:受控编辑
- 用户在编辑器中只读查看
- 通过系统表单触发修改
- 系统调用 OnlyOffice API 写入文档
- 记录所有变更操作日志
阶段四:审批流
- 合同进入审批流程
- 审批人员仅查看文档快照
- 审批过程禁止内容再编辑
阶段五:签署与冻结
- 审批通过后生成 PDF / OFD
- 文档内容冻结
- 发起电子签章流程
- 签署完成后进行存证
8.3 架构逻辑关系说明
8.4 关键控制点总结
| 环节 | 控制点 |
| 编辑 | 用户只读 + 系统写入 |
| 审批 | 只读快照,不可变 |
| 签署 | 冻结格式,坐标稳定 |
| 存证 | 文件 Hash 与签章绑定 |
九、方案价值总结
通过基于 OnlyOffice 的合同结构化编辑方案,可以实现:
- 从源头避免人工编辑导致的格式与内容错误
- 合同修改过程完全可控、可校验、可审计
- 降低法务审核成本,提高合同生成效率
- 为电子签章、审批流、合规审计提供稳定基础
本方案的核心价值不在于“增强编辑能力”,而在于“收回编辑权”。
OnlyOffice 在此方案中,承担的是“受控渲染与写入引擎”的角色,而非传统意义上的自由文档编辑器。
相关资源
OnlyOffice最新版本镜像,可访问: OnlyOffice9.x
版本介绍: documentserver 中国版
OnlyOffice 中国版技术交流:qm.qq.com/q/uMwFyL5Wn…