有道OCR图文识别整合SpringBoot

背景需求,

官方SDK,在SpringBoot项目中过于臃肿,需要引入的Jar包过多,

在SpringBoot中,

本文使用SpringBoot中的RestTemplate对象进行请求接口

案例代码如下

package com.example.demo2.Test;import com.example.demo2.Test.Ocr.OcrResponse;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
public class OcrV3Demo2 {private static final String YOUDAO_URL = "https://openapi.youdao.com/ocrapi";private static final String APP_KEY = "AppID";private static final String APP_SECRET = "密钥";public static void main(String[] args) throws IOException {RestTemplate restTemplate = new RestTemplate();MultiValueMap<String, String> params = new LinkedMultiValueMap<>();String q = loadAsBase64("图片地址....");String salt = String.valueOf(System.currentTimeMillis());String detectType = "10012";String imageType = "1";String langType = "auto";params.add("detectType", detectType);params.add("imageType", imageType);params.add("langType", langType);params.add("img", q);params.add("docType", "json");params.add("signType", "v3");String curtime = String.valueOf(System.currentTimeMillis() / 1000);params.add("curtime", curtime);String signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET;String sign = getDigest(signStr);params.add("appKey", APP_KEY);params.add("salt", salt);params.add("sign", sign);HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);ResponseEntity<OcrResponse> responseEntity = restTemplate.exchange(YOUDAO_URL, HttpMethod.POST, requestEntity, OcrResponse.class);System.out.println("输出....");System.out.println(responseEntity.getBody());}public static String getDigest(String string) {if (string == null) {return null;}char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};byte[] btInput = string.getBytes();try {MessageDigest mdInst = MessageDigest.getInstance("SHA-256");mdInst.update(btInput);byte[] md = mdInst.digest();int j = md.length;char str[] = new char[j * 2];int k = 0;for (byte byte0 : md) {str[k++] = hexDigits[byte0 >>> 4 & 0xf];str[k++] = hexDigits[byte0 & 0xf];}return new String(str);} catch (NoSuchAlgorithmException e) {return null;}}public static String loadAsBase64(String imgFile) {File file = new File(imgFile);if (!file.exists()) {System.out.println("文件不存在");return null;}try (InputStream in = new FileInputStream(imgFile)) {byte[] data = new byte[in.available()];in.read(data);return Base64.getEncoder().encodeToString(data);} catch (IOException e) {e.printStackTrace();}return null;}public static String truncate(String q) {if (q == null) {return null;}int len = q.length();return len <= 20 ? q : (q.substring(0, 10) + len + q.substring(len - 10, len));}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/16585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机和proteus的加热洗手器系统设计

此系统是基于51单片机和proteus的仿真设计&#xff0c;功能如下&#xff1a; 1. 检测到人手后开启出水及加热。 2. LED指示加热出水及系统运行状态。 功能框图如下&#xff1a; Proteus仿真界面如下&#xff1a; 下面就各个模块逐一介绍&#xff0c; 模拟人手检测模块 通过…

mysql 非definer用户如何查看存储过程定义

当我们创建存储过程时&#xff0c;如果没有显示指定definer&#xff0c;则会默认当前用户为该sp的definer&#xff0c;如果没有相关授权&#xff0c;则其他用户是看不了这个sp的。 比如用户zhenxi1拥有如下权限&#xff1a; 它拥有对dev_nacos库的查询权限&#xff0c;这个时候…

Xamarin.Android实现加载中的效果

目录 1、说明2、代码如下2.1 图1的代码2.1.1、创建一个Activity或者Fragment&#xff0c;如下&#xff1a;2.1.2、创建Layout2.1.3、如何使用 2.2 图2的代码 4、其他补充4.1 C#与Java中的匿名类4.2 、其他知识点 5、参考资料 1、说明 在实际使用过程中&#xff0c;常常会用到点…

【ChatGPT辅助学Rust | 基础系列 | 基础语法】变量,数据类型,运算符,控制流

文章目录 简介&#xff1a;一&#xff0c;变量1&#xff0c;变量的定义2&#xff0c;变量的可变性3&#xff0c;变量的隐藏 二、数据类型1&#xff0c;标量类型2&#xff0c;复合类型 三&#xff0c;运算符1&#xff0c;算术运算符2&#xff0c;比较运算符3&#xff0c;逻辑运算…

python_在K线找出波段_01_找出所有转折点

目录 写在前面&#xff1a; 需要考虑的几种K线图情况&#xff1a; 寻找所有转折点逻辑&#xff1a; 代码&#xff1a; 寻找转折点方法&#xff1a;找到第一个转折点就返回 循环寻找峰谷方法 主方法 调用计算&#xff1a; 返回&#xff1a; 在【PyQt5开发验证K线视觉想…

数字图像处理(番外)图像增强

图像增强 图像增强的方法是通过一定手段对原图像附加一些信息或变换数据&#xff0c;有选择地突出图像中感兴趣的特征或者抑制(掩盖)图像中某些不需要的特征&#xff0c;使图像与视觉响应特性相匹配。 图像对比度 图像对比度计算方式如下&#xff1a; C ∑ δ δ ( i , j …

7 网络通信(上)

文章目录 网络通信概述ip地址ip的作用ip地址的分类私有ip 掩码和广播地址 linux 命令&#xff08;ping ifconfig&#xff09;查看或配置网卡信息&#xff1a;ifconfig(widows 用ipconfig)测试远程主机连通性&#xff1a;ping路由查看 端口端口是怎样分配的知名端口动态端口 查看…

合宙Air724UG LuatOS-Air script lib API--log

Table of Contents log _log(level, tag, …) (local函数 无法被外部调用) log.trace(tag, …) log.debug(tag, …) log.info(tag, …) log.warn(tag, …) log.error(tag, …) log.fatal(tag, …) log.openTrace(v, uartid, baudrate) log 模块功能&#xff1a;系统日志记录,分…

【数据结构与算法】基数排序

基数排序 基数排序&#xff08;Radix Sort&#xff09;属于“分配式排序”&#xff0c;又称“桶子法”或 bin sort&#xff0c;顾名思义&#xff0c;它是通过键值的各个位的值&#xff0c;将要排序的元素分配至某些“桶”中&#xff0c;达到排序的作用。基数排序法是属于稳定性…

【C++】开源:Boost网络库Asio配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Asio网络库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…

信息安全战线左移!智能网联汽车安全亟需“治未病”

当汽车由典型的工业机械产品逐步发展成为全新的智能移动终端&#xff0c;汽车的安全边界发生了根本性改变&#xff0c;信息安全风险和挑战不断增加。 面对复杂的异构网络、异构系统及车规级特异性要求&#xff0c;智能智能网联汽车信息安全到底要如何防护&#xff0c;已经成为…

qml中,在ListView中添加滚轮无法展现最后几行数据的问题解决

这个是我困扰我数几个小时的问题&#xff0c;好不容易知道了如何在LIstView中添加滚轮&#xff0c;然而&#xff0c;当我鼠标滚轮到最后的时候&#xff0c;展现的总不是最后那几行数据&#xff0c;这真的很让人头大&#xff0c;还好有了这次经历&#xff0c;把这个问题记录下来…

八大排序算法--选择排序(动图理解)

选择排序 算法思路 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 选择排序的步骤&#xff1a; 1>首先在未排序序列中找到最小&#xff08;大&#xff09;元素…

Redis五大基础类型解析

1.String类型 特征&#xff1a;即存储字符串的类型&#xff0c;单个字符串存储量最大不超过512MB 常用业务场景&#xff1a;⽤来存储JSON序列化之后对象 底层编码&#xff1a; int编码 数据结构特点&#xff1a;ptr指针直接指向字符串常量池中对应字符串地址&#xff0c;而…

基于vue+uniapp微信小程序公司企业后勤服务(设备)系统

本系统分为用户和管理员两个角色&#xff0c;其中用户可以注册登陆系统&#xff0c;查看公司公告&#xff0c;查看设备&#xff0c;设备入库&#xff0c;查看通讯录&#xff0c;会议室预约&#xff0c;申请出入&#xff0c;申请请假等功能。管理员可以对员工信息&#xff0c;会…

从 0 到 1!得物如何打造通用大模型训练和推理平台

1.背景 近期&#xff0c;GPT 大模型的发布给自然语言处理&#xff08;NLP&#xff09;领域带来了令人震撼的体验。随着这一事件的发生&#xff0c;一系列开源大模型也迅速崛起。依据一些评估机构的评估&#xff0c;这些开源模型大模型的表现也相当不错。一些大模型的评测情况可…

std vector 用法

使用vector&#xff0c;需添加头文件#include&#xff0c;要使用sort或find&#xff0c;则需要添加头文件#include。函数封装在命名空间std中&#xff0c;使用&#xff1a;using namespace std; 1、vector的初始化 std::vector<int> nVec;    // 空对象 std::vecto…

【Eigen 1】Eigen中的norm、normalize、normalized三者对比

一、norm() 1. 对于Vector&#xff0c;norm返回的是向量的二范数 即: ∣ ∣ x ∣ ∣ 2 ∑ i 1 N x i 2 ||x||_2 \sqrt{\sum_{i1}^{N} {x}^{2}_{i} } ∣∣x∣∣2​i1∑N​xi2​ ​ Vector2d vec(3.0,4.0); cout << vec.norm() << endl; /输出52. 对于Matrix&…

redis常见面试汇总

目录 Redis 适合的场景 Redis 不适合的场景 3、Redis 有哪些常见的功能&#xff1f; 什么是缓存穿透&#xff1f;怎么解决&#xff1f; 什么是缓存雪崩&#xff1f;该如何解决&#xff1f; 参考文献&#xff1a; Redis 适合的场景 缓存&#xff1a;减轻 MySQL 的查询压力…

matlab多线程,parfor循环进度,matlab互斥锁

一. 内容简介 matlab多线程&#xff0c;parfor循环进度&#xff0c;matlab互斥锁 二. 软件环境 2.1 matlab 2022b 2.2代码链接 https://gitee.com/JJW_1601897441/csdn 三.主要流程 3.1 matlab多线程 有好几种&#xff0c;最简单的&#xff0c;最好理解的就是parfor&am…