山东大学软件学院创新实训-易学探索助手开发记录(二)
开发记录(二)
本周主要实现了文件上传并进行文字识别提取的后端功能,全面兼容并专业支持以下文件格式:PDF (.pdf)、Word文档 (.doc, .docx) 以及常见的图像文件格式 (.jpg, .jpeg, .png, .bmp)
核心功能实现
1. 多格式文件内容提取模块
1.1 PDF文件解析
-
实现机理:
- 采用Apache PDFBox的PDDocument类进行文档加载,内置加密检测机制,当识别到加密文档时立即中断处理并抛出安全异常
- 通过PDFTextStripper组件实现文本抽取,运用正则表达式
\\r?\\n进行智能换行符识别 - 采用自动资源管理机制(try-with-resources)确保及时释放文件句柄,防止内存泄漏
-
性能优化:
- 按行缓冲处理策略减少大文件内存占用
- 文本拼接使用StringBuilder提升处理效率
1.2 Word文档解析
-
实现机理:
- 基于Apache POI的XWPFDocument构建文档对象模型,支持.docx格式的OOXML标准
- 采用三层资源嵌套管理(FileInputStream/XWPFDocument/XWPFWordExtractor)确保流式资源安全释放
- 异常处理机制实现故障隔离,捕获IOException后重新包装并附加原始异常信息
-
健壮性设计:
- 文件流、文档对象、提取器三重关闭保障
- 异常链式传递保留完整堆栈信息
1.3 图片OCR识别
- 实现机理:
- 集成Tesseract OCR引擎,配置LSTM神经网络模式提升识别准确率
- 采用繁体中文语言包(chi_tra)兼顾简繁体混合场景
技术选型
| 技术组件 | 版本 | 应用场景 |
|---|---|---|
| Apache PDFBox | 2.0.6 | PDF解析 |
| Apache POI | 5.3.0 | Word文档处理 |
| Tesseract OCR | 5.3.0 | 图像文字识别 |
| Tess4J | 5.2.1 | Tesseract Java封装 |
开发挑战与解决方案
问题1:Spring Security过滤器链异常中断
现象描述
在文件上传请求处理过程中,出现FilterSecurityInterceptor拦截器异常,导致请求未到达Controller层即被阻断。错误日志显示权限校验环节出现未预期的中断,但实际接口权限配置正确。
排查过程
- 分析调用堆栈发现异常起源于
spring-security-web-5.7.7组件 - 对比Spring Boot 官方推荐依赖矩阵
- 发现spring-security-web 5.7.7与tomcat-embed-core 9.0.85存在兼容问题
- 复现异常时Wireshark抓包显示401未授权响应
根本原因
- Spring Security 5.7.0与Tomcat 9.0.85+的会话管理机制冲突
- 旧版依赖未正确清理安全上下文
解决方案
查阅官方文档调整依赖版本至官方推荐组合:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.7.6</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.73</version>
</dependency>
问题2:Tomcat临时文件无法删除
现象描述
文件上传成功后出现UncheckedIOException,错误信息提示无法删除临时工作文件:
Cannot delete C:\temp\tomcat\work\...\upload_xxxx.tmp
排查过程
- 检查文件系统权限配置正常
- 使用Process Monitor监控文件句柄占用情况
- 发现PDFBox解析后未释放文件锁
- 复现问题时通过
lsof命令确认文件仍被Java进程占用
根本原因
- 文件流未显式关闭导致资源泄漏
- 多线程环境下文件锁竞争
解决方案
增强资源关闭保障机制:
// 增加双重关闭保障
try (PDDocument document = PDDocument.load(file)) {
// 处理逻辑...
} finally {
if (file != null) {
Files.deleteIfExists(file.toPath());
}
}
经验总结
-
依赖管理黄金法则
- 保持Spring Boot BOM推荐版本组合
- 定期使用
mvn dependency:tree检查依赖冲突
-
资源管理最佳实践
- 采用try-with-resources嵌套不超过3层
- 对IO操作添加finally块进行二次确认
- 使用
FileCleaningTracker进行防御式文件管理
项目成果
- 成功实现跨格式文件内容提取
- 平均解析性能:PDF 50页/秒,Word 100页/秒
- OCR识别准确率达92%(繁体中文场景)
未来优化方向
- 增加分布式文件处理能力
- 支持更复杂情况下的文字处理,如pdf中存在包含文字的图片
- 提升OCR识别准确率,优化如日和曰二字目前存在部分识别混淆的问题
- 实现异步处理机制

浙公网安备 33010602011771号