news 2026/4/25 1:14:26

如何用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/4/24 8:37:50

NCM格式终极解密指南:三步解锁网易云音乐完整播放权限

NCM格式终极解密指南&#xff1a;三步解锁网易云音乐完整播放权限 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的歌曲只能在特定客户端播放而困扰吗&#xff1f;您是否渴望在任何设备上都能自由欣赏那些精心…

作者头像 李华
网站建设 2026/4/22 9:43:29

告别繁琐配置!用GLM-ASR-Nano-2512一键实现会议录音转文字

告别繁琐配置&#xff01;用GLM-ASR-Nano-2512一键实现会议录音转文字 在远程协作日益频繁的今天&#xff0c;如何高效地将会议、讲座或访谈等长音频内容转化为可编辑、可检索的文字稿&#xff0c;已成为职场人士和内容创作者的核心需求。传统人工听写耗时费力&#xff0c;而依…

作者头像 李华
网站建设 2026/4/23 11:45:46

电商商品识别实战:用Qwen3-VL-8B快速搭建多模态系统

电商商品识别实战&#xff1a;用Qwen3-VL-8B快速搭建多模态系统 随着电商平台商品数量的爆炸式增长&#xff0c;自动化、智能化的商品识别与信息提取成为提升运营效率的关键。传统OCR或纯视觉模型在复杂版面、模糊图像或多语言场景下表现受限&#xff0c;而大参数量的多模态模…

作者头像 李华
网站建设 2026/4/20 11:51:39

突破付费墙:免费畅享优质内容的5个实用技巧

突破付费墙&#xff1a;免费畅享优质内容的5个实用技巧 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 想要免费阅读付费新闻和学术论文&#xff1f;Bypass Paywalls Chrome Clean这款…

作者头像 李华
网站建设 2026/4/20 21:05:06

Qwen2.5 vs DeepSeek-V3对比评测:编程任务执行效率分析

Qwen2.5 vs DeepSeek-V3对比评测&#xff1a;编程任务执行效率分析 近年来&#xff0c;大语言模型在代码生成、程序理解与自动化开发等编程相关任务中展现出越来越强的能力。随着通义千问系列推出 Qwen2.5-7B-Instruct&#xff0c;以及 DeepSeek 发布其最新推理优化版本 DeepS…

作者头像 李华
网站建设 2026/4/23 19:10:45

AI智能证件照制作工坊:一键生成多规格证件照教程

AI智能证件照制作工坊&#xff1a;一键生成多规格证件照教程 1. 引言 1.1 业务场景描述 在日常生活中&#xff0c;无论是办理身份证、护照、签证&#xff0c;还是投递简历、报名考试&#xff0c;证件照都是不可或缺的材料。传统方式需要前往照相馆拍摄&#xff0c;耗时耗力&…

作者头像 李华