news 2026/3/13 22:54:49

如何用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/3/12 21:47:15

终极指南:3种方法快速解密网易云音乐NCM加密文件

终极指南&#xff1a;3种方法快速解密网易云音乐NCM加密文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他设备播放而烦恼吗&#xff1f;NCMDump开源工具为你提供完美解决方案&#x…

作者头像 李华
网站建设 2026/3/13 14:54:59

如何用Blender3mfFormat插件打造完美的3D打印工作流?

如何用Blender3mfFormat插件打造完美的3D打印工作流&#xff1f; 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 还在为3D打印过程中的材质丢失和颜色失真而烦恼吗&#…

作者头像 李华
网站建设 2026/2/27 21:14:45

hbuilderx制作网页操作详解:代码片段与自定义模板设置

如何用 HBuilderX 高效制作网页&#xff1a;从代码片段到自定义模板的实战指南你有没有过这样的经历&#xff1f;每次新建一个 HTML 文件&#xff0c;都要重复写一遍<!DOCTYPE html>、<meta charset"UTF-8">&#xff0c;甚至还要手动加上 viewport 和兼容…

作者头像 李华
网站建设 2026/3/7 7:26:46

终极AI游戏辅助:BetterGI一键自动化原神任务完整指南

终极AI游戏辅助&#xff1a;BetterGI一键自动化原神任务完整指南 【免费下载链接】better-genshin-impact &#x1f368;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动派遣 | 一键强化 - UI Automation Testing Tools For …

作者头像 李华
网站建设 2026/3/11 6:06:23

IDE试用期重置终极指南:轻松延长你的开发环境使用期限

IDE试用期重置终极指南&#xff1a;轻松延长你的开发环境使用期限 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 你是否曾经遇到过这样的困扰&#xff1a;正当你沉浸在代码创作中时&#xff0c;IDE突然弹出试用期…

作者头像 李华
网站建设 2026/3/2 20:05:49

MinerU如何切换CPU模式?device-mode配置修改指南

MinerU如何切换CPU模式&#xff1f;device-mode配置修改指南 1. 背景与使用场景 在处理复杂PDF文档时&#xff0c;MinerU凭借其强大的多模态能力&#xff0c;能够精准提取文本、表格、公式和图像&#xff0c;并将其转换为结构清晰的Markdown格式。该技术特别适用于科研论文、…

作者头像 李华