智慧档案库房建设指南:从传统库房到智能管理的升级路径
还在为档案查找耗时、库房环境难控、安全隐患频发而头疼吗?这篇文章正是为你准备的。我们将带你全面了解智慧档案库房如何通过物联网、环境监控与大数据技术,彻底解决这些痛点。你会看到从规划部署到实际运维的清晰...
2026年06月18日 01:35:21
在开始构建公安版文书档案系统之前,必须确保开发环境满足以下硬性指标。本系统采用Spring Boot 2.7.x作为核心框架,MyBatis-Plus作为持久层框架,MySQL 8.0作为数据存储,并集成Tesseract OCR实现文书内容的自动提取。
1. 基础环境安装命令
java -versionmvn -vCREATE DATABASE police_doc_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;sudo apt-get install tesseract-ocr tesseract-ocr-chi-sim公安文书档案系统对数据的结构化要求极高,必须包含案件编号、密级、文书类型等关键字段。请在MySQL中执行以下SQL脚本完成建表。
建表SQL脚本
-- 创建公安文书档案主表
CREATE TABLE `t_police_doc_archive` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`doc_name` varchar(255) NOT NULL COMMENT '文书名称',
`case_no` varchar(50) NOT NULL COMMENT '关联案件编号',
`doc_type` varchar(20) NOT NULL COMMENT '文书类型:01-立案,02-询问笔录,03-结案报告',
`security_level` tinyint(1) NOT NULL DEFAULT '1' COMMENT '密级:1-公开,2-内部,3-机密',
`file_path` varchar(500) DEFAULT NULL COMMENT '文件存储路径',
`ocr_content` text COMMENT 'OCR识别后的全文内容',
`create_by` varchar(50) DEFAULT NULL COMMENT '上传人警号',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_case_no` (`case_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='公安文书档案表';
创建Maven项目后,需要在pom.xml中引入必要的依赖。特别注意文件上传和OCR处理的库。
pom.xml 核心依赖
org.springframework.boot
spring-boot-starter-web
com.baomidou
mybatis-plus-boot-starter
3.5.2
mysql
mysql-connector-java
runtime
org.projectlombok
lombok
true
net.sourceforge.tess4j
tess4j
5.2.1
commons-io
commons-io
2.11.0
在src/main/resources/application.yml中配置数据库连接、文件上传路径限制及OCR数据路径。请根据实际安装路径修改tess.data.path。
server:
port: 8080
spring:
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/police_doc_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
username: root
password: your_password
mybatis-plus:
mapper-locations: classpath:mapper/.xml
global-config:
db-config:
logic-delete-field: deleted
OCR配置
tess:
data:
Windows示例: C:/Program Files/Tesseract-OCR/tessdata
Linux示例: /usr/share/tesseract-ocr/4.00/tessdata
path: /usr/share/tesseract-ocr/4.00/tessdata
以下是完整的实体类、Service层和Controller层代码。代码中包含了针对公安场景的文件类型白名单校验和案件编号格式校验。

package com.police.doc.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class PoliceDocArchive {
@TableId(type = IdType.AUTO)
private Long id;
private String docName;
private String caseNo;
private String docType;
private Integer securityLevel;
private String filePath;
private String ocrContent;
private String createBy;
private LocalDateTime createTime;
}
package com.police.doc.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.police.doc.entity.PoliceDocArchive;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface PoliceDocArchiveMapper extends BaseMapper {
}
此层包含文件上传、OCR识别及数据入库的完整逻辑。重点在于processDoc方法中的安全校验。
package com.police.doc.service;
import com.police.doc.entity.PoliceDocArchive;
import com.police.doc.mapper.PoliceDocArchiveMapper;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
@Service
public class DocService {
@Resource
private PoliceDocArchiveMapper mapper;
@Value("${tess.data.path}")
private String tessDataPath;
// private static final String UPLOAD_DIR = "/data/police/docs/"; // Linux
private static final String UPLOAD_DIR = "D:/police_docs/"; // Windows示例
// 允许上传的文件类型白名单
private static final List ALLOWED_EXTENSIONS = Arrays.asList("pdf", "jpg", "png", "jpeg", "tif");
public String uploadAndProcess(MultipartFile file, String caseNo, String docType, String policeId) throws Exception {
// 1. 文件安全校验
String extension = FilenameUtils.getExtension(file.getOriginalFilename()).toLowerCase();
if (!ALLOWED_EXTENSIONS.contains(extension)) {
throw new RuntimeException("非法文件类型,仅支持:PDF, JPG, PNG, TIF");
}
// 2. 案件编号格式校验 (简单正则:年份-代码-序号)
if (!caseNo.matches("\\d{4}-\\d{4}-\\d{3,}")) {
throw new RuntimeException("案件编号格式错误,应为:YYYY-XXXX-NNN");
}
// 3. 创建存储目录
File dir = new File(UPLOAD_DIR);
if (!dir.exists()) dir.mkdirs();
// 4. 保存文件
String newFileName = UUID.randomUUID() + "." + extension;
File destFile = new File(dir, newFileName);
file.transferTo(destFile);
// 5. OCR识别
String ocrText = performOcr(destFile);
// 6. 构建数据库实体
PoliceDocArchive doc = new PoliceDocArchive();
doc.setDocName(file.getOriginalFilename());
doc.setCaseNo(caseNo);
doc.setDocType(docType);
doc.setSecurityLevel(2); // 默认设为内部
doc.setFilePath(destFile.getAbsolutePath());
doc.setOcrContent(ocrText);
doc.setCreateBy(policeId);
doc.setCreateTime(LocalDateTime.now());
// 7. 入库
mapper.insert(doc);
return "文书上传成功,档案ID:" + doc.getId();
}
private String performOcr(File imageFile) throws Exception {
ITesseract instance = new Tesseract();
instance.setDatapath(tessDataPath);
instance.setLanguage("chi_sim"); // 简体中文
return instance.doOCR(imageFile);
}
}
package com.police.doc.controller;
import com.police.doc.service.DocService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/api/doc")
public class DocController {
@Autowired
private DocService docService;
@PostMapping("/upload")
public Map upload(
@RequestParam("file") MultipartFile file,
@RequestParam("caseNo") String caseNo,
@RequestParam("docType") String docType,
@RequestParam(value = "policeId", defaultValue = "admin") String policeId) {
Map result = new HashMap<>();
try {
String msg = docService.uploadAndProcess(file, caseNo, docType, policeId);
result.put("code", 200);
result.put("message", msg);
} catch (Exception e) {
result.put("code", 500);
result.put("message", "处理失败:" + e.getMessage());
}
return result;
}
}
为了快速验证功能,在src/main/resources/static目录下创建upload.html。这允许直接通过浏览器进行文件上传测试。
公安文书档案上传
公安文书档案录入
完成代码编写后,按照以下步骤启动系统并进行功能验证。
1. 启动项目
在IDEA中直接运行主类,或在项目根目录下执行Maven命令打包运行:
mvn clean package
java -jar target/your-project-name.jar
2. 功能验证步骤
http://localhost:8080/upload.html2023-1001-005(必须符合正则)。3. 结果校验
{"code":200,"message":"文书上传成功,档案ID:1"}。D:/police_docs/)是否已保存文件。SELECT FROM t_police_doc_archive;,验证ocr_content字段是否包含识别出的文字,且case_no正确存储。4. 异常场景测试
.exe文件,系统应返回“非法文件类型”错误。