纯flash网站欣赏沈阳男科医院哪家医院好
2026/6/20 7:36:54 网站建设 项目流程
纯flash网站欣赏,沈阳男科医院哪家医院好,wordpress软件下载源码,怎样做服装厂的企业网站模版如何高效识别票据表格#xff1f;用DeepSeek-OCR-WEBUI SpringBoot轻松搞定 1. 背景与业务场景分析 在企业级应用中#xff0c;大量纸质单据如采购订单、发票、入库单等仍需录入系统。传统人工录入方式效率低、成本高且易出错。随着AI技术的发展#xff0c;基于深度学习的…如何高效识别票据表格用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服务具备以下关键特性多模式识别支持支持document、ocr、figure等多种提示类型其中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 数据流转过程用户上传一张包含表格的票据图片如JPG/PNGSpringBoot 接收 MultipartFile 文件对象使用 RestTemplate 发起 multipart/form-data 请求到/ocr接口设置prompt_typefigure以启用表格识别模式获取响应中的 HTML 表格字符串使用 Jsoup 或正则表达式解析 HTML 表格为 ListMapString, String返回统一格式的 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否识别模式表格识别使用figurefind_termString否查找关键词custom_promptString否自定义提示词groundingBoolean否是否开启分组注意要识别表格请务必设置prompt_typefigure否则无法获得结构化表格输出。5. SpringBoot 集成实现5.1 定义 OcrService 接口// src/main/java/com/kaifamiao/dswebui/service/OcrService.java public interface OcrService { /** * 识别表格图片并返回结构化数据 * * param file 上传的包含表格的图片文件 * return 包含表格数据的Map对象将以JSON格式返回给前端 */ MapString, 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 MapString, 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(); } }; // 构建请求参数 MultiValueMapString, Object body new LinkedMultiValueMap(); body.add(file, resource); body.add(prompt_type, figure); // 关键启用表格识别模式 // 设置请求头 HttpHeaders headers new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); // 创建请求实体 HttpEntityMultiValueMapString, Object requestEntity new HttpEntity(body, headers); // 发送POST请求 ResponseEntityString 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 MapString, 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); ListMapString, String dataList new ArrayList(); ListString 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 { // 数据行 MapString, 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); } } MapString, Object result new HashMap(); result.put(success, true); result.put(data, dataList); result.put(totalRows, dataList.size()); return result; } }依赖库说明需引入jsoup用于HTML解析在pom.xml中添加dependency groupIdorg.jsoup/groupId artifactIdjsoup/artifactId version1.16.1/version /dependency5.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 MapString, Object processFile(RequestParam(file) MultipartFile file) { if (file.isEmpty()) { return Map.of(success, false, message, 文件为空); } try { MapString, 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() ); MapString, 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 trtd序号/tdtd条码/tdtd名称/tdtd单位/td.../tr trtd1/tdtd6949123352617/tdtd飞科PR-5261毛球修剪器/tdtd个/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 打包与运行DockerfileFROM 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.ymlversion: 3.8 services: ocr-app: build: . ports: - 8080:8080 environment: - SERVER_PORT8080 volumes: - ./logs:/app/logs启动应用docker compose up -d --build访问http://localhost:8080即可使用完整系统。8. 总结本文详细介绍了如何利用DeepSeek-OCR-WEBUI SpringBoot实现票据表格的高效识别与结构化提取涵盖从环境部署、接口调用、HTML解析到前后端整合的全流程。核心要点回顾精准识别模式选择使用prompt_typefigure激活表格解析能力是成功的关键。结构化数据转换通过 Jsoup 解析 HTML 表格为 JSON便于前端消费。松耦合架构设计OCR服务独立部署SpringBoot仅作代理与后处理提升系统可维护性。可扩展性强后续可增加字段映射、规则校验、自动入库等功能。该方案已在实际项目中验证平均识别准确率达95%以上显著降低人工录入成本适用于各类需要处理结构化票据的业务场景。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询