在开始构建档案数字化公文系统之前,必须先配置好标准化的开发环境。本系统采用后端Spring Boot + 前端Vue.js + 数据库MySQL + OCR引擎Tesseract的架构。请严格按照以下步骤执行环境初始化。
后端运行依赖Java环境。请下载并安装JDK 17(LTS版本),配置环境变量JAVA_HOME。Maven版本建议使用3.8.6以上。
验证命令:
```bash java -version mvn -version ```前端构建需要Node.js环境。请前往Node.js官网下载LTS版本(推荐v18或v20),安装包会自动包含npm包管理器。
验证命令:
```bash node -v npm -v ```为了快速落地,推荐使用Docker直接拉取MySQL镜像,避免繁琐的本地安装配置。
执行命令:
```bash docker run -d \ --name doc-mysql \ -e MYSQL_ROOT_PASSWORD=root123456 \ -e MYSQL_DATABASE=doc_system \ -p 3306:3306 \ mysql:8.0 ```这是实现档案数字化的核心组件,用于将图片格式的公文识别为可检索的文本。
我们需要一张核心表来存储公文的元数据以及OCR识别后的文本内容。请在MySQL中执行以下SQL脚本完成建表。
建表SQL脚本:
```sql USE doc_system; CREATE TABLE t_document ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', title VARCHAR(255) NOT NULL COMMENT '公文标题', original_name VARCHAR(255) NOT NULL COMMENT '原始文件名', file_path VARCHAR(500) NOT NULL COMMENT '文件存储路径', content_text TEXT COMMENT 'OCR识别后的全文内容', status TINYINT DEFAULT 0 COMMENT '状态:0-处理中,1-已完成,2-失败', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数字化公文档案表'; ```使用Spring Initializr创建项目,依赖选择:Spring Web, Spring Data JPA, MySQL Driver, Lombok。
除了基础依赖外,需要引入Tesseract的Java封装库tess4j用于调用OCR引擎。
```xml配置数据库连接信息及文件上传路径限制。请确保数据库密码与Docker启动时设置的一致。
```yaml server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/doc_system?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: root123456 driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true servlet: multipart: max-file-size: 50MB max-request-size: 50MB 自定义文件存储路径 file: upload-dir: ./uploads ```
创建Entity类对应数据库表结构,以及Repository接口用于数据操作。
```java package com.doc.entity; import jakarta.persistence.; import lombok.Data; import java.time.LocalDateTime; @Data @Entity @Table(name = "t_document") public class Document { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private String originalName; private String filePath; @Column(columnDefinition = "TEXT") private String contentText; private Integer status; private LocalDateTime createTime; private LocalDateTime updateTime; } ``` ```java package com.doc.repository; import com.doc.entity.Document; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface DocumentRepository extends JpaRepository这是系统的核心逻辑,负责读取上传的文件并调用Tesseract提取文字。注意Windows和Linux下字体库路径的差异,这里使用默认配置,确保环境变量已配置。
```java package com.doc.service; import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.TesseractException; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.File; @Service public class OcrService { @Value("${tesseract.datapath:}") private String dataPath; public String extractText(File imageFile) throws TesseractException { Tesseract tesseract = new Tesseract(); // 如果需要指定tessdata路径,可在此设置 // tesseract.setDatapath(dataPath); tesseract.setLanguage("chi_sim+eng"); // 设置中英文识别 return tesseract.doOCR(imageFile); } } ```提供接口供前端上传文件,保存文件到本地,异步或同步进行OCR处理,并将结果存入数据库。
```java package com.doc.controller; import com.doc.entity.Document; import com.doc.repository.DocumentRepository; import com.doc.service.OcrService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; import java.util.UUID; @RestController @RequestMapping("/api/doc") @CrossOrigin(origins = "") public class DocumentController { @Autowired private DocumentRepository documentRepository; @Autowired private OcrService ocrService; @Value("${file.upload-dir}") private String uploadDir; @PostMapping("/upload") public Map前端使用Vue 3配合Element Plus组件库,实现文件上传和列表展示功能。
在命令行执行以下命令创建项目并安装依赖。
```bash npm create vue@latest doc-frontend 选择默认配置即可 cd doc-frontend npm install npm install axios element-plus ```修改main.js引入Element Plus样式和组件库。
```javascript import { createApp } from 'vue' import App from './App.vue' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import axios from 'axios' const app = createApp(App) app.use(ElementPlus) app.config.globalProperties.$axios = axios app.mount('app') ```将所有逻辑封装在App.vue中,包含上传表单和表格展示。确保后端接口地址http://localhost:8080/api/doc可访问。
```html{{ currentContent }}
代码编写完成后,按顺序启动后端和前端服务进行验证。
在IDEA中运行DocApplication主类,或使用Maven命令打包运行。
```bash mvn clean package java -jar target/your-artifact-name.jar ```看到控制台输出Started DocApplication即表示启动成功。
在frontend目录下运行开发服务器。
```bash npm run dev ```命令行会输出本地访问地址,通常是 http://localhost:5173。
至此,一个具备基础OCR数字化能力的公文系统已完全落地。如需提升识别率,建议针对特定字体训练Tesseract模型或接入商业API。