2026/4/19 19:06:29
网站建设
项目流程
动漫网站建站目的,推广公司怎么找,国外优秀设计网站有哪些,网站建设方案流程从图片到JSON#xff1a;利用DeepSeek-OCR-WEBUI实现SpringBoot表格数据自动提取
在企业级应用开发中#xff0c;纸质单据、发票、采购表等结构化文档的数字化处理一直是一个高频且繁琐的任务。传统的人工录入方式不仅效率低#xff0c;还容易出错。随着AI技术的发展#…从图片到JSON利用DeepSeek-OCR-WEBUI实现SpringBoot表格数据自动提取在企业级应用开发中纸质单据、发票、采购表等结构化文档的数字化处理一直是一个高频且繁琐的任务。传统的人工录入方式不仅效率低还容易出错。随着AI技术的发展尤其是OCR光学字符识别能力的显著提升我们已经可以借助大模型实现高精度的表格内容自动提取。本文将带你使用DeepSeek-OCR-WEBUI这一基于国产自研大模型的高性能OCR系统结合SpringBoot后端服务完成一个完整的“图片→HTML表格→JSON结构化数据”的自动化流程。最终目标是上传一张包含表格的图片后端调用OCR接口解析内容并以标准JSON格式返回给前端供后续业务系统直接消费。整个过程无需手动编写复杂的图像处理逻辑也不需要训练模型只需合理调用API并做好数据转换即可落地。1. 环境准备与OCR服务部署要实现表格数据提取首先必须确保DeepSeek-OCR-WEBUI已正确部署并提供HTTP API服务。该镜像封装了DeepSeek开源的OCR大模型支持多语言、复杂背景下的文本识别尤其擅长中文场景下的表格和票据解析。1.1 部署OCR后端服务进入项目目录并启动Docker容器cd ~/DeepSeek-OCR-WebUI docker compose up -d启动完成后查看日志确认服务正常运行docker logs -f deepseek-ocr-webui当看到类似Uvicorn running on http://0.0.0.0:8080的输出时说明Web服务已就绪。1.2 OCR核心接口说明DeepSeek-OCR-WEBUI提供了一个/ocr接口用于接收图片并返回识别结果。其定义位于web_service.py文件中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指定识别模式file图片文件JPEG/PNG等待识别的图像对于表格识别任务我们必须选择prompt_typefigure因为该模式专为图表、公式、表格结构设计能保留原始布局信息并输出HTML格式的table标签。提示如果你希望扩展功能如添加新参数或修改返回格式可直接修改web_service.py但修改后需重新构建Docker镜像才能生效。2. SpringBoot项目集成OCR客户端接下来在SpringBoot应用中接入OCR服务实现“图片上传 → 调用OCR → 解析HTML → 返回JSON”的完整链路。2.1 定义OCR服务接口创建OcrService接口声明表格识别方法// src/main/java/com/kaifamiao/dswebui/service/OcrService.java public interface OcrService { /** * 识别表格图片并返回结构化数据 * * param file 上传的包含表格的图片文件 * return 包含表格数据的Map对象将以JSON格式返回给前端 */ MapString, Object recognitionTable(MultipartFile file); }2.2 实现OCR调用逻辑使用RestTemplate发送POST请求到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; 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(); } }; // 构建请求参数multipart/form-data 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); // 发送请求 ResponseEntityString response restTemplate.postForEntity(OCR_SERVICE_URL, requestEntity, String.class); if (response.getStatusCode().is2xxSuccessful()) { String htmlContent response.getBody(); return parseHtmlTableToJSON(htmlContent); } else { log.error(OCR服务调用失败状态码: {}, response.getStatusCode()); throw new RuntimeException(OCR识别失败); } } catch (Exception e) { log.error(OCR识别过程中发生异常, e); throw new RuntimeException(文件处理失败, e); } } /** * 将HTML表格解析为JSON格式 * * param html 包含table标签的HTML字符串 * return 转换后的JSON数据ListMapString, String 形式 */ private MapString, Object parseHtmlTableToJSON(String html) { Document doc Jsoup.parse(html); Element table doc.selectFirst(table); ListMapString, String rows new ArrayList(); if (table ! null) { Elements trList table.select(tr); boolean isFirstRow true; ListString headers new ArrayList(); for (Element tr : trList) { Elements tds tr.select(td); MapString, String row new HashMap(); for (int i 0; i tds.size(); i) { String text tds.get(i).text().trim(); if (isFirstRow) { headers.add(col_ i); // 默认列名 if (!text.isEmpty()) headers.set(i, text); // 使用首行为表头 } else { String key i headers.size() ? headers.get(i) : (col_ i); row.put(key, text); } } if (!isFirstRow) { rows.add(row); } isFirstRow false; } } MapString, Object result new HashMap(); result.put(data, rows); result.put(total, rows.size()); return result; } }核心要点说明使用RestTemplate构造 multipart 请求上传图片。必须设置prompt_typefigure才能触发表格识别逻辑。响应体为纯HTMLtable结构使用Jsoup解析DOM树。自动将第一行作为表头字段名其余每行转为一个MapString, String对象。最终返回结构清晰的JSON包含data数组和总数统计。3. 控制器层暴露REST接口创建控制器类对外提供HTTP接口供前端调用。// 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()) { throw new IllegalArgumentException(上传文件不能为空); } MapString, Object result ocrService.recognitionTable(file); log.info(OCR识别结果: {}, JSON.toJSONString(result)); return result; } }该接口接受名为file的图片上传请求调用服务层完成识别后直接返回JSON结构化数据。例如输入一张采购单截图返回结果示例{ data: [ { 序号: 1, 条码: 6949123352617, 名称: 飞科PR-5261毛球修剪器, 单位: 个, 订货数量: 0.00, 采购数量: 1.00, 赠送数量: 0.00, 采购单价: 38.5000, 金额小计: 38.5000, 备注: }, { 序号: 2, 条码: 6944296500049, 名称: 天香炸酱面180g*50, 单位: 个, 订货数量: 0.00, 采购数量: 1.00, 赠送数量: 0.00, 采购单价: 0.0000, 金额小计: 0.0000, 备注: } ], total: 2 }4. 编写单元测试验证功能为了确保服务稳定性编写JUnit测试用例验证全流程是否通畅。// 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.assertNotNull(result); Assertions.assertTrue(((Integer) result.get(total)) 0); } }运行测试观察日志输出确认能成功解析出表格数据。5. 前端页面集成Vue项目附带了一个基于Vue的简单UI界面用于演示图片上传与结果显示。5.1 页面效果展示用户点击“选择文件”上传图片点击“开始识别”后发送请求至/api/ocr/process后台返回JSON数据并在页面渲染成表格。5.2 构建与部署安装Node.js建议v20执行构建命令npm i npm run build生成的dist目录需复制到SpringBoot项目的静态资源路径下如src/main/resources/static以便内嵌Tomcat直接提供前端页面访问。6. 打包与Docker部署完成前后端开发后进行整体打包并通过Docker部署。6.1 Maven打包后端应用mvn clean package -DskipTests生成jar包target/deepseek-web-ui-1.0.0.jar6.2 编写DockerfileFROM 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]6.3 配置docker-compose.ymlversion: 3.8 services: ocr-app: build: . ports: - 8080:8080 environment: - SERVER_PORT8080 volumes: - ./logs:/app/logs6.4 启动服务docker compose up -d --build访问http://localhost:8080即可打开前端页面开始使用表格识别功能。7. 总结通过本文的实践我们完成了从“图片到JSON”的全自动表格数据提取系统搭建核心步骤包括部署DeepSeek-OCR-WEBUI服务利用其强大的表格识别能力SpringBoot集成OCR客户端通过HTTP调用获取HTML格式表格使用Jsoup解析HTML将其转化为结构化的JSON数据前后端联调与Docker化部署实现一键启动、开箱即用。这套方案特别适用于以下场景财务报销单自动化录入仓库入库单快速登记教育领域成绩单数字化物流运单信息抓取相比传统OCR工具DeepSeek-OCR-WEBUI的优势在于中文识别准确率高支持复杂表格结构还原易于集成、无需训练开源可控、可本地部署未来还可以在此基础上增加人工校验界面、批量处理队列、错误重试机制等功能进一步提升系统的实用性与健壮性。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。