【SpringBoot】整合百度文字识别
流程图

一、前期准备
1.1 打开百度智能云官网找到管理中心创建应用

全选文字识别
1.2 保存好AppId、API Key和Secret Key

1.3 找到通用场景文字识别,立即使用

1.4 根据自己需要,选择要开通的项目

二、代码编写
以通用文字识别(高精度版)为例
2.1 加依赖(pom.xml)
<dependencies><!-- 引入Spring Boot的web starter依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 引入Lombok依赖 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- 引入Spring Boot的测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 百度人工智能依赖 --><dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>4.11.3</version></dependency><!-- okhttp --><!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.12.0</version></dependency><!-- 对象转换成json --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.8</version></dependency><!-- thymeleaf模板引擎 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency></dependencies>
2.2 编写yml文件
# 这是一个配置块,用于设置百度OCR服务的认证信息。
baidu:ocr: # OCR服务的配置项appId: # 百度OCR服务的应用IDapiKey: # 百度OCR服务的API密钥secretKey: # 百度OCR服务的密钥spring:thymeleaf:cache: false
2.3 eneity层
package com.baiduocr.entity;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;/*** BaiduOcrProperties类用于配置百度OCR服务的相关属性。* 该类通过@ConfigurationProperties注解与配置文件中的baidu.ocr前缀绑定,* 使得我们可以从配置文件中动态读取appId, apiKey和secretKey等属性值*/
@Data
@Configuration
@ConfigurationProperties(prefix = "baidu.ocr")
public class BaiduOcrProperties {// 百度OCR的App IDprivate String appId;// 百度OCR的API Keyprivate String apiKey;// 百度OCR的Secret Keyprivate String secretKey;
}
2.5 控制器
package com.baiduocr.controller;import com.baidu.aip.ocr.AipOcr;
import com.baiduocr.entity.BaiduOcrProperties;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;import okhttp3.*;/*** OcrController类负责处理OCR相关的请求。* 它利用百度OCR服务对上传的文件或文本进行识别,并返回识别结果。*/@Controller
public class OcrController {// 注入BaiduOcrProperties对象,用于获取百度OCR服务的配置信息private final BaiduOcrProperties baiduOcrProperties;// 创建一个OkHttpClient对象,用于发送HTTP请求到百度OCR服务static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();// 构造函数,注入BaiduOcrProperties对象,用于初始化BaiduOcrProperties对象@Autowiredpublic OcrController(BaiduOcrProperties baiduOcrProperties) {this.baiduOcrProperties = baiduOcrProperties;}@RequestMapping(value = {"/", "/ocr"})public String index() {return "ocr";}/*** 处理OCR识别请求。** @param file 用户上传的文件,将进行OCR识别。* @param model Spring模型,用于在识别后向视图传递数据。* @return 视图名称,根据识别结果决定是显示结果还是错误页面。*/@RequestMapping(value = "/doOcr")public String ocr(MultipartFile file, Model model) {try {List<String> ocrResult = performOcr(file); // 执行OCR识别model.addAttribute("ocrResult", ocrResult); // 将识别结果添加到模型中} catch (Exception e) {return "error"; // 识别失败,返回错误页面}return "ocr_result"; // 识别成功,返回结果页面}/*** 执行OCR识别操作。** @param file 需要进行OCR识别的文件。* @return 识别到的文本列表。* @throws Exception 如果识别过程中出现错误,则抛出异常。*/private List<String> performOcr(MultipartFile file) throws Exception {AipOcr client = new AipOcr(baiduOcrProperties.getAppId(), baiduOcrProperties.getApiKey(), baiduOcrProperties.getSecretKey()); // 创建百度OCR客户端// 获取Access TokenString accessToken = getAccessToken();HashMap<String, String> options = new HashMap<>(); // 设置OCR识别的选项options.put("language_type", "CHN_ENG");options.put("detect_direction", "true");options.put("detect_language", "true");options.put("probability", "true");byte[] buf = file.getBytes(); // 从文件中读取内容JSONObject res = client.basicAccurateGeneral(buf, options); // 使用高精度接口进行通用文字识别List<String> wordsList = new ArrayList<>(); // 存储识别出的文本for (Object obj : res.getJSONArray("words_result")) { // 遍历识别结果,提取文本JSONObject jsonObj = (JSONObject) obj;wordsList.add(jsonObj.getString("words"));}return wordsList;}/*** 从百度OCR服务获取Access Token。** @return Access Token,用于身份验证。* @throws IOException 如果在获取Access Token过程中出现IO错误。*/private String getAccessToken() throws IOException {MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + baiduOcrProperties.getApiKey()+ "&client_secret=" + baiduOcrProperties.getSecretKey());Request request = new Request.Builder().url("https://aip.baidubce.com/oauth/2.0/token").method("POST", body).addHeader("Content-Type", "application/x-www-form-urlencoded").build();Response response = HTTP_CLIENT.newCall(request).execute(); // 发送请求,获取响应return new JSONObject(response.body().string()).getString("access_token"); // 从响应中提取Access Token}}
2.6 前端页面(thymeleaf)
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>OCR识别</title>
</head>
<body><h1>上传图片进行OCR识别</h1>
<form th:action="@{/doOcr}" method="post" enctype="multipart/form-data"><input type="file" name="file" accept="image/*"><button type="submit">上传并识别</button>
</form></body>
<style>body {font-family: Arial, sans-serif;margin: 0;padding: 0;display: flex;flex-direction: column;align-items: center;background-color: #f8f9fa;}h1 {color: #343a40;margin-top: 20px;}form {margin: 20px 0;padding: 20px;border: 1px solid #dee2e6;border-radius: 5px;background-color: #fff;box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);}input[type="file"] {margin-bottom: 10px;}button {background-color: #007bff;color: white;padding: 10px 20px;border: none;border-radius: 5px;cursor: pointer;}button:hover {background-color: #0056b3;}
</style>
</html>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>OCR结果</title>
</head>
<body><h1>OCR识别结果</h1>
<div th:if="${ocrResult != null}"><ul><li th:each="word : ${ocrResult}" th:text="${word}"></li></ul>
</div>
<a href="/">返回首页</a></body>
<style>body {font-family: Arial, sans-serif;margin: 0;padding: 0;display: flex;flex-direction: column;align-items: center;background-color: #f8f9fa;}h1 {color: #343a40;margin-top: 20px;}div {margin: 20px 0;padding: 20px;border: 1px solid #dee2e6;border-radius: 5px;background-color: #fff;box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);width: 80%;max-width: 800px;}ul {list-style-type: none;padding: 0;}li {padding: 5px 0;border-bottom: 1px solid #dee2e6;}a {margin-top: 20px;color: #007bff;text-decoration: none;}a:hover {text-decoration: underline;}
</style>
</html>
三、效果展示


相关文章:
【SpringBoot】整合百度文字识别
流程图 一、前期准备 1.1 打开百度智能云官网找到管理中心创建应用 全选文字识别 1.2 保存好AppId、API Key和Secret Key 1.3 找到通用场景文字识别,立即使用 1.4 根据自己需要,选择要开通的项目 二、代码编写 以通用文字识别(高精度版&am…...
Java如何设计一个功能
流程说明:实现一组功能的步骤 1,充分了解需求,包括所有的细节,需要知道要做一个什么样的功能。 2,设计实体/表 正向工程:设计实体、映射文件 --> 建表 反向工程:设计表 --> 映射文件、实体 设计实体类型分析步骤: 1)功能模块有几个实体…...
MySQL 字符字段长度设置详解:语法、注意事项和示例
本文将详细介绍在 MySQL 数据库中如何设置字符字段的长度。将介绍字符字段的数据类型、长度限制、语法示例,并提供具体的示例,以正确设置和管理字符字段的长度。 1. MySQL 字符字段长度概述 在 MySQL 中,字符字段是用于存储文本型数据的列。…...
【对角线遍历】python
没啥思路 class Solution:def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:mlen(mat)nlen(mat[0])ret[]if len(mat)0:return retcount0#mn-1是对角线总数while count<mn-1:#x和y的和刚好是count数#偶数为右上走if count%20:xcount if(count<m)else (…...
温度检测小系统兼继电器模块和小风扇
1.思路: 代码还要封装! 延迟1秒;串口初始化;LCD1602显示屏初始化;延迟两秒;ledone不亮; while循环,延迟1秒,DHT模块读取数据;封装接收数据函数;发…...
[数据结构1.0]计数排序
读者老爷好,本鼠鼠最近学了计数排序,浅浅介绍一下! 目录 1.统计相同元素出现次数 2.根据统计的结果将序列回填到原来的序列中 3.相对映射计数排序 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用,是非比较排…...
PostgreSQL入门教程
PostgreSQL是一种开源的关系型数据库管理系统,它具有高度的可靠性、可扩展性和性能。下面是一个简单的PostgreSQL入门教程,帮助你开始使用这个强大的数据库管理系统。 步骤1:安装PostgreSQL 首先,你需要下载并安装PostgreSQL。你…...
【spring】@ControllerAdvice注解学习
ControllerAdvice介绍 ControllerAdvice 是 Spring 框架提供的一个注解,用于定义一个全局的异常处理类或者说是控制器增强类(controller advice class)。这个特性特别适用于那些你想应用于整个应用程序中多个控制器的共有行为,比…...
【全开源】赛事报名系统源码(Fastadmin+ThinkPHP和Uniapp)
基于FastadminThinkPHP和Uniapp开发的赛事报名系统,包含个人报名和团队报名、成绩查询、成绩证书等。 构建高效便捷的赛事参与平台 一、引言:赛事报名系统的重要性 在举办各类赛事时,一个高效便捷的报名系统对于组织者和参与者来说都至关重…...
杰理-耳机进入关机关闭内内置触摸-节省功耗
杰理-耳机进入关机关闭内内置触摸-节省功耗 if (__this->init 0) {return LP_TOUCH_SOFTOFF_MODE_LEGACY; }if ((__this -> softoff_mode LP_TOUCH_SOFTOFF_MODE_ADVANCE) && (__this->softoff_keep 0)) {lp_touch_key_disable(); } __this->softoff_k…...
Homebrew安装、 Mac上pyenv的安装与使用,复制黏贴搞定,网上教程看得眼花缭乱的来看看,简单明了一步到胃!!
安装 Homebrew /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)"安装pyenv brew install pyenv添加到终端使用的配置文件.zshrc、.bashrc 避免不必要的麻烦两个终端的配置文件都进行添加,文件在当前用户目…...
通过注意力调节实现更好的文本到图像生成对齐
近年来,生成性AI技术在众多领域取得了前所未有的进步。大规模预训练模型的出现激发了各种下游任务中的新应用。这在文本到图像生成领域尤为明显,例如Stable Diffusion、DALL-E 2和Imagen等模型已经显著展示了它们的能力。尽管如此,复杂提示中…...
Java开发大厂面试第26讲:生产环境如何排查问题和优化 JVM?
通过前面几个课时的学习,相信你对 JVM 的理论及实践等相关知识有了一个大体的印象。而本课时将重点讲解 JVM 的排查与优化,这样就会对 JVM 的知识点有一个完整的认识,从而可以更好地应用于实际工作或者面试了。 我们本课时的面试题是&#x…...
计算机科学的先驱者们
1. 艾伦图灵(Alan Turing): 图灵是计算机科学和人工智能的先驱之一,他提出了“图灵机”的概念,这是一种理论上的计算模型,奠定了现代计算机理论的基础。在第二次世界大战期间,图灵领导了一个团…...
哈希双指针
文章目录 一、哈希1.1两数之和1.2字母异位词分组1.3最长子序列 二、双指针2.1[移动零](https://leetcode.cn/problems/move-zeroes/description/?envTypestudy-plan-v2&envIdtop-100-liked)2.2[盛最多水的容器](https://leetcode.cn/problems/container-with-most-water/d…...
【网络】UDP协议
应用层协议是请求与响应服务,客户端的请求与服务器的响应是通过应用层传输到网络中的,但再实际上,应用层并不能直接通信,需要将数据进行报头的封装,向下层交付,贯穿整个协议栈。我们已经谈到应用层协议负责…...
牛马真的沉默了,入职第一天就干活
入职第一天就干活的,就问还有谁,搬来一台N手电脑,第一分钟开机,第二分钟派活,第三分钟干活,巴适。。。。。。 打开代码发现问题不断 读取配置文件居然读取两个配置文件,一个读一点,…...
解决在cmd里下载的库,但IDLE还是显示不存在的问题
原因一: 环境变量配置 首先,你需要确认你安装库的时候使用的Python环境是否和IDLE使用的Python环境是同一个。如果cmd中你使用的是系统路径下的Python,而IDLE使用的是另一个路径下的Python,那么你在cmd中下载的库,IDL…...
嵌入式全栈开发学习笔记---C语言笔试复习大全23
目录 联合体 联合体的定义 联合体的长度 如果来判断设备的字节序? 如何把大端数据转换成小端数据? 枚举 枚举的定义 上一篇复习了结构体,这一节复习联合体和枚举。 说明:我们学过单片机的一般都是有C语言基础的了ÿ…...
C++函数指针,键值对集合的学习
这段代码使用了 std::unordered_map 来存储 std::wstring 作为键(key),而对应的值(value)是一个 std::function<void(std::array<int, 5>, SomeClass&, int)> 类型的函数指针。这个结构使得根据字符串…...
从原理到实践:详解双目散斑结构光的生成与优化
1. 散斑结构光的基础原理 当你用手电筒照射粗糙墙面时,会看到无数闪烁的光点,这就是自然界中最常见的散斑现象。在三维视觉领域,我们通过精心设计的伪随机散斑图案(Pseudorandom Speckle Pattern),将这种物…...
MiniCPM-V-2_6部署避坑指南:Ollama安装常见问题与解决方案
MiniCPM-V-2_6部署避坑指南:Ollama安装常见问题与解决方案 1. 为什么选择MiniCPM-V-2_6? MiniCPM-V-2_6是目前最先进的视觉多模态模型之一,它在OCR识别、图像理解和视频分析方面表现出色。相比其他大型模型,它只有80亿参数&…...
13.将手写 Agent 主流程迁移为 LangGraph 最小闭环,并接回 FastAPI + session 外壳
目 录前 言开始动手项目结构重构数据State化函数Node化串起Node形成Graph收尾前 言 咱们前面的代码是通过手写Agent工作流程,实现了一个论文RAG问答系统,但是在实际生产环境中不会用这种纯手写工作逻辑项目,更多的是使用现有框架比如LangGra…...
在ubuntu上安装docker和docker compose
1. 更新系统包 首先,确保系统包是最新的: sudo apt update sudo apt upgrade -y2. 安装依赖包 安装 Docker 所需的依赖包: sudo apt install -y apt-transport-https ca-certificates curl software-properties-common3. 添加 Docker 官方…...
7种高效连接方式全解析:php-amqplib连接RabbitMQ的终极指南
7种高效连接方式全解析:php-amqplib连接RabbitMQ的终极指南 【免费下载链接】php-amqplib The most widely used PHP client for RabbitMQ 项目地址: https://gitcode.com/gh_mirrors/ph/php-amqplib php-amqplib作为最广泛使用的PHP RabbitMQ客户端…...
软件体验优化中的A-B测试设计
在软件体验优化中,A/B测试是一种科学且高效的方法,通过对比不同版本的设计或功能,帮助团队找到最优解决方案。无论是电商平台的按钮颜色,还是社交应用的推送策略,A/B测试都能以数据驱动决策,显著提升用户满…...
Phi-3-mini-4k-instruct-gguf在科研辅助中的应用:论文摘要润色、图表说明生成、基金申请要点提炼
Phi-3-mini-4k-instruct-gguf在科研辅助中的应用:论文摘要润色、图表说明生成、基金申请要点提炼 1. 科研写作的痛点与解决方案 科研工作者在日常工作中常常面临三大写作挑战:论文摘要需要精炼表达、图表说明需要清晰准确、基金申请需要突出亮点。传统…...
OpenMV+STM32串口通信避坑指南:从数据打包到LCD显示的完整流程(附源码)
OpenMV与STM32串口通信实战:从数据帧设计到LCD显示的避坑全攻略 引言 当你第一次尝试将OpenMV的识别结果通过串口传输到STM32并在LCD上显示时,大概率会遇到数据丢包、解析错误或显示异常等问题。这不是你的代码写得不够好,而是串口通信本身就…...
Motrix WebExtension快速上手:浏览器下载管理终极解决方案
Motrix WebExtension快速上手:浏览器下载管理终极解决方案 【免费下载链接】motrix-webextension A browser extension for the Motrix Download Manager and its forks 项目地址: https://gitcode.com/gh_mirrors/mo/motrix-webextension 还在为浏览器下载速…...
Python资源合集
体系课-Python全能工程师 文件大小: 39.8GB内容特色: 39.8GB体系课,Python Web/爬虫/数据分析/AI全栈适用人群: 零基础到进阶,求职转岗、全栈开发者核心价值: 企业级项目驱动,学完胜任Python全能工程师下载链接: https://pan.quark.cn/s/e7c…...
