图片文本识别OCR+DeepSeekapi实现提取图片关键信息
用到的技术:
通过腾讯OCR文字识别,deepseek的api实现
目录
需求分析:
文字识别(OCR)具体实现步骤
起步工作
代码编写
deepseek整合消息,返回文本关键信息
起步工作
编写工具类
具体调用实现
具体运行结果
需求分析:
需要将任意图片中的信息中提取文字,随后将文字提交给deepseek要求其提取自定义的关键信息
这里以简历为例子,首先将简历的文字识别,随后将简历文字交给deepseek,要求其提取中简历中人员的关键信息并且返回json字符串,从而将字符串来反序列化为对象
文字识别(OCR)具体实现步骤
起步工作
首先在腾讯云中进行登录以及注册,随后进入到腾讯云OCR的快速入门教学(链接:文字识别 一分钟接入服务端 API_腾讯云),跟随教学开通文字识别服务,进入文字识别控制台开通,获取到免费的额度

随后跟随教学页面,获取到我们主要需要的两个参数,文字识别api的sercrekey以及sercrevalue
代码编写
配置文件编写
获取到腾讯OCRapi的secrekey以及sercrevalue之后,我们首先将获取到的这两个写入到配置文件application.yml中,里面放入自己的api的对应的的两个值
TENCENT:TENCENT_SERCREKEY: "xxxxxxxxxxxxxxxxxxxxxxxx"TENCENT_SERCREVALUE: "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
工具类编写
在开始调用文字识别api的时候,我们需要先根据我们获取的api的key以及value来验证并创建认证对象,创建HTTP配置,创建客户端配置来创建OCR客户端实例(用来调用文字识别api)
package cn.enilu.flash.utils;import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.ocr.v20181119.OcrClient;
import com.tencentcloudapi.ocr.v20181119.models.GeneralBasicOCRRequest;
import com.tencentcloudapi.ocr.v20181119.models.GeneralBasicOCRResponse;
import com.tencentcloudapi.ocr.v20181119.models.TextDetection;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class OcrClientUtil {@Value("${TENCENT.TENCENT_SERCREKEY}")private String secretKey;@Value("${TENCENT.TENCENT_SERCREVALUE}")private String secretValue;/*** 创建OCR客户端* @return OCR客户端实例*/public OcrClient createOcrClient() {try {// 创建认证对象,需要提供你api的key以及valueCredential cred = new Credential(secretKey,secretValue);// 创建HTTP配置HttpProfile httpProfile = new HttpProfile();httpProfile.setEndpoint("ocr.tencentcloudapi.com");// 创建客户端配置ClientProfile clientProfile = new ClientProfile();clientProfile.setHttpProfile(httpProfile);// 返回OCR客户端实例return new OcrClient(cred, "", clientProfile);} catch (Exception e) {log.error("创建OCR客户端失败", e);throw new RuntimeException("创建OCR客户端失败", e);}}}
获取到了OCR客户端实例后,就能使用OCR客户端来调用通用文字识别接口,我们需要提供的是pdf文件的链接(注意是链接,不是文件,可以先将文件上传至OSS中获取文件链接)
public String userGeneralBasicOCR(String pdfUrl) {OcrClient client = createOcrClient();// 实例化一个请求对象,每个接口都会对应一个request对象GeneralBasicOCRRequest req = new GeneralBasicOCRRequest();if(pdfUrl == null){throw new RuntimeException("pdfUrl不能为空");}req.setImageUrl(pdfUrl);req.setLanguageType("zh");req.setIsPdf(true);GeneralBasicOCRResponse response=new GeneralBasicOCRResponse();try{response=client.GeneralBasicOCR(req);} catch (TencentCloudSDKException e) {System.out.println(e.toString());}TextDetection[] textDetections = response.getTextDetections();if (textDetections == null || textDetections.length == 0) {throw new RuntimeException("简历信息为空");}StringBuilder detectedTextBuilder = new StringBuilder();for (TextDetection textDetection : textDetections) {detectedTextBuilder.append(textDetection.getDetectedText());}return detectedTextBuilder.toString();}
代码解析
req.setImageUrl(pdfUrl);---》设置要进行文字识别文件的url
req.setLanguageType("zh");---》设置识别文字的语言类型,zh可以实现中英文的识别,想要更多的语言参数设置为auto,自动识别文字内容
GeneralBasicOCRResponse response=new GeneralBasicOCRResponse();获取到文字识别的结果
TextDetection[] textDetections = response.getTextDetections();获取到文字识别内容中的文字内容,文字识别的结果不仅仅包含文字,还有文字的坐标准确度等等,可以自行打印response查看有上面信息
测试类实验
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan(basePackages = "cn.enilu.flash.api")
public class OcrClientUtilTest {@Autowiredprivate OcrClientUtil ocrClientUtil;@Testpublic void tryGetMessage(){//可以不是jpg,也可以是pdf等等String generalBasicOCRResponse = ocrClientUtil.userGeneralBasicOCR("xxxx.pdf");//随后就是直接看答案System.out.println(generalBasicOCRResponse);}}
实验对象

识别结果示例
老鱼简历J 12345678909 java@gmail.com在职资深
Java开发工程师老鱼简历教育经历清华大学计算机科学与技术2019-09 ~ 2023-07
全日制计算机学院专业技能Java熟练掌握Java 后端开发,包括Java 核心技术、Spring 框架、MyBatis 等数据库
老鱼简历老鱼简熟悉关系型数据库(如MySQL)和非关系型数据库(如MongoDB)
,能够编写高效的SQL查询语句网络编程具备网络编程基础,了解TCP/IP、HTTP协议,能够进行网络通信、接口调试等
工作经历ABC科技有限公司2020-01~ 2021-01软件开发部Java 后端开发工程师北京负责公司内部物流管理系统的开发和维护,参与需求分析、数据库设计、接口开发等工作,主要使用Java、Spring Boot、MySQL 等技术。解决了系统性能瓶颈问题,优化了查询速度,提升了用户体验。
XYZ软件公司2019-01~2020-01云计算部Java 开发工程师上海参与公司自研云平台的开发与维护,负责用户管理、权限控制、日志记录等功能模块的设计和实现。使用Java、Spring Cloud、MySQL 等技术,解决了平台稳定性和可扩展性的问题,提供了良好的用户体验。项目经历订单管理系统2021-03 ~ 2021-05
Java后端开发工程师北京老鱼简迂包主工首竺田亥弦的巨毕工尖句手工首净悠收本询竺陆此的迟斗n守现声田3
注意!
该文字识别只能实现识别一页pdf,如果需要识别多页pdf需要自己设计分页传输并且多次调用接口
deepseek整合消息,返回文本关键信息
起步工作
首先就是要获取到deepseek的api的key

随后将获取到的key写入配置文件或者直接明文写入代码
需要添加的依赖
<dependencies><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.4.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>3.4.2</version></dependency><!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version><scope>provided</scope></dependency><!-- HTTP客户端 --><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.0</version></dependency><!-- JSON处理 --><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.10.1</version></dependency><dependency><groupId>com.mashape.unirest</groupId><artifactId>unirest-java</artifactId><version>1.4.9</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.3.6</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpasyncclient</artifactId><version>4.0.2</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.3.6</version></dependency><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20140107</version></dependency></dependencies>
编写工具类
注意,下面代码中写到的deepseek的api的key需要写入自己的
import cn.enilu.flash.bean.entity.zhiyou.user.DeeseekRequest;
import cn.enilu.flash.bean.entity.zhiyou.user.ResumeInfo;
import cn.enilu.flash.bean.entity.zhiyou.user.WorkExperience;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.google.gson.Gson;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringEscapeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import com.mashape.unirest.http.HttpResponse;
import java.util.ArrayList;
import java.util.List;
/*** 调用deepseek处理信息**/
@Component
@Slf4j
public class DeepSeekUtil {@Autowiredprivate OcrClientUtil ocrClientUtil;private final Gson gson = new Gson();public ResumeInfo askDeepSeek(String pdfUrl){Unirest.setTimeouts(0, 0);//DeeseekRequest: 自己的实体类名称List<DeeseekRequest.Message> messages = new ArrayList<>();//给deepSeek一个角色messages.add(DeeseekRequest.Message.builder().role("system").content("你负责给我格式化简历字符串信息").build());// question:说你自己想说的话StringBuilder question= new StringBuilder(ocrClientUtil.userGeneralBasicOCR(pdfUrl));question.append("\n现在我要求你格式化上面的信息,并且以json字符串格式返回信息方便我后续解析成java对象,有的话给出值,没有的话直接给出空,以下是希望你从上面信息中获取的信息" +"\n1.username,2.school,3.email,4.phone,5.education,6.major,7.graduationYear,8.workExperience,我要求其中每一个值长度不超过15,并且在输出开始输出一个startX,结束的地方输出一个endX");messages.add(DeeseekRequest.Message.builder().role("user").content(question.toString()).build());DeeseekRequest requestBody = DeeseekRequest.builder().model("deepseek-chat").messages(messages).build();HttpResponse<String> response = null;try {response = Unirest.post("https://api.deepseek.com/chat/completions").header("Content-Type", "application/json").header("Accept", "application/json").header("Authorization", "Bearer "+"你自己获取到的deepseek的api的key").body(gson.toJson(requestBody)).asString();} catch (UnirestException e) {throw new RuntimeException(e);}String ansString = response.getBody();// 找到 startX 和 endX 的位置int startIndex = ansString.indexOf("startX") + "startX".length();int endIndex = ansString.indexOf("endX");if (startIndex != -1 && endIndex != -1) {// 截取 startX 和 endX 之间的内容ansString = ansString.substring(startIndex + 2, endIndex - 2).trim();} else {throw new RuntimeException("未检测到有效简历信息");}ansString=StringEscapeUtils.unescapeJava(ansString);ResumeInfo resume=new ResumeInfo();// 确保ansString是有效的JSON格式if (ansString.startsWith("{") && ansString.endsWith("}")) {JSONObject resumeInfoJson = JSONUtil.parseObj(ansString);resume = JSONUtil.toBean(resumeInfoJson, ResumeInfo.class);List<WorkExperience> workExperience = resume.getWorkExperience();} else {System.out.println("Extracted content is not a valid JSON.");}return resume;}
}
代码解析
返回的实体对象再下面具体调用实现
工具类用于处理简历 PDF,自动提取并结构化简历信息,主要流程如下:
- OCR识别: 通过 OCR 工具读取简历中的文本内容。
- 构造请求: 把文本内容发送给 DeepSeek 大模型,请求其格式化为结构化 JSON。
- 接口调用: 调用 DeepSeek 接口获取模型返回结果。
- 结果解析: 提取模型返回的 JSON 并转为 ResumeInfo 对象,便于后续处理。
具体测试调用结果
需要注意,这里我们要传入的是要识别的图片的url(这里是简历的url,也就是pdf结尾的文件),不是直接上传文件,可以考虑使用OSS对象存储技术存储文件随后返回文件的url
实体类(其实就是url)
@Data
public class PdfRequest {private String pdfUrl;private String otherParam;
}
返回结果实体类(也就是将返回的json字符串转为对象)
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class ResumeInfo {private String username;private String school;private String email;private String phone;private String education;private String major;private String graduationYear;private List<WorkExperience> workExperience;
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class WorkExperience {private String company;private String position;private String period;
}
controller层:
@PostMapping("/formatResume")public CommonResponse formatResume(@RequestBody PdfRequest pdfRequest){return resumeService.formatResume(pdfRequest);}
service层
@Autowiredprivate AliOSSUtil ossUtil;@Autowiredprivate DeepSeekUtil deepSeekUtil;@Overridepublic CommonResponse formatResume(PdfRequest pdfRequest) {if(pdfRequest==null){//简历不存在throw new ApplicationException(ApplicationExceptionEnum.RESUME_NOT_FOUND);}String pdfUrl = pdfRequest.getPdfUrl();if(pdfUrl==null||StringUtils.isBlank(pdfUrl)){throw new ApplicationException(ApplicationExceptionEnum.RESUME_LINK_EMPTY);}ResumeInfo resumeInfo = deepSeekUtil.askDeepSeek(pdfUrl);if(resumeInfo!=null){return new CommonResponse(200,"success",resumeInfo);}return new CommonResponse(404,"Resume not found",null);}
具体运行结果:
文字识别并且提取创建信息后返回的结果

相关文章:
图片文本识别OCR+DeepSeekapi实现提取图片关键信息
用到的技术: 通过腾讯OCR文字识别,deepseek的api实现 目录 需求分析: 文字识别(OCR)具体实现步骤 起步工作 代码编写 deepseek整合消息,返回文本关键信息 起步工作 编写工具类 具体调用实现 具体…...
go 通过汇编分析函数传参与返回值机制
文章目录 概要一、前置知识二、汇编分析2.1、示例2.2、汇编2.2.1、 寄存器传值的汇编2.2.2、 栈内存传值的汇编 三、拓展3.1 了解go中的Duff’s Device3.2 go tool compile3.2 call 0x46dc70 & call 0x46dfda 概要 在上一篇文章中,我们研究了go函数调用时的栈布…...
解决Ubuntu Desktop 24.04 VMware中安装后不能全屏显示,只能居中的问题
Ubuntu Desktop 24.04 VMware中安装后不能全屏显示,只能居中。 sudo apt-get install open-vm-tools sudo apt-get install open-vm*...
【笔记ing】AI大模型-04逻辑回归模型
一个神经网络结构,其中的一个神经网络层,本质就是一个逻辑回归模型 深度神经网络的本质就是多层逻辑回归模型互相连接或采用一定的特殊连接的方式连接在一起构成的。其中每一个层本质就是一个逻辑回归模型。 逻辑回归模型基本原理 逻辑回归࿰…...
分布式ID生成方案的深度解析与Java实现
在分布式系统中,生成全局唯一的ID是一项核心需求,广泛应用于订单编号、用户信息、日志追踪等场景。分布式ID不仅需要保证全局唯一性,还要满足高性能、高可用性以及一定的可读性要求。本文将深入探讨分布式ID的概念、设计要点、常见生成方案&a…...
AF3 ProteinDataModule类解读
AlphaFold3 protein_datamodule 模块 ProteinDataModule 类继承自 PyTorch Lightning 数据模块(LightningDataModule),负责 ProteinFlow 数据的准备、加载、拆分、变换等逻辑封装在一起,便于训练过程中的统一管理和复现。 这个类承担了 AlphaFold3 训练和评估过程中的 数据…...
如何将一个8s的接口优化到500ms以下
最近换了个工作,刚入职就接了个活--优化公司自营app的接口性能,提升用户体验。 刚开始还以为是1s优化到500ms这种,或者500ms优化到200ms的接口,感觉还挺有挑战的。下好app体验了一下。好家伙,那个慢已经超过了我的忍耐…...
记录学习的第二十五天
今天终于又开始更新了。实在是星期六的蓝桥杯给了我一个大大的打击,今天终于好不容易缓过来了,可以好好学算法了。 还是老规划,力扣的每日一题。不过今天的每日一题我之前做过了,就又提交了一次来签到。 之后三道哈希表题目。 我一…...
linux电源管理(二),内核的CPUFreq(DVFS)和ARM的SCPI
更多linux系统电源管理相关的内容请看:https://blog.csdn.net/u010936265/article/details/146436725?spm1011.2415.3001.5331 1 简介 CPUFreq子系统位于drivers/cpufreq目录下,负责进行运行过程中CPU频率和电压的动态调整,即DVFS (Dynami…...
【LeetCode 热题 100】哈希 系列
📁1. 两数之和 本题就是将通过两层遍历优化而成的,为什么需要两层遍历,因为遍历 i 位置时,不知道i-1之前的元素是多少,如果我们知道了,就可以通过两数相加和target比较即可。 因为本题要求返回下标…...
ES6学习04-数组扩展:扩展运算符、新增方法
一、扩展运算符 1. 2. eg: 3. 二、新增方法 1. arguments 元素组合 类似数组对象 2....
Redis存储“大数据对象”的常用策略及StackOverflowError错误解决方案
Hi,大家好,我是灰小猿! 在一些功能的开发中,我们一般会有一些场景需要将得到的数据先暂时的存储起来,以便后面的接口或业务使用,这种场景我们一般常用的场景就是将数据暂时存储在缓存中,之后再…...
在轨道交通控制系统中如何实现μs级任务同步
轨道交通作为现代城市化进程中的重要支柱,承载着数以亿计的乘客出行需求,同时也是城市经济运行的命脉。无论是地铁、轻轨还是高速铁路,其控制系统的稳定性和可靠性直接关系到运营安全和效率。在这样一个高风险、高复杂度的环境中,任何微小的失误都可能导致灾难性后果。因此…...
嵌入式程序设计英语
实际要求:认识最基本的英文单词即可,(总计几百个) IDE 集成开发环境 fatal error fatal 致命的,error 错误,fatal error 致命的错误 main 主要的 include 包含 io input 输入,output 输出,input output …...
滚轮控制目标臂长度调整相机距离
通过鼠标滚轮来控制摄像机目标臂长度 , 调整相机距离 看图就行,不多说,照着连就完事了...
FireCrawl爬虫工具, Craw4ai
FireCrawl是一款开源的AI爬虫工具,专门用于Web数据提取,并将其转换为Markdown格式或其他结构化数据。FireCrawl特别适合处理使用JavaScript动态生成的网站,能够自动抓取网站及其所有可访问的子页面内容,并将其转换为适合大语言…...
pyenv库应用入门与Ubuntu端安装实践
pyenv库应用入门与Ubuntu端安装实践 pyenv概述virtualenv、pyvenv、pyenvvirtualenvpyvenvpyenv Ubuntu端安装pyenv实践安装依赖报错解决安装pyenv配置环境变量更换pyenv源地址 pyenv基本用法安装成功服务器部署scrapyd pyenv概述 pyenv 是一个用于管理多个 Python 版本的工具…...
CS5346 - Annotation in Visualization (可视化中的注释)
文章目录 Annotation 的重要性Levels of Annotation (注释的层级)Headings and IntroductionHeadings(标题)陈述型(Statement):突出结论或有趣发现疑问型(Question)&…...
如何开发一套场外个股期权交易系统?个股期权交易软件包含:询价,报价,交易,持仓,行权,账户盈亏统计等
一、场外个股期权的定义与特点 场外个股期权(Over-the-Counter Equity Option)是一种由交易双方私下协商的非标准化金融衍生品合约,以特定个股为标的资产。与交易所上市的标准化期权不同,其合约条款(如行权价、到期日…...
高速电路中的电阻、电容的选型及应用
2.1 电阻的应用 2.1.1 与电阻相关的经典案例 如果说芯片是电路的骨架,那么电阻就是在芯片之间起连接作用的关节。电阻的阻值、布放位置等,对设计的成功起着至关重要的作用。 【案例2.1】串联电阻过大,导致板间告警失败 某产品由业务板和主…...
六、adb通过Wifi连接
背景 收集是荣耀X40,数据线原装全新的,USB连上之后,老是断,电脑一直叮咚叮咚的响个不停,试试WIFI 连接是否稳定,需要手机和电脑用相同的WIFI. 连接 1.通过 USB 连接手机和电脑(打开USB调试等这些都略过) adb device…...
Java新手村第二站:泛型、集合与IO流初探
文章目录 Java新手村第二站:泛型、集合与IO流初探泛型包装类集合IO流函数式接口和Lambda表达式 Java新手村第二站:泛型、集合与IO流初探 泛型 泛型的概念与作用: 核心目的:在编译期提供类型安全检查,避免运行时的 Cla…...
AT_abc398_e [ABC398E] Tree Game 题解
题目传送门 题目大意 题目描述 本题是一道交互题(你的程序需要通过输入输出与评测系统进行交互)。 给定一棵包含 N N N 个顶点的树 G G G,顶点编号为 1 1 1 至 N N N。第 i i i 条边连接顶点 U i U_i Ui 和 V i V_i Vi。 你和…...
CSI-external-provisioner
main() 这段Go代码是一个CSI(容器存储接口)Provisioner(供应器)的实现,用于在Kubernetes集群中动态提供持久卷。代码涉及多个组件和步骤,下面是对关键部分的解释: 初始化和配置 命令行标志和…...
android中dp和px的关系
关于android的dp和px的关系是我刚开始学习android的第一个知识点,不知不觉学安卓也有一年了,但是偶然间我发现我理解的dp和px的关系一直是错的,真的是有一点搞笑,今天特意写一篇博客纪念一下这个我理解错一年的知识点。 dp和px之间…...
DeepSeek模型在非图形智能体的应用中是否需要GPU
答:不一定 概念 1、是否需要GPU与应用是否图形处理应用无关 2、文本内容智能体大多也需要GPU来提供更好的性能 3、DeepSeek模型在非图形智能体的应用中是否需要GPU取决于具体的模型版本和部署环境 不需要GPU的模型版本 DeepSeek-R1-1.5B: 这…...
4.14代码随想录第四十三天打卡
图论理论基础 https://www.programmercarl.com/kamacoder/%E5%9B%BE%E8%AE%BA%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 98. 所有可达路径 (1)题目描述: (2)解题思路: #include <iostream> #include <vector> #include <list> using namespace std;vec…...
【视频目标分割论文集】Efficient Track Anything0000
github 摘要 视频对象分割和追踪任意目标领域出现了强大的工具——分割任意模型 2(SAM 2)。SAM 2 实现令人印象深刻的视频对象分割性能的关键组成部分包括用于帧特征提取的大型多阶段图像编码器,以及存储过去帧记忆上下文以辅助当前帧分割的…...
码率自适应(ABR)决策的直播场景
直播场景 1. 直播场景的普遍框架与工作原理 主播端:即各类主播(游戏、网红歌手、户外达人等),通过手机端或者个人电脑在线直播录制个人活动。 编码服务器:主播端上传视频流以后,编码服务器根据相应的编码转…...
SCP-Firmware安全通告:CVE-2024-11863和CVE-2024-11864
安全之安全(security)博客目录导读 目录 一、概述 二、CVE详情 三、受影响产品 四、修复建议 五、致谢 六、版本历史 一、概述 在SCP固件(SCP-Firmware)中发现两处安全漏洞,可能允许普通世界特权软件(normal world privileged softwareÿ…...
