news 2026/5/10 20:22:05

如何用DeepSeek-OCR实现票据自动化入库?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用DeepSeek-OCR实现票据自动化入库?

如何用DeepSeek-OCR实现票据自动化入库?

1. 背景与业务场景

在企业日常运营中,采购单、发票、入库单等纸质票据的处理是一项高频且繁琐的任务。传统方式依赖人工逐条录入系统,不仅效率低下,还容易因视觉疲劳或笔误导致数据错误。随着AI技术的发展,光学字符识别(OCR)已成为文档数字化的核心工具。

DeepSeek-OCR 是一款基于深度学习的大模型驱动OCR引擎,具备高精度、多语言支持和复杂场景适应能力。结合其提供的 WebUI 镜像DeepSeek-OCR-WEBUI,开发者可以快速部署并集成到现有业务系统中,实现从拍照→识别→结构化提取→校验→一键入库的全流程自动化。

本文将围绕“票据自动化入库”这一典型场景,详细介绍如何利用 DeepSeek-OCR 实现表格类票据的数据提取,并通过 SpringBoot 应用完成前后端整合,最终构建一个可落地的解决方案。


2. 技术架构与核心组件

2.1 整体架构设计

整个系统采用分层架构设计,主要包括以下模块:

  • 前端采集层:用户通过手机或扫描仪拍摄票据图片
  • OCR服务层:运行DeepSeek-OCR-WEBUI容器,提供 RESTful API 接口
  • 应用服务层:SpringBoot 后端接收请求,调用 OCR 接口并解析结果
  • 数据处理层:将 HTML 表格转换为 JSON 结构,供前端展示与人工校验
  • 持久化层:经确认后写入数据库完成入库操作
[用户上传图片] ↓ [SpringBoot Controller] ↓ [调用 DeepSeek-OCR /ocr 接口 (prompt_type=figure)] ↓ [返回HTML格式表格] ↓ [Java解析HTML → JSON] ↓ [前端展示 + 人工校验] ↓ [点击“确认入库” → 写入DB]

该架构具备良好的扩展性,未来可接入工作流引擎、RPA 自动化流程或审批系统。

2.2 核心技术选型对比

方案准确率(中文表格)部署难度成本是否支持自定义提示
百度OCR云服务★★★★☆简单按量计费
Tesseract OCR★★☆☆☆中等免费
PaddleOCR★★★★☆较高免费有限
DeepSeek-OCR★★★★★低(Docker一键部署)免费开源是(freeform模式)

结论:对于需要高准确率、强中文支持且希望本地化部署的企业场景,DeepSeek-OCR 是当前最优选择之一。


3. DeepSeek-OCR-WEBUI 部署与接口说明

3.1 镜像部署步骤

确保已安装 Docker 和 Docker Compose,推荐使用 NVIDIA GPU(如 4090D)以加速推理。

# 克隆项目 cd ~ git clone https://github.com/deepseek-ai/DeepSeek-OCR-WebUI.git cd DeepSeek-OCR-WebUI # 启动服务(自动拉取镜像) docker compose up -d # 查看日志确认启动成功 docker logs -f deepseek-ocr-webui

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

3.2 OCR API 接口详解

核心接口为POST /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控制输出格式与识别目标
file图片文件(JPG/PNG等)待识别图像
find_term字符串用于字段定位(如“发票号”)
custom_prompt自定义文本freeform模式下使用
groundingtrue/false是否启用实体链接与分组
本案例关键配置:
  • prompt_type=figure:专为图表、公式、表格设计,能保留行列结构
  • 输出内容为标准 HTML<table>标签,便于后续解析

💡 提示:若需新增功能(如添加水印检测),可修改/web_service.py并重新构建镜像。


4. SpringBoot 应用集成实现

4.1 项目结构概览

src/ ├── main/ │ ├── java/com/kaifamiao/dswebui/ │ │ ├── controller/OcrController.java │ │ ├── service/OcrService.java │ │ └── service/DeepSeekOcrService.java │ └── resources/ │ └── static/ ← 前端Vue打包产物 └── test/ └── resources/voucher.jpg ← 测试用票据图片

4.2 OcrService 接口定义

// src/main/java/com/kaifamiao/dswebui/service/OcrService.java public interface OcrService { /** * 识别表格图片并返回结构化数据 * * @param file 上传的包含表格的图片文件 * @return 包含表格数据的Map对象,将以JSON格式返回给前端 */ Map<String, Object> recognitionTable(MultipartFile file); }

4.3 核心实现:调用OCR并解析HTML

// 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 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(); return parseHtmlTableToJSON(htmlContent); } else { throw new RuntimeException("OCR服务调用失败: " + response.getStatusCode()); } } catch (Exception e) { log.error("OCR识别异常", e); throw new RuntimeException("文件处理失败: " + e.getMessage(), e); } } /** * 将HTML表格解析为JSON格式 * * @param html 包含<table>标签的HTML字符串 * @return 转换后的JSON数据(包含表头和行数据) */ private Map<String, Object> parseHtmlTableToJSON(String html) { Document doc = Jsoup.parse(html); Element table = doc.selectFirst("table"); List<Map<String, String>> rows = new ArrayList<>(); if (table == null) { throw new IllegalArgumentException("未找到有效的表格元素"); } Elements trs = table.select("tr"); boolean isFirstRow = true; List<String> headers = new ArrayList<>(); for (Element tr : trs) { Elements tds = tr.select("td,th"); Map<String, 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); row.put("col_" + i, text); } else { String key = i < headers.size() ? headers.get(i) : "col_" + i; row.put(key, text); } } rows.add(row); isFirstRow = false; } Map<String, Object> result = new HashMap<>(); result.put("headers", headers); result.put("data", rows); return result; } }

4.4 控制器暴露API

// 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("OCR识别结果: {}", result); return result; } }

4.5 单元测试验证功能

// 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); } }

5. 前端页面与交互流程

5.1 前端技术栈

  • 框架:Vue 3 + Element Plus
  • 打包工具:Vite
  • 功能模块:
  • 文件上传组件
  • OCR结果预览(表格渲染)
  • 数据校验与编辑
  • “确认入库”按钮触发后端保存

5.2 页面交互逻辑

async handleUpload(file) { const formData = new FormData(); formData.append('file', file.raw); const res = await axios.post('/api/ocr/process', formData, { headers: { 'Content-Type': 'multipart/form-data' } }); this.tableData = res.data.data; // 显示识别结果 this.showVerifyDialog = true; // 弹出校验对话框 }

5.3 构建与部署

# 安装依赖 npm install # 构建生产版本 npm run build # 输出目录:dist/ # 将 dist/* 复制到 SpringBoot 的 src/main/resources/static/ cp -r dist/* src/main/resources/static/

6. Docker 一体化部署

6.1 后端打包

mvn clean package -DskipTests # 生成 target/deepseek-web-ui-1.0.0.jar

6.2 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"]

6.3 docker-compose.yml 统一编排

version: '3.8' services: ocr-app: build: . ports: - "8080:8080" environment: - SERVER_PORT=8080 volumes: - ./logs:/app/logs deepseek-ocr-webui: image: deepseek/ocr-webui:latest ports: - "8081:8080" deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu]

启动命令:

docker compose up -d --build

此时: -http://localhost:8080:前端+SpringBoot应用 -http://localhost:8081:DeepSeek-OCR原始WebUI(可用于调试)


7. 总结

7.1 核心价值总结

通过集成 DeepSeek-OCR-WEBUI,我们实现了票据自动化入库的关键链路:

  • 高精度表格识别prompt_type=figure模式精准还原原始布局
  • 轻量级部署:Docker一键启动,无需复杂环境配置
  • 结构化输出:HTML转JSON,便于前端展示与二次处理
  • 可扩展性强:支持自定义提示词、字段查找、批量处理等高级功能
  • 成本可控:本地化部署避免按次收费,适合高频使用场景

7.2 最佳实践建议

  1. 图像预处理优化:在上传前对图片进行裁剪、去噪、旋转校正,可显著提升识别率
  2. 增加缓存机制:对相同票据做MD5哈希,避免重复识别
  3. 引入置信度反馈:记录低置信度字段,在前端标红提醒人工重点核对
  4. 定期更新模型:关注 DeepSeek 官方仓库,及时升级至最新版本以获得性能提升

获取更多AI镜像

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 5:23:17

戴森球计划FactoryBluePrints蓝图仓库完全使用手册:从入门到精通

戴森球计划FactoryBluePrints蓝图仓库完全使用手册&#xff1a;从入门到精通 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 还在为戴森球计划中复杂的工厂设计而烦恼吗&am…

作者头像 李华
网站建设 2026/5/2 17:41:50

Bootstrap-select 全面解析:打造现代化Web应用的下拉选择利器

Bootstrap-select 全面解析&#xff1a;打造现代化Web应用的下拉选择利器 【免费下载链接】bootstrap-select 项目地址: https://gitcode.com/gh_mirrors/boo/bootstrap-select 在现代Web开发中&#xff0c;用户体验的优化已成为项目成功的关键因素。原生HTML下拉框在功…

作者头像 李华
网站建设 2026/5/1 11:20:15

Hunyuan MT1.5-1.8B实战教程:构建高精度民汉互译系统

Hunyuan MT1.5-1.8B实战教程&#xff1a;构建高精度民汉互译系统 1. 引言 随着多语言交流需求的不断增长&#xff0c;尤其是在民族地区与主流汉语之间的信息互通场景中&#xff0c;高效、准确、轻量化的机器翻译系统成为关键基础设施。然而&#xff0c;传统大模型往往依赖高算…

作者头像 李华
网站建设 2026/5/1 4:10:36

电商客服实战:基于DeepSeek-R1的智能问答系统搭建

电商客服实战&#xff1a;基于DeepSeek-R1的智能问答系统搭建 1. 项目背景与核心需求 随着电商平台用户规模持续增长&#xff0c;传统人工客服在应对高频、重复性咨询时面临响应延迟高、人力成本攀升等挑战。尤其在大促期间&#xff0c;瞬时咨询量激增导致服务体验下降&#…

作者头像 李华
网站建设 2026/5/5 7:12:06

UI-TARS桌面版全面解析:智能GUI助手配置与实战指南

UI-TARS桌面版全面解析&#xff1a;智能GUI助手配置与实战指南 【免费下载链接】UI-TARS-desktop A GUI Agent application based on UI-TARS(Vision-Lanuage Model) that allows you to control your computer using natural language. 项目地址: https://gitcode.com/GitHu…

作者头像 李华
网站建设 2026/4/17 18:25:26

MobaXterm中文版终极指南:5步掌握远程服务器高效管理

MobaXterm中文版终极指南&#xff1a;5步掌握远程服务器高效管理 【免费下载链接】Mobaxterm-Chinese Mobaxterm simplified Chinese version. Mobaxterm 的简体中文版. 项目地址: https://gitcode.com/gh_mirrors/mo/Mobaxterm-Chinese MobaXterm中文版是专为Windows用…

作者头像 李华