# ancient_ocr **Repository Path**: votouch/ancient_ocr ## Basic Information - **Project Name**: ancient_ocr - **Description**: 一个专注于**竖排古籍**识别的OCR数字化平台,支持刻本、抄本、拓本等多种古籍类型的OCR识别、人工校对、字粒级定位和成果导出。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-20 - **Last Updated**: 2026-05-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 古籍OCR平台 - 功能模块与数据表对应关系 # 古籍OCR数字化平台 ## 📝 项目简介 一个专注于**竖排古籍**识别的OCR数字化平台,支持刻本、抄本、拓本等多种古籍类型的OCR识别、人工校对、字粒级定位和成果导出。 ## 🎯 核心功能 - **项目管理**:古籍元数据管理、进度跟踪 - **文档上传**:支持PDF/图片批量上传,**分片上传、断点续传、秒传(MD5去重)** - **OCR识别**:基于PaddleOCR的竖排文字识别,**支持手动触发OCR任务** - **版面分析**:自动识别标题、正文、表格等区域 - **字粒定位**:**每个字的精确坐标**,支持竖排阅读顺序 - **句子标记**:人工标记完整句子,获取句子外框 - **人工校对**:图文对照编辑、版本管理、批注系统 - **成果导出**:双层PDF、TXT、XML/TEI、Markdown - **全文检索**:基于Meilisearch的快速检索 ## 📊 项目进度(更新日期:2026-04-24) | 模块 | 完成率 | 状态 | |------|--------|------| | **Java 后端** | **55%** | 🟡 进行中 | | **Vue 前端** | **55%** | 🟡 进行中 | | **Python OCR** | **55%** | 🟡 进行中 | | **整体项目** | **55%** | 🟡 进行中 | ### 最近完成(2026-03-22 → 2026-04-24) - ✅ OCR任务队列 + 调度器(Redis Sorted Set + 优先级调度) - ✅ Python OCR服务回调对接(成功/失败/进度回调完整链路) - ✅ OCR结果存储与查询(rawContent含textBlocks,前端可展示) - ✅ 页面查看器(图片缩放/旋转/翻页/缩略图导航) - ✅ OCR结果前端展示(行文本+置信度+OCR框覆盖层) - ✅ OCR任务监控页面(队列统计+任务列表+筛选+挂起任务清空) - ✅ 页面状态管理(OCR状态/校对状态/备注更新) - ✅ 回调后自动更新page状态/置信度/字符统计 - ✅ 回调后自动更新document完成状态 ### 核心未完成(按表结构流程顺序) ``` 当前已通链路:project → document → page → ocr_task → ocr_result(前端可展示) ↓ 待实现链路: ocr_result → text_region → text_line → character_coordinate ↓ ↓ sentence_marker correction → version_history ↓ annotation ``` | 优先级 | 待实现环节 | 涉及表 | 说明 | |--------|-----------|--------|------| | **P0** | Python端版面分析→text_region写入 | text_region | Python识别结果需解析并写入区域表 | | **P0** | Python端行级识别→text_line写入 | text_line | 行级数据写入text_line(依赖text_region外键) | | **P0** | Python端字粒切分→char_detail写入 | char_detail, character_coordinate | 从行文本切分单字坐标 | | **P0** | Java端版面分析Mapper/Service | text_region, text_line | 缺Mapper/Service/Controller | | **P0** | Java端字粒定位Mapper/Service | character_coordinate, text_column | 缺Mapper/Service/Controller | | **P0** | 前端Canvas字粒高亮/编辑 | character_coordinate | 校对工作台核心 | | **P1** | 校对记录管理 | correction | 缺Service/Controller | | **P1** | 版本管理 | version_history | 缺Service/Controller | | **P1** | 句子标记 | sentence_marker | 缺Service/Controller + 前端拖选交互 | | **P1** | 批注系统 | annotation | 缺Service/Controller + 前端UI | | **P1** | WebSocket实时推送 | - | 任务进度实时通知 | | **P2** | 成果导出 | export_record | TXT/PDF/XML/JSON导出 | | **P2** | 全文检索 | search_cache | Meilisearch数据同步 | | **P2** | 表格结构识别 | table_structure | 古籍表格还原 | ## 🏗️ 技术架构 ### 后端 - **Java 17** + Spring Boot 2.7.18 - **MySQL 8.0** + MyBatis-Plus - **Redis** + 任务队列/缓存 - **Meilisearch** + 全文检索(待集成) ### 前端 - **Vue 3** + Ant Design Vue - **Canvas** + 古籍原图渲染 - **WebSocket** + 实时进度(待集成) ### OCR引擎 - **Python 3.9** + FastAPI - **PaddleOCR 3.4** + 竖排文字识别 - **PaddlePaddle-GPU 3.0** + GPU加速 ancient-ocr-platform/ ├── backend/ # Java后端 │ ├── src/ │ ├── pom.xml │ └── README.md ├── frontend/ # Vue前端 │ ├── src/ │ ├── package.json │ └── README.md ├── python-ocr/ # Python OCR服务 │ ├── app/ │ ├── requirements.txt │ └── README.md ├── docs/ # 文档 │ ├── sql/ │ │ └── ancient_ocr_schema.sql │ ├── api/ │ │ └── api_document.md │ └── images/ └── README.md ## 📦 快速开始 ### 环境要求 - JDK 17+ - MySQL 8.0+ - Redis 7.0+ - Python 3.9+ - Meilisearch 1.3+ - Maven 3.8+ ## 一、功能模块与数据表总览 | 功能模块 | 支撑数据表 | |---------|----------| | 项目管理 | project | | 文档管理 | document, page | | OCR识别 | ocr_task, ocr_task_detail, ocr_param_template
ocr_result, task_log | | 版面分析 | text_region, text_line, table_structure | | 字粒定位 | character_coordinate, text_column | | 句子标记 | sentence_marker | | 人工校对 | correction, version_history, annotation | | 成果导出 | export_record | | 全文检索 | search_cache (同步到Meilisearch) | ## 二、各功能模块详细对应关系 核心关联链 :project → document → page → ocr_result → text_region → text_line → char_detail 校对闭环 :char_detail → correction → version_history → annotation ### 1. 项目管理模块 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 创建项目 | 新增项目记录 | project | 所有项目信息字段 | | 编辑项目 | 更新项目信息 | project | name, dynasty, author等 | | 删除项目 | 逻辑/物理删除 | project | 级联删除关联的document,page | | 项目列表 | 查询项目 | project | 分页、排序、筛选 | | 项目详情 | 查询单个项目 | project | 关联统计(总页数、进度) | | 项目进度 | 计算进度 | project | processed_pages, total_pages | | 项目统计 | 聚合统计 | project | 按朝代、类型统计 | **核心SQL:** ```sql -- 项目列表(带进度) SELECT p.*, COUNT(DISTINCT doc.id) as document_count, SUM(doc.page_count) as total_pages, SUM(doc.processed_count) as processed_pages, (SUM(doc.processed_count)/SUM(doc.page_count))*100 as progress FROM project p LEFT JOIN document doc ON p.id = doc.project_id GROUP BY p.id; ``` ### 2. 文档管理模块 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 上传文档 | 新增文档记录 | document | file_name, file_path, md5 | | 批量上传 | 多条文档记录 | document | 同上 | | 文档转图片 | 生成页面记录 | page | 为每页生成一条记录 | | 文档列表 | 查询文档 | document | 按项目筛选 | | 文档详情 | 查询文档 | document + page | 文档信息+页面列表 | | 删除文档 | 删除文档 | document | 级联删除关联page | | 文档状态 | 更新状态 | document | status, processed_count | **页面生成逻辑:** ```java // PDF上传后,为每一页创建page记录 for (int i = 1; i <= pageCount; i++) { Page page = new Page(); page.setDocumentId(docId); page.setProjectId(projectId); page.setPageNum(i); page.setImagePath("/storage/project_1/page_001.jpg"); page.setStatus(0); // 待识别 pageRepository.save(page); } ``` ### 3. OCR识别模块 #### 3.1 OCR任务调度 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 提交任务 | 创建OCR任务 | ocr_task | task_no, project_id, task_type | | 批量提交 | 创建批次任务 | ocr_task | 相同batch_no | | 任务队列 | 查询待处理任务 | ocr_task | status=0, 按priority排序 | | 领取任务 | 更新任务状态 | ocr_task | status=2, start_time | | 完成任务 | 更新任务状态 | ocr_task | status=3, end_time, result_summary | | 任务失败 | 记录失败 | ocr_task | status=4, error_msg | | 重试任务 | 更新重试次数 | ocr_task | retry_count+1 | | 任务监控 | 查询任务状态 | ocr_task + task_log | 任务详情+日志 | #### 3.2 OCR参数管理 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 参数模板 | 增删改查 | ocr_param_template | template_name, params_json | | 默认模板 | 设置默认 | ocr_param_template | is_default | | 应用参数 | 任务关联模板 | ocr_task_detail | param_template_id, custom_params | #### 3.3 OCR结果存储 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 保存结果 | 存储OCR返回 | ocr_result | raw_result, full_text | | 多版本 | 创建新版本 | ocr_result | version+1, is_active切换 | | 结果查询 | 获取最新结果 | ocr_result | 按page_id查询is_active=1 | | 结果对比 | 查询历史版本 | ocr_result | 同一page_id多个version | #### 3.4 任务日志 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 记录日志 | 写入任务日志 | task_log | task_id, log_level, message | | 查看日志 | 查询任务日志 | task_log | 按task_id时间倒序 | ### 4. 版面分析模块 #### 4.1 区域管理 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 保存区域 | 存储检测到的区域 | text_region | region_type, bbox, region_text | | 区域列表 | 查询页面所有区域 | text_region | 按page_id查询,按order_num排序 | | 区域类型统计 | 按类型统计 | text_region | GROUP BY region_type | | 区域更新 | 修改区域信息 | text_region | 人工调整区域边界 | #### 4.2 行管理 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 保存行 | 存储每行文本 | text_line | text, confidence, polygon_points | | 行列表 | 查询区域内的行 | text_line | 按region_id查询 | | 行坐标 | 获取行位置 | text_line | bbox_x1,y1,x2,y2 | | 行高亮 | 前端定位 | text_line | 返回坐标用于绘制 | #### 4.3 表格处理 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 保存表格 | 存储表格结构 | table_structure | table_html, cells_json | | 表格渲染 | 获取表格数据 | table_structure | 按region_id查询 | ### 5. 字粒定位模块(竖排核心) #### 5.1 字粒坐标管理 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 生成字粒 | OCR后切分字粒 | character_coordinate | 从text_line切分,生成每个字 | | 字粒列表 | 查询页面所有字 | character_coordinate | 按page_id,按阅读顺序排序 | | 单字查询 | 按内容查字 | character_coordinate | 按character模糊查询 | | 字粒高亮 | 获取字坐标 | character_coordinate | bbox_x1,y1,x2,y2 | | 上下文获取 | 取前后字 | character_coordinate | prev_char_id, next_char_id | | 置信度筛选 | 低置信度字 | character_coordinate | confidence < 0.7 | **字粒生成算法(从行切分):** ```java // 从text_line切分出单个字符 List splitLineToChars(TextLine line) { // 竖排:根据字符宽度估算每个字的位置 int charWidth = (line.getBboxX2() - line.getBboxX1()) / line.getText().length(); for (int i = 0; i < text.length(); i++) { CharacterCoordinate cc = new CharacterCoordinate(); cc.setCharacter(text.charAt(i)); cc.setBboxX1(line.getBboxX1()); cc.setBboxX2(line.getBboxX2()); cc.setBboxY1(line.getBboxY1() + i * charWidth); cc.setBboxY2(line.getBboxY1() + (i + 1) * charWidth); // 更精确的算法需要考虑字间距 } } ``` #### 5.2 列管理 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 列检测 | 识别竖排列 | text_column | 根据字粒x坐标聚类 | | 列列表 | 查询页面列 | text_column | 按page_id,按阅读顺序 | | 列内字 | 获取列内所有字 | character_coordinate | 按column_id查询 | | 列坐标 | 获取列边界 | text_column | bbox_x1,x2 | ### 6. 句子标记模块 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 标记句子 | 新增句子标记 | sentence_marker | sentence_text, start_char_id, end_char_id | | 句子列表 | 查询页面句子 | sentence_marker | 按page_id查询 | | 句子高亮 | 获取句子外框 | sentence_marker | bbox_x1,y1,x2,y2 | | 句子内字 | 获取句子所有字 | character_coordinate | char_index_global between start/end | | 跨列句子 | 标记跨列句子 | sentence_marker | column_ids存储多列 | | 句子类型 | 分类标记 | sentence_marker | sentence_type | | 删除句子 | 取消标记 | sentence_marker | 逻辑/物理删除 | **句子标记前端交互:** ```javascript // 用户拖选多个字标记为句子 // 1. 获取选中的起始字和结束字 // 2. 查询之间的所有字 // 3. 计算最小外接矩形 // 4. 插入sentence_marker记录 ``` ### 7. 人工校对模块 #### 7.1 校对操作 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 单字校对 | 修改单个字 | character_coordinate | corrected_char, is_corrected | | 整行校对 | 修改整行 | text_line | text, 同时更新关联字粒 | | 整句校对 | 修改句子 | sentence_marker | sentence_text | | 校对记录 | 保存每次修改 | correction | original_text, corrected_text | | 校对统计 | 统计工作量 | correction | 按人、按时间聚合 | **校对联动逻辑:** ```sql -- 修改单个字后,需要同步更新: -- 1. character_coordinate.corrected_char -- 2. text_line.text(如果该行有多个字被改,需要重组) -- 3. ocr_result.full_text(页面全文需要重组) -- 4. sentence_marker.sentence_text(如果该字在句子中) ``` #### 7.2 版本管理 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 保存版本 | 校对完成生成版本 | version_history | page_id, version_no, content | | 版本列表 | 查询页面版本 | version_history | 按page_id查询 | | 版本回滚 | 恢复历史版本 | version_history | 用历史内容覆盖当前 | | 版本对比 | 对比两个版本 | version_history | content_diff | #### 7.3 批注系统 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 添加批注 | 新增批注 | annotation | content, position_x1,y1,x2,y2 | | 回复批注 | 关联父批注 | annotation | parent_id | | 批注列表 | 查询页面批注 | annotation | 按page_id查询 | | 批注状态 | 更新状态 | annotation | status, resolved_by | | 批注定位 | 跳转到批注位置 | annotation | 用position坐标定位 | ### 8. 成果导出模块 | 功能点 | 操作 | 涉及表 | 字段说明 | |-------|-----|-------|---------| | 创建导出 | 新建导出任务 | export_record | export_no, project_id, export_type | | 导出TXT | 生成文本文件 | ocr_result + correction | 取最新校对后文本 | | 导出双层PDF | 生成可搜索PDF | page + character_coordinate | 图片+字粒坐标 | | 导出XML/TEI | 生成学术格式 | 所有相关表 | 结构化导出 | | 导出JSON | 原始数据导出 | 所有相关表 | 完整数据导出 | | 下载文件 | 提供下载 | export_record | 更新download_count | | 清理过期 | 删除过期文件 | export_record | expire_time判断 | **各导出格式对应的数据源:** | 导出格式 | 主要数据源 | 辅助数据 | |---------|----------|---------| | TXT | ocr_result.full_text + correction | 取最新校对版 | | 双层PDF | page.image_path + character_coordinate | 字粒坐标用于文本层 | | XML/TEI | 所有表的结构化数据 | 元数据、版本信息 | | Markdown | text_region按阅读顺序 | 保留标题层级 | | JSON | 所有表的完整数据 | 包含所有版本 | ### 9. 全文检索模块 | 功能点 | 操作 | 涉及表 | 说明 | |-------|-----|-------|----| | 数据同步 | 标记待同步 | search_cache | OCR完成或校对后插入/更新 | | 同步任务 | 查询待同步 | search_cache | status=0, 按priority | | 同步成功 | 更新状态 | search_cache | status=2, sync_time | | 同步失败 | 记录错误 | search_cache | status=3, error_msg, retry_count | | 重试同步 | 重置状态 | search_cache | status=0, retry_count+1 | **同步到Meilisearch的数据结构:** ```javascript // 从MySQL组装成Meilisearch文档 { "id": "page_123", "project_id": 1, "project_name": "大学宋刻本", "dynasty": "宋", "page_num": 3, "full_text": "大学之道...", // 从ocr_result.full_text取最新版 "characters": [ // 从character_coordinate取 {"char": "大", "bbox": [100,100,140,140]}, {"char": "学", "bbox": [100,150,140,190]} ], "sentences": [ // 从sentence_marker取 {"text": "大学之道", "bbox": [100,100,500,200]} ], "avg_confidence": 0.95, // 从ocr_result取 "updated_at": "2024-01-15T10:00:00" } ``` ## 三、功能操作与表的CRUD矩阵 | 功能 | 表 | 增(C) | 查(R) | 改(U) | 删(D) | 频率 | |-----|---|------|------|------|------|-----| | 创建项目 | project | ● | | | | 低 | | 查看项目 | project | | ● | | | 高 | | 更新项目 | project | | | ● | | 中 | | 删除项目 | project | | | | ● | 低 | | 上传文档 | document | ● | | | | 中 | | 文档转图片 | page | ● | | | | 中 | | 提交OCR任务 | ocr_task | ● | | | | 高 | | 领取任务 | ocr_task | | | ● | | 高 | | 完成任务 | ocr_task | | | ● | | 高 | | 保存OCR结果 | ocr_result | ● | | | | 高 | | 保存区域 | text_region | ● | | | | 高 | | 保存行 | text_line | ● | | | | 高 | | 生成字粒 | character_coordinate | ● | | | | 高 | | 检测列 | text_column | ● | | | | 中 | | 标记句子 | sentence_marker | ● | | | | 中 | | 查询句子 | sentence_marker | | ● | | | 高 | | 校对单字 | character_coordinate | | | ● | | 高 | | 校对整行 | text_line | | | ● | | 高 | | 记录校对 | correction | ● | | | | 高 | | 保存版本 | version_history | ● | | | | 中 | | 添加批注 | annotation | ● | | | | 中 | | 查询批注 | annotation | | ● | | | 中 | | 创建导出 | export_record | ● | | | | 低 | | 下载文件 | export_record | | | ● | | 低 | | 标记同步 | search_cache | ● | | | | 高 | | 查询同步 | search_cache | | ● | | | 高 | ## 四、页面功能与数据表对应(前端视角) ### 1. 项目管理页面 ``` 项目列表表格 ├── 项目名称 → project.name ├── 朝代 → project.dynasty ├── 作者 → project.author ├── 总页数 → SUM(document.page_count) ├── 已处理 → SUM(document.processed_count) ├── 进度 → 计算字段 └── 操作按钮 ``` ### 2. 文档列表页面 ``` 文档列表 ├── 文件名 → document.file_name ├── 文件大小 → document.file_size ├── 总页数 → document.page_count ├── 已处理 → document.processed_count ├── 状态标签 → document.status └── 页面缩略图 → document.first_page_path ``` ### 3. OCR任务监控页面 ``` 任务列表 ├── 任务编号 → ocr_task.task_no ├── 项目名称 → JOIN project ├── 类型 → ocr_task.task_type ├── 状态 → ocr_task.status ├── 进度 → ocr_task_detail.pages_success/pages_total ├── 提交时间 → ocr_task.submit_time ├── 处理时间 → ocr_task.duration └── 错误信息 → ocr_task.error_msg ``` ### 4. 校对工作台页面(核心!) ``` ┌─────────────────────────────────────────────────┐ │ 左侧:古籍原图 │ │ ├── 区域框 → text_region.bbox │ │ ├── 行高亮 → text_line.bbox │ │ ├── 字粒框 → character_coordinate.bbox │ │ ├── 句子框 → sentence_marker.bbox │ │ └── 批注标记 → annotation.position │ ├─────────────────────────────────────────────────┤ │ 右侧:文本编辑区 │ │ ├── 页面全文 → ocr_result.full_text │ │ ├── 区域文本 → text_region.region_text │ │ ├── 行文本 → text_line.text │ │ ├── 单字编辑 → character_coordinate.character │ │ ├── 置信度标识 → character_coordinate.confidence│ │ └── 保存按钮 → 写入correction表 │ ├─────────────────────────────────────────────────┤ │ 底部:工具区 │ │ ├── 版本历史 → version_history │ │ ├── 批注列表 → annotation │ │ └── 句子标记 → sentence_marker │ └─────────────────────────────────────────────────┘ ``` ### 5. 句子标记页面 ``` 句子列表 ├── 句子内容 → sentence_marker.sentence_text ├── 字符数 → sentence_marker.char_count ├── 类型 → sentence_marker.sentence_type ├── 坐标预览 → sentence_marker.bbox ├── 标记人 → sentence_marker.marked_by ├── 标记时间 → sentence_marker.marked_time └── 查看详情 → 跳转到校对工作台并高亮该句子 ``` ### 6. 检索结果页面 ``` 搜索结果 ├── 项目名称 → JOIN project ├── 页面缩略图 → page.thumbnail_path ├── 匹配文本高亮 → Meilisearch返回的高亮片段 ├── 置信度 → ocr_result.avg_confidence ├── 跳转到原文 → 带页码和坐标参数跳转校对工作台 └── 相关句子 → sentence_marker (可选) ``` ## 五、数据流转时序图 ### OCR识别完整流程 ``` 用户上传PDF ↓ [document] 插入文档记录 ↓ [page] 为每页生成记录 ↓ 用户点击"开始识别" ↓ [ocr_task] 创建任务记录 ↓ [ocr_task_detail] 记录任务详情 ↓ Python服务领取任务 → 更新[ocr_task].status=2 ↓ PaddleOCR识别完成 ↓ [ocr_result] 保存整体结果 ↓ [text_region] 保存区域信息 ↓ [text_line] 保存行信息 ↓ [character_coordinate] 切分字粒并保存 ↓ [text_column] 检测竖排列并保存 ↓ [page].ocr_status=2, ocr_confidence=计算值 ↓ [document].processed_count+1 ↓ [project].processed_pages+1, 更新progress ↓ [search_cache] 插入待同步记录 ↓ 定时任务同步到Meilisearch ↓ [ocr_task].status=3, end_time, duration ↓ [task_log] 记录完成日志 ``` ### 人工校对流程 ``` 用户打开校对工作台 ↓ 查询[page]获取页面信息 ↓ 查询[ocr_result]获取最新识别结果 ↓ 查询[text_region]显示区域框 ↓ 查询[text_line]显示行高亮 ↓ 查询[character_coordinate]显示字粒 ↓ 用户修改某个字 ↓ [correction] 插入校对记录 ↓ [character_coordinate].corrected_char=新值, is_corrected=1 ↓ 重新组装该行文本 → 更新[text_line].text ↓ 重新组装该区域文本 → 更新[text_region].region_text ↓ 重新组装页面全文 → 更新[ocr_result].full_text ↓ 如果该字在句子中 → 更新[sentence_marker].sentence_text ↓ [version_history] 插入新版本 ↓ [page].proofread_status=1, proofread_count+1 ↓ [search_cache] 插入待同步记录(更新Meilisearch) ``` ### 句子标记流程 ``` 用户在图片上拖选多个字 ↓ 前端获取起始字和结束字的ID ↓ 查询[character_coordinate]获取之间的所有字 ↓ 计算最小外接矩形(取最小x1,y1和最大x2,y2) ↓ 拼接句子文本(按阅读顺序) ↓ [sentence_marker] 插入句子记录 ↓ 返回句子UUID ↓ 前端绘制句子框 ``` ## 六、总结:表与功能的映射关系 | 表名 | 主要功能模块 | 核心作用 | |-----|------------|---------| | project | 项目管理 | 项目元数据、进度跟踪 | | document | 文档管理 | 文件存储、页面统计 | | page | 文档管理/OCR/校对 | 页面状态、图片路径 | | ocr_task | OCR识别 | 任务调度、状态跟踪 | | ocr_task_detail | OCR识别 | 任务详情、性能统计 | | ocr_param_template | OCR识别 | 参数模板、配置管理 | | ocr_result | OCR识别 | 识别结果存储、版本管理 | | task_log | OCR识别 | 任务日志、问题追踪 | | text_region | 版面分析 | 区域类型、位置、文本 | | text_line | 版面分析 | 行文本、坐标、置信度 | | table_structure | 版面分析 | 表格结构、HTML | | character_coordinate | 字粒定位 | 竖排核心:每个字的坐标 | | text_column | 字粒定位 | 竖排列信息 | | sentence_marker | 句子标记 | 句子聚合、外框坐标 | | correction | 人工校对 | 修改记录、统计 | | version_history | 人工校对 | 版本管理、回滚 | | annotation | 人工校对 | 批注、讨论 | | export_record | 成果导出 | 导出任务、文件管理 | | search_cache | 全文检索 | 同步状态管理 |