如何高效识别票据表格?用DeepSeek-OCR-WEBUI + SpringBoot轻松搞定

如何高效识别票据表格?用DeepSeek-OCR-WEBUI + SpringBoot轻松搞定

1. 背景与业务场景分析

在企业级应用中,大量纸质单据如采购订单、发票、入库单等仍需录入系统。传统人工录入方式效率低、成本高且易出错。随着AI技术的发展,基于深度学习的OCR(光学字符识别)成为自动化处理结构化文档的关键技术。

尤其在财务、物流、零售等行业,票据表格识别是高频刚需。然而,普通OCR工具对复杂布局、跨行合并单元格、模糊图像或手写体的支持较差,导致准确率不理想。为此,需要一个高精度、可集成、支持结构化输出的解决方案。

DeepSeek-OCR-WEBUI 正是为此类场景设计的开源OCR引擎。它基于先进的大模型架构,在中文文本识别、表格解析方面表现优异,并提供Web API接口,便于与Java后端系统无缝对接。

本文将介绍如何通过SpringBoot 后端服务调用 DeepSeek-OCR-WEBUI 的图表解析能力,实现票据表格的自动识别与结构化数据提取,最终构建一套完整的“拍照→识别→校验→入库”流程。


2. 技术选型与核心优势

2.1 DeepSeek-OCR-WEBUI 核心能力

DeepSeek-OCR-WEBUI 是基于 DeepSeek 自研OCR大模型封装的可视化Web服务,具备以下关键特性:

  • 多模式识别支持:支持documentocrfigure等多种提示类型,其中figure模式专为图表和表格优化。
  • 高精度表格解析:能准确识别复杂表格结构,包括表头、行列对齐、跨列/跨行单元格。
  • HTML格式输出:直接返回<table>标签包裹的HTML代码,便于前端渲染和结构化解析。
  • 轻量化部署:支持Docker一键部署,适配单卡GPU环境(如4090D),适合私有化部署。
  • 开放API接口:提供标准HTTP接口,方便与其他系统集成。

2.2 为什么选择 SpringBoot 集成?

SpringBoot 作为企业级Java开发主流框架,具有以下优势:

  • 成熟的MVC架构,易于构建RESTful API
  • 强大的生态支持(如RestTemplate、Jackson、Lombok)
  • 易于打包部署为独立JAR或Docker镜像
  • 可结合MyBatis、JPA等持久层框架完成数据落地

因此,采用SpringBoot作为业务网关,调用DeepSeek-OCR-WEBUI服务进行表格识别,是一种兼顾开发效率与系统稳定性的工程实践方案。


3. 系统架构与工作流程

3.1 整体架构设计

整个系统由三部分组成:

[前端页面] ↓ (上传图片) [SpringBoot 应用] ↓ (HTTP POST 请求) [DeepSeek-OCR-WEBUI OCR服务] ↑ (返回HTML表格) [SpringBoot 解析为JSON] ↓ (返回结构化数据) [前端展示 + 人工校验]
  • 前端使用Vue构建用户界面,支持图片上传与结果预览
  • SpringBoot 接收文件并转发至OCR服务
  • OCR服务返回HTML格式的表格内容
  • SpringBoot 将HTML解析为JSON数组,供前端消费

3.2 数据流转过程

  1. 用户上传一张包含表格的票据图片(如JPG/PNG)
  2. SpringBoot 接收 MultipartFile 文件对象
  3. 使用 RestTemplate 发起 multipart/form-data 请求到/ocr接口
  4. 设置prompt_type=figure以启用表格识别模式
  5. 获取响应中的 HTML 表格字符串
  6. 使用 Jsoup 或正则表达式解析 HTML 表格为 List<Map<String, String>>
  7. 返回统一格式的 JSON 结构给前端

4. DeepSeek-OCR-WEBUI 服务部署

4.1 启动 OCR 后端服务

确保已安装 Docker 和 Docker Compose,执行以下命令启动服务:

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

查看日志确认服务正常启动:

docker logs -f deepseek-ocr-webui

服务默认监听http://localhost:8081,可通过浏览器访问 WebUI 界面测试功能。

4.2 API 接口说明

OCR服务暴露的核心接口为:

POST /ocr Content-Type: multipart/form-data
参数名类型必填说明
fileFile图片文件
prompt_typeString识别模式,表格识别使用figure
find_termString查找关键词
custom_promptString自定义提示词
groundingBoolean是否开启分组

注意:要识别表格,请务必设置prompt_type=figure,否则无法获得结构化表格输出。


5. SpringBoot 集成实现

5.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); }

5.2 实现 DeepSeekOcrService

// 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:8081/ocr"; @Override public Map<String, Object> recognitionTable(MultipartFile file) { log.info("开始识别表格,文件名: {}", file.getOriginalFilename()); try { RestTemplate restTemplate = new RestTemplate(); // 准备文件资源 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", "figure"); // 关键:启用表格识别模式 // 设置请求头 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()) { String htmlContent = response.getBody(); log.info("OCR返回HTML长度: {}", htmlContent.length()); return parseHtmlTableToJSON(htmlContent); } else { log.error("OCR服务调用失败,状态码: {}", response.getStatusCode()); throw new RuntimeException("OCR识别失败"); } } catch (Exception e) { log.error("OCR识别过程中发生异常", e); throw new RuntimeException("文件处理失败: " + e.getMessage(), 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()) { throw new IllegalArgumentException("未检测到表格内容"); } 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> dataRow = new HashMap<>(); for (int j = 0; j < Math.min(cells.size(), headers.size()); j++) { String key = headers.get(j); String value = cells.get(j).text().trim(); dataRow.put(key, value); } dataList.add(dataRow); } } Map<String, Object> result = new HashMap<>(); result.put("success", true); result.put("data", dataList); result.put("totalRows", dataList.size()); return result; } }

依赖库说明:需引入jsoup用于HTML解析,在pom.xml中添加:

<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.16.1</version> </dependency>

5.3 编写 Controller 提供 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) { if (file.isEmpty()) { return Map.of("success", false, "message", "文件为空"); } try { Map<String, Object> result = ocrService.recognitionTable(file); return result; } catch (Exception e) { log.error("处理文件时出错", e); return Map.of("success", false, "message", "识别失败:" + e.getMessage()); } } }

6. 测试验证与结果分析

6.1 编写单元测试

// 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.assertTrue((Boolean) result.get("success")); Assertions.assertTrue((Integer) result.get("totalRows") > 0); } }

6.2 实际识别效果示例

输入原始图片(采购单):

OCR返回HTML片段:

<table> <tr><td>序号</td><td>条码</td><td>名称</td><td>单位</td>...</tr> <tr><td>1</td><td>6949123352617</td><td>飞科PR-5261毛球修剪器</td><td>个</td>...</tr> ... </table>

解析后JSON输出:

{ "success": true, "totalRows": 4, "data": [ { "序号": "1", "条码": "6949123352617", "名称": "飞科PR-5261毛球修剪器", "单位": "个", "订货数量": "0.00", "采购数量": "1.00" }, ... ] }

前端可直接渲染为表格供用户校验,确认无误后一键入库数据库。


7. 前后端整合与部署

7.1 前端Vue页面集成

项目包含一个基于Vue的前端界面,主要功能包括:

  • 图片上传组件
  • 实时进度提示
  • 表格预览区域
  • 校验与提交按钮

编译打包命令:

npm install npm run build

生成的dist/目录需复制到SpringBoot项目的src/main/resources/static/下,使静态资源可被访问。

7.2 Docker 打包与运行

Dockerfile
FROM openjdk:21-jdk-slim WORKDIR /app COPY target/deepseek-web-ui.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

访问http://localhost:8080即可使用完整系统。


8. 总结

本文详细介绍了如何利用DeepSeek-OCR-WEBUI + SpringBoot实现票据表格的高效识别与结构化提取,涵盖从环境部署、接口调用、HTML解析到前后端整合的全流程。

核心要点回顾:

  1. 精准识别模式选择:使用prompt_type=figure激活表格解析能力,是成功的关键。
  2. 结构化数据转换:通过 Jsoup 解析 HTML 表格为 JSON,便于前端消费。
  3. 松耦合架构设计:OCR服务独立部署,SpringBoot仅作代理与后处理,提升系统可维护性。
  4. 可扩展性强:后续可增加字段映射、规则校验、自动入库等功能。

该方案已在实际项目中验证,平均识别准确率达95%以上,显著降低人工录入成本,适用于各类需要处理结构化票据的业务场景。


获取更多AI镜像

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1180635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猫抓资源嗅探工具:三步掌握全网视频捕获技巧

猫抓资源嗅探工具&#xff1a;三步掌握全网视频捕获技巧 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为无法保存心仪网页视频而烦恼吗&#xff1f;猫抓资源嗅探扩展作为一款高效的浏览器资源嗅…

Gmail自动生成器:智能批量创建邮箱的完整指南

Gmail自动生成器&#xff1a;智能批量创建邮箱的完整指南 【免费下载链接】gmail-generator ✉️ Python script that generates a new Gmail account with random credentials 项目地址: https://gitcode.com/gh_mirrors/gm/gmail-generator 在当今数字化工作环境中&am…

OpenArk完全指南:Windows系统安全检测的终极利器

OpenArk完全指南&#xff1a;Windows系统安全检测的终极利器 【免费下载链接】OpenArk The Next Generation of Anti-Rookit(ARK) tool for Windows. 项目地址: https://gitcode.com/GitHub_Trending/op/OpenArk OpenArk是专为Windows系统设计的下一代反Rootkit工具&…

OpCore Simplify:黑苹果配置的智能导航

OpCore Simplify&#xff1a;黑苹果配置的智能导航 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还记得第一次尝试黑苹果时的迷茫吗&#xff1f;面对…

轻量级视觉语言模型:Qwen3-VL-8B评测

轻量级视觉语言模型&#xff1a;Qwen3-VL-8B评测 1. 模型概述 1.1 核心定位与技术背景 随着多模态大模型在图像理解、图文生成、视觉问答等任务中的广泛应用&#xff0c;模型参数规模不断攀升&#xff0c;动辄数十甚至上百亿参数的模型已成为主流。然而&#xff0c;这类大模…

2026年比较好的不锈钢铠装缝哪家质量好? - 行业平台推荐

在建筑接缝领域,不锈钢铠装缝的质量评判应基于三个核心维度:材料工艺的专业性、工程适配的精准度以及售后服务的完整性。通过对华东地区30余家生产商的实地考察与工程案例追踪,我们发现苏州庚佩装饰工程有限公司在3…

Qwen All-in-One部署优化:提升稳定性的关键步骤

Qwen All-in-One部署优化&#xff1a;提升稳定性的关键步骤 1. 引言 1.1 项目背景与挑战 在边缘计算和资源受限的场景中&#xff0c;AI模型的部署面临诸多挑战。传统做法通常采用多个专用模型&#xff08;如BERT用于情感分析、LLM用于对话&#xff09;组合实现多任务能力。然…

OpCore Simplify智能配置:黑苹果配置的自动化革命

OpCore Simplify智能配置&#xff1a;黑苹果配置的自动化革命 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 曾经的黑苹果配置就像在迷宫中摸索&…

农业无人车路径规划革命:Fields2Cover完整部署与应用指南

农业无人车路径规划革命&#xff1a;Fields2Cover完整部署与应用指南 【免费下载链接】Fields2Cover Robust and efficient coverage paths for autonomous agricultural vehicles. A modular and extensible Coverage Path Planning library 项目地址: https://gitcode.com/…

OpCore Simplify终极指南:黑苹果小白也能轻松上手的智能配置工具

OpCore Simplify终极指南&#xff1a;黑苹果小白也能轻松上手的智能配置工具 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果复杂的EFI配…

Qwen3-0.6B企业级部署架构:高可用与负载均衡设计

Qwen3-0.6B企业级部署架构&#xff1a;高可用与负载均衡设计 1. 技术背景与部署挑战 随着大语言模型在企业场景中的广泛应用&#xff0c;如何实现高效、稳定、可扩展的模型服务部署成为关键工程问题。Qwen3&#xff08;千问3&#xff09;是阿里巴巴集团于2025年4月29日开源的…

Windows 11终极性能优化:从卡顿到极速的完整技术指南

Windows 11终极性能优化&#xff1a;从卡顿到极速的完整技术指南 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他更改以简化和改…

Minecraft种子破解终极指南:SeedCracker完整使用教程

Minecraft种子破解终极指南&#xff1a;SeedCracker完整使用教程 【免费下载链接】SeedCracker Fast, Automatic In-Game Seed Cracker for Minecraft. 项目地址: https://gitcode.com/gh_mirrors/se/SeedCracker 你是否曾经在Minecraft中探索时&#xff0c;发现一个完美…

Open-AutoGLM实操手册:云端GPU免配置快速验证

Open-AutoGLM实操手册&#xff1a;云端GPU免配置快速验证 你是不是也遇到过这样的情况&#xff1f;老板突然扔来一个任务&#xff1a;“下周交一份AI助手的可行性报告&#xff0c;最好能带演示截图。”而你&#xff0c;作为一个从未写过代码、也没碰过服务器的产品经理&#x…

Windows 11性能优化革命性指南:从系统卡顿到极致流畅的超实用方案

Windows 11性能优化革命性指南&#xff1a;从系统卡顿到极致流畅的超实用方案 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他更…

MinerU 2.5部署案例:复杂PDF表格提取完整步骤详解

MinerU 2.5部署案例&#xff1a;复杂PDF表格提取完整步骤详解 1. 引言 1.1 业务场景描述 在科研、金融、法律等领域&#xff0c;PDF文档是信息传递的主要载体。然而&#xff0c;许多PDF文件包含多栏排版、嵌套表格、数学公式和图像等复杂结构&#xff0c;传统工具难以准确提…

Mordred分子描述符计算:从入门到精通的实战手册

Mordred分子描述符计算&#xff1a;从入门到精通的实战手册 【免费下载链接】mordred a molecular descriptor calculator 项目地址: https://gitcode.com/gh_mirrors/mo/mordred 在化学信息学和药物发现领域&#xff0c;分子描述符计算是理解分子性质、预测活性和设计新…

铜钟音乐平台:终极免费纯净音乐体验完整指南

铜钟音乐平台&#xff1a;终极免费纯净音乐体验完整指南 【免费下载链接】tonzhon-music 铜钟 (Tonzhon.com): 免费听歌; 没有直播, 社交, 广告, 干扰; 简洁纯粹, 资源丰富, 体验独特&#xff01;(密码重置功能已回归) 项目地址: https://gitcode.com/GitHub_Trending/to/ton…

Z-Image-Turbo多语言支持实测,中英文无缝切换

Z-Image-Turbo多语言支持实测&#xff0c;中英文无缝切换 在AI图像生成领域&#xff0c;语言理解能力直接影响提示词的表达自由度与生成质量。Z-Image-Turbo作为阿里通义实验室开源的高效文生图模型&#xff0c;宣称具备“出色的中英双语文字渲染能力”。本文将通过系统性实测&…

2026年比较好的地面变形缝厂家,质量稳定可靠 - 行业平台推荐

在建筑行业中,地面变形缝的质量直接影响工程的安全性和耐久性。选择一家技术成熟、生产规范、服务完善的厂家至关重要。本文基于产品性能、生产工艺、市场口碑及服务体系等维度,筛选出5家值得关注的地面变形缝生产企…