山东大学软件学院创新实训-易学探索助手开发记录(二)

开发记录(二)

本周主要实现了文件上传并进行文字识别提取的后端功能,全面兼容并专业支持以下文件格式: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层即被阻断。错误日志显示权限校验环节出现未预期的中断,但实际接口权限配置正确。

排查过程

  1. 分析调用堆栈发现异常起源于spring-security-web-5.7.7组件
  2. 对比Spring Boot 官方推荐依赖矩阵
  3. 发现spring-security-web 5.7.7与tomcat-embed-core 9.0.85存在兼容问题
  4. 复现异常时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

排查过程

  1. 检查文件系统权限配置正常
  2. 使用Process Monitor监控文件句柄占用情况
  3. 发现PDFBox解析后未释放文件锁
  4. 复现问题时通过lsof命令确认文件仍被Java进程占用

根本原因

  • 文件流未显式关闭导致资源泄漏
  • 多线程环境下文件锁竞争

解决方案
增强资源关闭保障机制:

// 增加双重关闭保障
try (PDDocument document = PDDocument.load(file)) {
    // 处理逻辑...
} finally {
    if (file != null) {
        Files.deleteIfExists(file.toPath());
    }
}

经验总结

  1. 依赖管理黄金法则

    • 保持Spring Boot BOM推荐版本组合
    • 定期使用mvn dependency:tree检查依赖冲突
  2. 资源管理最佳实践

    • 采用try-with-resources嵌套不超过3层
    • 对IO操作添加finally块进行二次确认
    • 使用FileCleaningTracker进行防御式文件管理

项目成果

  • 成功实现跨格式文件内容提取
  • 平均解析性能:PDF 50页/秒,Word 100页/秒
  • OCR识别准确率达92%(繁体中文场景)

未来优化方向

  1. 增加分布式文件处理能力
  2. 支持更复杂情况下的文字处理,如pdf中存在包含文字的图片
  3. 提升OCR识别准确率,优化如日和曰二字目前存在部分识别混淆的问题
  4. 实现异步处理机制

项目源码:[https://gitee.com/xmsx_1/yitan]

posted @ 2025-03-29 16:47  htekye  阅读(57)  评论(0)    收藏  举报