当前位置: 首页 > news >正文

DeepSeek-OCR实战(06):SpringBoot应用接入

前一章部署了DeepSeek-OCR-WebUI ,它本身提供了API接口,这样在业务应用可以直接接入。本章将DeepSeek-OCR 接入到SpringBoot应用中,实现表格数据识别。

应用系统中通常会有一些单据需要入库,而入库单有些时候是纸质的,每条信息都录入费时费力,此时可以将单据使用手机对单据进行拍照,让应用识别提取,提取后人工进行校验,校验完毕一键入库。

1.启动DeepSeek-OCR-WebUI后端服务

要保证前一章节《DeepSeek-OCR实战(05):DeepSeek-OCR-WebUI部署(Docker)》 已经完整部署好。它提供了API接口。

cd ~/DeepSeek-OCR-WebUI
docker compose up -d # 查看docker日志
docker logs -f deepseek-ocr-webui

2.接口

代码:/home/qy/DeepSeek-OCR-WebUI/web_service.py

@app.post("/ocr")
async def ocr_endpoint(file: UploadFile = File(...),prompt_type: str = Form("document"),find_term: str = Form(""),custom_prompt: str = Form(""),grounding: bool = Form(False)
):
  • 上传的图片文件
  • prompt_type:可传入的值有
    • document : 文档转Markdown,保留格式和布局,适用场景:合同、论文、报告
    • ocr: 通用OCR,提取所有可见文字, 适用场景:图片文字提取
    • free: 纯文本提取,纯文本不保留格式,适用场景:简单文本识别
    • figure: 图表解析,识别图表和公式,适用场景:数据图表、数学公式。 本章就是要识别表格,所以使用这个参数
    • describe:图像描述,生成详细描述,适用场景:图片理解、无障碍
    • find: 查找定位,查找并标注位置,适用场景:发票字段定位
    • freeform: 自定义提示词,自定义识别需求。适用场景:灵活的识别任务
  • find_term: 要查找/标注的信息
  • custom_prompt: 自定义提示词
  • grounding :分组

如果要扩展这个接口,可以直接修改/home/qy/DeepSeek-OCR-WebUI/web_service.py Python代码。但是修改完毕之后,要重新build镜像

3.SpringBoot接入

API服务已经启动,SpringBoot接入的方式就是发送Http请求给DeepSeek-OCR-WebUI 接口获取数据。本节目的很明确,就是要识别表格。API 返回的是 HTML代码。SpringBoot拿到HTML代码后,将数据转换为 JSON格式,HTML代码结构如下:

<table><tr><td>序号</td><td>条码</td><td>名称</td><td>单位</td><td>订货数量</td><td>采购数量</td><td>赠送数量</td><td>采购单价</td><td>金额小计</td><td>备注</td></tr><tr><td>1</td><td>6949123352617</td><td>飞科PR-5261毛球修剪器</td><td></td><td>0.00</td><td>1.00</td><td>0.00</td><td>38.5000</td><td>38.5000</td><td></td></tr><tr><td>2</td><td>6944296500049</td><td>天香炸酱面180g*50</td><td></td><td>0.00</td><td>1.00</td><td>0.00</td><td>0.0000</td><td>0.0000</td><td></td></tr><tr><td>3</td><td>6901826260159</td><td>南孚NF-1620锂电子</td><td></td><td>0.00</td><td>0.00</td><td>1.00</td><td>2.4000</td><td>0.0000</td><td></td></tr><tr><td>总计</td><td></td><td></td><td></td><td>0.00</td><td>2.00</td><td>1.00</td><td>0.0000</td><td>38.5000</td><td></td></tr></table>

3.1 OcrService接口

// src/main/java/com/kaifamiao/dswebui/service/OcrService.java
public interface OcrService {/*** 识别表格图片并返回结构化数据** @param file 上传的包含表格的图片文件* @return 包含表格数据的Map对象,将以JSON格式返回给前端*/Map<String, Object> recognitionTable(MultipartFile file);
}

3.2接口实现

详情请访问文末代码仓库地址获取

//src/main/java/com/kaifamiao/dswebui/service/DeepSeekOcrService.java
@Service
@Slf4j
public class DeepSeekOcrService implements OcrService {@Overridepublic Map<String, Object> recognitionTable(MultipartFile file) {log.info("name===>{}", file.getOriginalFilename());try {// 创建RestTemplate实例...// 准备文件资源...// 准备请求参数...// 设置请求头...// 创建请求实体...// 发送POST请求到OCR服务...// 解析HTML表格并转换为JSONreturn parseHtmlTableToJSON(responseHtml);} catch (Exception e) {...}}/*** 将HTML表格解析为JSON格式** @param html 包含表格的HTML字符串* @return 转换后的JSON数据*/private Map<String, Object> parseHtmlTableToJSON(String html) {...return result;}}

写个测试用例测试一下,将要测试的图片放到 src/test/resources/voucher.jpg

// src/test/java/com/kaifamiao/dswebui/service/OcrServiceTest.java
@SpringBootTest
@Slf4j
public class OcrServiceTest {@Autowiredprivate OcrService ocrService;@Testvoid testRecognitionTableSuccess() throws Exception {// 从测试资源目录加载voucher.jpg文件ClassPathResource resource = new ClassPathResource("voucher.jpg");// 创建MultipartFile对象MockMultipartFile file = new MockMultipartFile("file","voucher.jpg","image/jpeg",resource.getInputStream());// 调用OCR服务进行识别Map<String, Object> result = ocrService.recognitionTable(file);log.info("OCR识别结果: {}", JSON.toJSONString(result));}}

3.3Controller

// src/main/java/com/kaifamiao/dswebui/controller/OcrController.java@RestController
@RequestMapping("/api/ocr")
@Slf4j
public class OcrController {@Autowiredprivate OcrService ocrService;@PostMapping("/process")public Map<String, Object> processFile(@RequestParam("file") MultipartFile file) {Map<String, Object> stringObjectMap = ocrService.recognitionTable(file);log.info("result===>{}", stringObjectMap);return stringObjectMap;}
}

4.前端页面

项目有个ui是使用VUE写的一个操作界面。 自行查看代码。

编译打包:要安装NodeJS 20 以上版本。

npm i
npm run build

将生成的dist 下文件拷贝到SpringBoot项目中

5.后端打包

6.docker启动

# Dockerfile
# Java运行时阶段
FROM openjdk:21-jdk-slim# 设置工作目录
WORKDIR /app# 复制前端构建产物到后端静态资源目录
COPY deepseek-webui/target/deepseek-web-ui-1.0.0.jar /app/deepseek-web-ui.jar# 暴露端口
EXPOSE 8080# 运行应用
ENTRYPOINT ["java", "-jar", "deepseek-web-ui.jar"]
# docker-compose.yml
version: '3.8'services:ocr-app:build: .ports:- "8080:8080"environment:- SERVER_PORT=8080volumes:- ./logs:/app/logs

准备好docker 环境:

docker compose up -d --build

源代码地址: https://github.com/kaiwill/kaifamiao-ocr

http://www.dtcms.com/a/606072.html

相关文章:

  • 三十、STM32的USART (串口发送+接收)
  • WebSocket-学习调研
  • GPU-Initiated Networking (GIN)及其核心硬件基础 SCI
  • 怎么提高网站加载速度工资卡app下载
  • 【Rust】系统编程语言的核心语法以及常见应用场景浅谈:系统、Web、网络、命令行
  • 网站建设哪公司好上饶市建设局有什么网站
  • 网站黄金比例如何在已建设好的网站做修改
  • 新网站seo优化wordpress前台出现旧版文件
  • HarmonyOS:@State 装饰器——组件内状态
  • 网站维护与建设腾讯企点是什么
  • ListBox控件扩展内容高度自适应,添加图标
  • 如何将短信从安卓手机传输到电脑
  • 带复选框的combox
  • 门户网站开发价格郑州网站建设(智巢)
  • 主从服务器配置
  • 批量坐标转换(Excel版)
  • 在线C语言编译 | 简化开发流程,提升编程效率
  • 建筑企业网站源码免费创业平台
  • 基于Python野生植物识别应用模型的研究
  • BuildingAI技术架构文档
  • 网站技术支持衡水网站公司
  • 一站式做网站哪家专业wordpress保存远程图片
  • WPS Office v18.22.0 国际版
  • 基于Matlab的数字基带通信系统仿真与性能分析
  • Types of Attributes|属性类型
  • 哈尔滨php网站开发公司深圳做网站 肖先生
  • 户用光伏向阳台转移 阳台光伏开启能源新纪元
  • 11月13日numpy总结——花哨的索引
  • 云望物联无人机图传系统与通信技术的全面解析
  • Google政策大更新:涉及金融(个人贷款),社交约会与游戏(未成年人相关),健康等所有类别App