Files
leaudit-platform-frontend/docs/monaco-editor-能力与限制.md
T
2025-12-05 00:09:32 +08:00

437 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Monaco Editor 文档对比能力与限制说明
## 📖 概述
本文档详细说明 Monaco Editor 在比较两份 Word 文档时的能力和限制。Monaco Editor 是 VS Code 的核心编辑器组件,主要用于**纯文本对比**,而非格式化文档对比。
**核心结论**Monaco Editor 只能识别和对比**纯文本内容**的差异,无法识别字号、字体、颜色、表格结构等格式化信息。
---
## ✅ Monaco Editor **能做什么**
### 1. 纯文本内容对比
- ✅ 逐行对比文字内容的增删改
- ✅ 识别文本的新增、删除、修改
- ✅ 字符级精准差异高亮(行内哪些字符被修改)
- ✅ 区分不同类型的变更(新增、删除、修改)
**示例**
```diff
- 总金额:人民币壹佰万元整(¥1,000,000.00
+ 总金额:人民币壹佰伍拾万元整(¥1,500,000.00
```
### 2. 差异导航功能
- ✅ 跳转到上一处/下一处差异
- ✅ 统计差异数量(显示总共有多少处差异)
- ✅ 自动滚动到差异位置
- ✅ 差异位置高亮显示
- ✅ 显示当前查看的差异序号(如 3/15)
**功能按钮**
- 「上一处差异」- 跳转到前一个修改位置
- 「下一处差异」- 跳转到后一个修改位置
- 差异计数器 - 显示「发现 X 处差异」
### 3. 差异可视化
#### 并排显示模式(Side-by-Side
- 左侧:原始文档
- 右侧:修改后的文档
- 差异行用竖线连接
#### 内联显示模式(Inline
- 上下排列显示差异
- 删除内容在上,新增内容在下
#### 颜色高亮说明
- 🔴 **红色背景**:原始版本的内容(在新版本中被删除或修改前的内容)
- 🟢 **绿色背景**:修改版本的内容(新增或修改后的内容)
- 🟡 **深色高亮**:行内具体修改的字符差异(字符级对比)
### 4. 基本文本操作
- ✅ 搜索功能(Ctrl+F
- ✅ 自动换行(wordWrap
- ✅ 行号显示
- ✅ 缩略图导航(Minimap
- ✅ 鼠标滚轮缩放
- ✅ 只读模式(防止误编辑)
- ✅ 语法高亮(支持多种编程语言)
### 5. 文本提取能力(配合其他库)
项目中集成的文本提取方案:
#### Word 文档提取(使用 mammoth 库)
```typescript
import mammoth from 'mammoth';
async function extractTextFromWord(docUrl: string): Promise<string> {
const response = await fetch(docUrl);
const arrayBuffer = await response.arrayBuffer();
const textResult = await mammoth.extractRawText({ arrayBuffer });
return textResult.value; // 纯文本内容
}
```
**提取结果**
- ✅ 提取段落文字
- ✅ 提取表格内的文字(但不保留表格结构)
- ✅ 提取列表内容(但不保留序号和缩进)
- ❌ 不提取图片
- ❌ 不提取页眉页脚
#### PDF 文档提取(使用 pdfjs 库)
```typescript
import * as pdfjs from 'pdfjs-dist';
async function extractTextFromPdf(pdfUrl: string): Promise<string> {
const pdf = await pdfjs.getDocument(pdfUrl).promise;
let fullText = '';
for (let i = 1; i <= pdf.numPages; i++) {
const page = await pdf.getPage(i);
const textContent = await page.getTextContent();
const pageText = textContent.items
.map(item => item.str)
.join(' ');
fullText += `\n========== 第 ${i} 页 ==========\n${pageText}\n`;
}
return fullText;
}
```
**提取结果**
- ✅ 提取文本型 PDF 的文字
- ⚠️ 扫描版 PDF 提取效果差(需要 OCR)
- ❌ 不提取图片和图表
---
## ❌ Monaco Editor **不能做什么**
### 1. 格式识别(完全无法识别)
| 格式类型 | 是否支持 | 说明 |
|---------|---------|------|
| 字号大小 | ❌ | 无法识别 12pt → 14pt 的变化 |
| 字体 | ❌ | 无法识别宋体 → 黑体的变化 |
| 加粗/斜体/下划线 | ❌ | 所有文本样式都会丢失 |
| 字体颜色 | ❌ | 无法识别黑色 → 红色的变化 |
| 背景颜色/高亮 | ❌ | 无法识别文本高亮标记 |
**示例对比**
**原始 Word 文档**
> **第一条** 合同双方(加粗、14pt、黑体)
**Monaco 提取后**
> 第一条 合同双方(纯文本、无格式)
### 2. 排版结构(无法识别)
| 排版元素 | 是否支持 | 说明 |
|---------|---------|------|
| 段落对齐方式 | ❌ | 左对齐/居中/右对齐/两端对齐 |
| 行间距 | ❌ | 1.5倍行距 → 2倍行距的变化 |
| 段前段后间距 | ❌ | 段落间距设置 |
| 首行缩进 | ❌ | 2字符缩进等 |
| 页边距 | ❌ | 上下左右边距 |
| 分页符 | ❌ | 强制分页 |
### 3. 复杂元素(完全丢失)
| 文档元素 | 是否支持 | Monaco 处理方式 |
|---------|---------|----------------|
| 表格 | ❌ | 只提取表格内的文字,单元格结构丢失 |
| 图片 | ❌ | 完全无法显示,跳过 |
| 图表 | ❌ | Excel 图表、SmartArt 等完全丢失 |
| 页眉/页脚 | ❌ | 不提取 |
| 脚注/尾注 | ❌ | 不提取 |
| 批注 | ❌ | Word 批注内容不提取 |
| 修订标记 | ❌ | Word 修订模式的标记丢失 |
**表格示例**
**原始 Word 表格**
```
┌────────┬────────┬────────┐
│ 项目 │ 数量 │ 单价 │
├────────┼────────┼────────┤
│ A产品 │ 100 │ 500 │
└────────┴────────┴────────┘
```
**Monaco 提取后**
```
项目 数量 单价
A产品 100 500
```
### 4. 样式和主题(无法识别)
- ❌ Word 样式表(标题1、标题2、正文等)
- ❌ 主题颜色(Office 主题色)
- ❌ 模板格式
- ❌ 多级列表样式
### 5. 文档元数据(不支持)
- ❌ 作者信息
- ❌ 创建/修改时间
- ❌ 修订历史(谁在何时修改了什么)
- ❌ 文档属性(标题、主题、关键字等)
- ❌ 文档保护/密码
### 6. Office 特有功能(不支持)
| 功能 | 是否支持 | 说明 |
|-----|---------|------|
| 超链接 | ⚠️ 部分支持 | 只显示链接文字,无法点击跳转 |
| 书签 | ❌ | 不支持 |
| 目录 | ⚠️ 部分支持 | 只显示文字,无法点击导航 |
| 交叉引用 | ❌ | 不支持 |
| 域代码 | ❌ | 日期、页码等域代码不计算 |
| 宏/VBA | ❌ | 完全忽略 |
| 嵌入对象 | ❌ | Excel 表格、Visio 图等 |
---
## 📋 功能对比表
### Monaco Editor vs Word 原生比较功能
| 对比维度 | Monaco Editor | Word 原生「比较」 | 备注 |
|---------|--------------|-----------------|------|
| **文本内容** | ✅ 完全支持 | ✅ 完全支持 | Monaco 可精准识别文字差异 |
| **字号大小** | ❌ 不支持 | ✅ 支持 | Word 可显示字号变化 |
| **字体/样式** | ❌ 不支持 | ✅ 支持 | Word 可显示加粗、斜体等 |
| **颜色** | ❌ 不支持 | ✅ 支持 | Word 可显示字体颜色变化 |
| **表格结构** | ❌ 不支持 | ✅ 支持 | Word 可对比表格单元格变化 |
| **图片** | ❌ 不支持 | ✅ 支持 | Word 可显示图片增删 |
| **页眉页脚** | ❌ 不支持 | ✅ 支持 | Word 可对比页眉页脚内容 |
| **批注/修订** | ❌ 不支持 | ✅ 支持 | Word 有完整的修订模式 |
| **并排对比** | ✅ 支持 | ✅ 支持 | 两者都支持左右对比 |
| **差异导航** | ✅ 支持 | ✅ 支持 | 两者都可跳转到差异位置 |
| **在线使用** | ✅ 支持 | ❌ 需要桌面应用 | Monaco 可在浏览器中运行 |
| **跨平台** | ✅ 支持 | ⚠️ 部分支持 | Monaco 支持所有平台,Word 需要安装 |
| **性能** | ✅ 轻量快速 | ⚠️ 依赖 Office | Monaco 加载快,Word 需要完整 Office |
---
## 💡 使用建议
### ✅ 适用场景
1. **纯文本合同对比**
- 只关心条款内容变化
- 不关心格式(字体、字号、颜色)
- 适合法律条款审核
2. **代码文件对比**
- JavaScript、Python、Java 等源代码
- JSON、YAML 配置文件
- Markdown 文档
3. **法律文书文本对比**
- 合同条款修改对比
- 法规文件版本对比
- 协议文本变更追踪
4. **纯文本文档**
- TXT 文件
- CSV 文件
- 日志文件
### ❌ 不适用场景
1. **需要格式审查的文档**
- 投标文件格式审查(需要检查字号、字体)
- 公文格式审核(需要检查页边距、行距)
- 排版质量检查
2. **包含复杂元素的文档**
- 技术文档(包含大量图表)
- 设计方案(包含截图和示意图)
- 财务报表(包含 Excel 表格)
3. **需要保留完整格式的场景**
- 档案归档(需要保留原始格式)
- 打印输出(需要格式一致)
- 格式敏感的文档
---
## 🔄 替代方案
如果您需要对比格式化文档,建议使用以下方案:
### 1. Word 原生功能
**路径**:审阅 → 比较 → 比较文档
**优点**
- ✅ 完整支持所有 Word 格式
- ✅ 显示详细的修订标记
- ✅ 可选择对比粒度(字符/单词/段落)
**缺点**
- ❌ 需要安装 Microsoft Word
- ❌ 无法在浏览器中使用
- ❌ 不支持批量对比
### 2. Collabora Online
**说明**:开源的在线 Office 套件,支持 Word 文档预览和编辑
**优点**
- ✅ 在线使用,无需安装
- ✅ 保留文档格式
- ✅ 支持多人协作
**缺点**
- ❌ 对比功能不如 Word 原生强大
- ❌ 需要部署 Collabora 服务器
**项目集成参考**:见 `CLAUDE.md` 中的 Collabora 集成文档
### 3. 专业文档对比工具
| 工具名称 | 类型 | 主要功能 |
|---------|------|---------|
| **Beyond Compare** | 桌面应用 | 专业的文件/文件夹对比工具 |
| **WinMerge** | 开源工具 | 免费的文本对比工具 |
| **Araxis Merge** | 商业软件 | 支持 Word/PDF/图片对比 |
| **DiffChecker** | 在线工具 | 简单的在线文本对比 |
---
## 📚 技术实现
### 项目中的实现方式
**文件位置**`app/routes/monaco-demo.tsx`
**关键步骤**
1. **提取文本**(使用 mammoth 库)
```typescript
import mammoth from 'mammoth';
const response = await fetch(docUrl);
const arrayBuffer = await response.arrayBuffer();
const textResult = await mammoth.extractRawText({ arrayBuffer });
const plainText = textResult.value;
```
2. **加载到 Monaco Editor**
```typescript
import { DiffEditor } from "@monaco-editor/react";
<DiffEditor
height="90vh"
language="plaintext"
original={originalText} // 原始文档文本
modified={modifiedText} // 修改后的文档文本
options={{
readOnly: true,
renderSideBySide: true, // 并排显示
ignoreTrimWhitespace: false,
fontSize: 14,
wordWrap: 'on',
minimap: { enabled: true },
}}
/>
```
3. **差异导航**
```typescript
const handleEditorDidMount = (editor) => {
const lineChanges = editor.getLineChanges();
console.log(`发现 ${lineChanges.length} 处差异`);
};
const goToNextDiff = () => {
const modifiedEditor = diffEditorRef.current.getModifiedEditor();
modifiedEditor.revealLineInCenter(nextChange.modifiedStartLineNumber);
};
```
### 使用方法
**URL 参数加载文档**
```
/monaco-demo?doc1=路径1&doc2=路径2
```
**示例**
```
/monaco-demo?doc1=testWork/合同(1).docx&doc2=testWork/合同(2).docx
```
---
## ⚠️ 注意事项
### 1. 文本提取的限制
- **表格**:表格结构会丢失,只保留单元格内的文字
- **图片**:完全忽略,不提取
- **格式**:所有格式化信息(字体、颜色、大小)全部丢失
### 2. 扫描版 PDF 的问题
- 扫描版 PDF(图片 PDF)几乎无法提取文字
- 需要 OCR(光学字符识别)才能提取文字
- 项目暂不支持 OCR
### 3. 性能考虑
- Monaco Editor 体积较大(约 5MB
- 建议使用 CDN 加速
- 大文件(>10MB)建议分段加载
### 4. 中文编码问题
- 确保文件编码为 UTF-8
- 使用 `file.text()` 自动识别编码
- 避免使用 GBK 等编码
---
## 📖 相关文档
- [Monaco Editor 使用指南](./monaco-editor-使用指南.md)
- [Monaco Editor 官方文档](https://microsoft.github.io/monaco-editor/)
- [@monaco-editor/react 文档](https://github.com/suren-atoyan/monaco-react)
- [mammoth.js 文档](https://github.com/mwilliamson/mammoth.js)
- [PDF.js 文档](https://mozilla.github.io/pdf.js/)
---
## 🎯 结论
**Monaco Editor 适合用于**
- ✅ 纯文本内容对比(合同条款、代码、配置文件)
- ✅ 在线文档对比(无需安装桌面软件)
- ✅ 开发者工具集成(代码审查、版本对比)
**Monaco Editor 不适合用于**
- ❌ 格式敏感的文档对比(投标文件、公文)
- ❌ 包含图表的文档(技术文档、报告)
- ❌ 需要完整保留 Word 格式的场景
**建议**
- 对于纯文本合同对比,Monaco Editor 是理想选择
- 对于格式敏感的文档,建议使用 Word 原生比较功能
- 对于在线协作场景,可考虑集成 Collabora Online
---
**文档版本**v1.0
**最后更新**2025-01-29
**作者**:中国烟草AI合同及卷宗审核系统开发团队