news 2026/2/12 11:05:41

如何用DeepSeek-OCR-WEBUI快速识别业务单据?SpringBoot接入指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用DeepSeek-OCR-WEBUI快速识别业务单据?SpringBoot接入指南

如何用DeepSeek-OCR-WEBUI快速识别业务单据?SpringBoot接入指南

1. 背景与应用场景

在企业级应用中,大量纸质单据如采购订单、发票、物流运单等仍广泛存在。传统的人工录入方式效率低、成本高且容易出错。随着AI技术的发展,光学字符识别(OCR)成为自动化处理这类文档的核心手段。

DeepSeek-OCR-WEBUI 是基于 DeepSeek 开源 OCR 大模型构建的可视化 Web 接口服务,具备强大的文本检测与识别能力,尤其擅长中文复杂场景下的表格、票据和手写体识别。通过将其集成到 SpringBoot 应用中,可以实现“拍照上传 → 自动识别 → 结构化输出 → 人工校验 → 一键入库”的完整流程,显著提升业务处理效率。

本文将详细介绍如何部署 DeepSeek-OCR-WEBUI 并通过 SpringBoot 实现对业务单据中表格数据的自动识别与结构化解析。


2. 环境准备与服务部署

2.1 部署 DeepSeek-OCR-WEBUI 服务

DeepSeek-OCR-WEBUI 提供了完整的 Docker 部署方案,支持 GPU 加速推理(推荐使用 NVIDIA 4090D 单卡环境)。

cd ~/DeepSeek-OCR-WebUI docker compose up -d

启动后可通过日志查看服务状态:

docker logs -f deepseek-ocr-webui

服务默认监听http://localhost:8080,访问该地址即可进入 WebUI 界面进行测试。

注意:确保宿主机已安装 NVIDIA Container Toolkit,并正确配置 GPU 支持。

2.2 API 接口说明

核心 OCR 接口定义位于/home/qy/DeepSeek-OCR-WebUI/web_service.py文件中的/ocr路径:

@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_typedocument,ocr,free,figure,describe,find,freeform指定识别模式。本例中识别表格应使用figure
file图片文件(JPEG/PNG等)待识别的图像
find_term字符串find模式下用于定位特定字段
custom_prompt自定义提示词适用于freeform模式
groundingtrue/false是否启用实体链接与分组

对于表格识别任务,我们选择prompt_type=figure,系统会返回 HTML 格式的<table>结构,便于后续解析为 JSON 数据。


3. SpringBoot 应用集成

3.1 项目结构概览

本 SpringBoot 工程采用标准 MVC 架构,主要模块包括:

  • OcrService:封装调用 OCR 接口的业务逻辑
  • DeepSeekOcrService:具体实现类,负责发送 HTTP 请求并解析响应
  • OcrController:提供 RESTful 接口供前端调用
  • 前端页面基于 Vue 构建,打包后嵌入后端资源目录

依赖管理使用 Maven,需引入以下关键依赖:

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.16.1</version> </dependency> </dependencies>

其中jsoup用于解析 HTML 表格内容。


3.2 定义 OCR 服务接口

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

3.3 实现 OCR 调用逻辑

// src/main/java/com/kaifamiao/dswebui/service/DeepSeekOcrService.java @Service @Slf4j public class DeepSeekOcrService implements OcrService { private static final String OCR_SERVICE_URL = "http://localhost:8080/ocr"; private static final String PROMPT_TYPE = "figure"; @Value("${deepseek.ocr.timeout:5000}") private int timeout; @Override public Map<String, Object> recognitionTable(MultipartFile file) { log.info("开始识别文件: {}", file.getOriginalFilename()); RestTemplate restTemplate = new RestTemplate(); restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); try { // 准备文件资源 ByteArrayResource resource = new ByteArrayResource(file.getBytes()) { @Override public String getFilename() { return file.getOriginalFilename(); } }; // 构建请求参数 MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(); body.add("file", resource); body.add("prompt_type", PROMPT_TYPE); // 设置请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); // 创建请求实体 HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers); // 发送 POST 请求 ResponseEntity<String> response = restTemplate.postForEntity(OCR_SERVICE_URL, requestEntity, String.class); if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) { log.info("OCR 识别成功,返回HTML长度: {}", response.getBody().length()); return parseHtmlTableToJSON(response.getBody()); } else { log.error("OCR 服务返回异常状态码: {}", response.getStatusCode()); throw new RuntimeException("OCR 识别失败"); } } catch (IOException e) { log.error("文件读取失败", e); throw new RuntimeException("文件处理异常", e); } catch (Exception e) { log.error("调用 OCR 服务发生未知错误", e); throw new RuntimeException("OCR 调用失败", e); } } /** * 将HTML表格解析为JSON格式 * * @param html 包含表格的HTML字符串 * @return 转换后的JSON数据 */ private Map<String, Object> parseHtmlTableToJSON(String html) { Document doc = Jsoup.parse(html); Elements tables = doc.select("table"); if (tables.isEmpty()) { log.warn("HTML 中未找到 table 元素"); return Collections.emptyMap(); } Element table = tables.first(); Elements rows = table.select("tr"); List<Map<String, String>> dataList = new ArrayList<>(); List<String> headers = new ArrayList<>(); for (int i = 0; i < rows.size(); i++) { Element row = rows.get(i); Elements cells = row.select("td,th"); if (i == 0) { // 第一行为表头 for (Element cell : cells) { headers.add(cell.text().trim()); } } else { Map<String, String> rowData = new HashMap<>(); for (int j = 0; j < Math.min(headers.size(), cells.size()); j++) { String key = headers.get(j); String value = cells.get(j).text().trim(); rowData.put(key, value); } dataList.add(rowData); } } Map<String, Object> result = new HashMap<>(); result.put("headers", headers); result.put("data", dataList); result.put("totalRows", dataList.size()); return result; } }

3.4 编写单元测试验证功能

// src/test/java/com/kaifamiao/dswebui/service/OcrServiceTest.java @SpringBootTest @Slf4j public class OcrServiceTest { @Autowired private OcrService ocrService; @Test void testRecognitionTableSuccess() throws Exception { ClassPathResource resource = new ClassPathResource("voucher.jpg"); MockMultipartFile file = new MockMultipartFile( "file", "voucher.jpg", "image/jpeg", resource.getInputStream() ); Map<String, Object> result = ocrService.recognitionTable(file); log.info("OCR识别结果: {}", JSON.toJSONString(result)); Assertions.assertNotNull(result.get("data")); Assertions.assertTrue(((List<?>) result.get("data")).size() > 0); } }

测试通过后表明:SpringBoot 成功调用 DeepSeek-OCR-WEBUI 并完成表格结构化提取。


3.5 提供 REST 接口供前端调用

// src/main/java/com/kaifamiao/dswebui/controller/OcrController.java @RestController @RequestMapping("/api/ocr") @Slf4j public class OcrController { @Autowired private OcrService ocrService; @PostMapping("/process") public Map<String, Object> processFile(@RequestParam("file") MultipartFile file) { Map<String, Object> result = ocrService.recognitionTable(file); log.info("返回前端结果,共 {} 条数据", result.getOrDefault("totalRows", 0)); return result; } }

接口路径为/api/ocr/process,接收multipart/form-data类型的图片上传请求,返回 JSON 格式的结构化表格数据。


4. 前端页面集成与展示

4.1 前端架构说明

前端采用 Vue 3 + Element Plus 构建用户界面,主要功能包括:

  • 文件上传组件
  • 图片预览区域
  • 表格识别结果显示
  • 数据导出按钮

项目结构如下:

ui/ ├── public/ ├── src/ │ ├── components/ │ ├── views/OcrPage.vue │ └── App.vue ├── package.json └── vite.config.js

4.2 打包并集成至 SpringBoot

执行构建命令:

npm install npm run build

生成的静态资源位于dist/目录,将其复制到 SpringBoot 项目的src/main/resources/static/下:

src/main/resources/static/index.html src/main/resources/static/assets/

SpringBoot 默认会托管static目录下的静态资源,访问http://localhost:8080即可加载前端页面。


5. 后端打包与容器化部署

5.1 Maven 打包配置

确保pom.xml中配置了正确的打包插件:

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>

执行打包:

mvn clean package -DskipTests

生成 JAR 文件:target/deepseek-web-ui-1.0.0.jar


5.2 Docker 镜像构建

Dockerfile
FROM openjdk:21-jdk-slim WORKDIR /app COPY 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=8080 volumes: - ./logs:/app/logs

启动服务:

docker compose up -d --build

此时整个系统由两个容器组成:

  • deepseek-ocr-webui:运行 OCR 模型推理服务
  • ocr-app:运行 SpringBoot 应用,提供业务接口

两者通过内网通信,实现前后端分离与职责解耦。


6. 总结

本文详细介绍了如何利用 DeepSeek-OCR-WEBUI 快速实现业务单据的自动化识别,并通过 SpringBoot 完成工程化集成。核心要点总结如下:

  1. 高效部署:通过 Docker 一键部署 DeepSeek-OCR-WEBUI,支持 GPU 加速,开箱即用。
  2. 精准识别:选用prompt_type=figure模式,专为图表与表格设计,识别准确率高。
  3. 结构化解析:使用 jsoup 解析 HTML 表格,转换为标准 JSON 格式,便于前端渲染与后续处理。
  4. 全流程闭环:从前端上传 → 后端调用 → OCR 识别 → 数据解析 → 返回结果,形成完整链路。
  5. 可扩展性强:支持自定义提示词、字段查找等功能,未来可拓展至发票识别、证件识别等更多场景。

该方案已在实际项目中验证,能够将原本需要 5 分钟手动录入的单据缩短至 30 秒内完成识别与校验,大幅提升运营效率。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 12:43:40

幼儿园老师必备:Qwen镜像快速制作卡通动物教学素材

幼儿园老师必备&#xff1a;Qwen镜像快速制作卡通动物教学素材 1. 引言 在幼儿教育中&#xff0c;生动有趣的视觉素材能够显著提升孩子们的学习兴趣和认知能力。然而&#xff0c;传统教学素材的获取往往依赖于网络搜索或购买版权素材&#xff0c;不仅耗时耗力&#xff0c;还难…

作者头像 李华
网站建设 2026/2/10 4:17:11

百度网盘提速终极指南:告别限速实现全速下载的完整方案

百度网盘提速终极指南&#xff1a;告别限速实现全速下载的完整方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾经因为百度网盘的龟速下载而焦急等待&#xff1f;面…

作者头像 李华
网站建设 2026/2/2 13:38:25

Switch手柄PC连接终极指南:5分钟搞定Windows游戏控制器配置

Switch手柄PC连接终极指南&#xff1a;5分钟搞定Windows游戏控制器配置 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode…

作者头像 李华
网站建设 2026/2/11 20:38:44

为什么DeepSeek-R1部署总卡顿?保姆级教程一文详解

为什么DeepSeek-R1部署总卡顿&#xff1f;保姆级教程一文详解 1. 背景与问题定位&#xff1a;为何你的DeepSeek-R1运行缓慢&#xff1f; 在大模型本地化部署的实践中&#xff0c;DeepSeek-R1-Distill-Qwen-1.5B 因其出色的逻辑推理能力与轻量化设计备受关注。该模型基于 Deep…

作者头像 李华
网站建设 2026/2/5 9:26:08

League Akari 深度技术评测:重构英雄联盟游戏体验的智能工具集

League Akari 深度技术评测&#xff1a;重构英雄联盟游戏体验的智能工具集 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari …

作者头像 李华
网站建设 2026/2/10 23:44:06

XUnity.AutoTranslator翻译插件:5个秘籍让Unity游戏秒变中文版

XUnity.AutoTranslator翻译插件&#xff1a;5个秘籍让Unity游戏秒变中文版 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 想要畅玩日系Unity游戏却苦于语言障碍&#xff1f;XUnity.AutoTranslator翻译插…

作者头像 李华