news 2026/4/3 4:22:32

如何用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/3/27 22:07:22

如何高效批量抠图?试试CV-UNet大模型镜像,简单又实用

如何高效批量抠图&#xff1f;试试CV-UNet大模型镜像&#xff0c;简单又实用 1. 引言&#xff1a;图像抠图的现实挑战与技术演进 在电商、广告设计、内容创作等领域&#xff0c;高质量的图像抠图是一项高频且关键的需求。传统手动抠图依赖专业软件和熟练操作&#xff0c;效率…

作者头像 李华
网站建设 2026/3/31 4:00:09

戴森球计划FactoryBluePrints蓝图选择完美攻略:从零开始打造高效工厂

戴森球计划FactoryBluePrints蓝图选择完美攻略&#xff1a;从零开始打造高效工厂 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 还在为戴森球计划中复杂的工厂布局而烦恼吗…

作者头像 李华
网站建设 2026/3/27 8:59:12

Qwen All-in-One镜像部署:无需ModelScope更稳定

Qwen All-in-One镜像部署&#xff1a;无需ModelScope更稳定 1. 章节概述 1.1 技术背景与问题提出 在边缘计算和资源受限场景中&#xff0c;AI模型的部署面临显存不足、依赖复杂、启动缓慢等核心挑战。传统做法通常采用“多模型拼接”架构&#xff0c;例如使用 BERT 类模型处…

作者头像 李华
网站建设 2026/3/31 15:24:40

网络资源拦截下载技术深度解析:从原理到实战

网络资源拦截下载技术深度解析&#xff1a;从原理到实战 【免费下载链接】res-downloader 资源下载器、网络资源嗅探&#xff0c;支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://gitcode.com/GitHub_T…

作者头像 李华
网站建设 2026/3/29 6:15:37

Campus-iMaoTai茅台自动预约系统:告别手动抢购,实现智能预约

Campus-iMaoTai茅台自动预约系统&#xff1a;告别手动抢购&#xff0c;实现智能预约 【免费下载链接】campus-imaotai i茅台app自动预约&#xff0c;每日自动预约&#xff0c;支持docker一键部署 项目地址: https://gitcode.com/GitHub_Trending/ca/campus-imaotai 还在…

作者头像 李华
网站建设 2026/3/31 8:32:32

BGE-M3技术深度:向量空间中的语义理解机制

BGE-M3技术深度&#xff1a;向量空间中的语义理解机制 1. 引言&#xff1a;语义相似度在现代AI系统中的核心地位 随着大语言模型&#xff08;LLM&#xff09;和检索增强生成&#xff08;RAG&#xff09;架构的广泛应用&#xff0c;如何准确衡量文本之间的语义相似度已成为构建…

作者头像 李华