Java调用百度OCR实现图片文字识别

1.这是从本地上传图片,本质是将上传的图片转换为base64后进行解析

首先导入pom依赖

 <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.13</version>
        </dependency>

接口实现

@PostMapping("/recognize-img")
    @Operation(summary = "图片文字识别",description = "图片识别")
    public String recognizeImage(@RequestParam("file") MultipartFile file) {
        try {
            // 将文件转换为 Base64 编码并进行 OCR 识别
            String base64Image = baiduOcrService.convertToBase64(file,true);
            return baiduOcrService.recognizeImage(base64Image);
        } catch (IOException e) {
            e.printStackTrace();
            return "Error occurred while recognizing image.";
        }
    }

这是OCR的实现过程

package com.jt.console.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jt.common.beans.ServiceAssert;
import okhttp3.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.Base64;
import java.util.List;
import java.util.Arrays;

/**
 * 百度OCR识别实现类
 */
@Service("baiduOcrServiceImpl")
public class BaiduOcrServiceImpl {

    @Value("${baidu.ocr.apiKey}")
    private String API_KEY;  // 客户端id

    @Value("${baidu.ocr.secretKey}")
    private String SECRET_KEY; // 客户端秘钥

    // 支持的图片格式列表
    private static final List<String> SUPPORTED_FORMATS = Arrays.asList("png", "jpg", "jpeg", "bmp", "gif");

    // 构建 OkHttpClient 实例
    private static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();

    // 获取 Access Token
    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=" + API_KEY
                + "&client_secret=" + SECRET_KEY);
        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();
        if (!response.isSuccessful()) {
            //throw new IOException("Unexpected code " + response);
            // 自定义提示信息
            String errorMessage = "OCR request failed. Status code: " + response.code() + ", Message: " + response.message();
            ServiceAssert.isTrue(false, errorMessage);
        }
        String responseBody = response.body().string();
        JSONObject jsonObject = JSON.parseObject(responseBody);
        return jsonObject.getString("access_token");
    }

    // 调用 OCR 接口,返回结果
    public String recognizeImage(String base64Image) throws IOException {
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        RequestBody body = RequestBody.create(mediaType, "image=" + base64Image + "&detect_direction=false&paragraph=false&probability=false");
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic?access_token=" + getAccessToken())
                .method("POST", body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .addHeader("Accept", "application/json")
                .build();
        try (Response response = HTTP_CLIENT.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                //throw new IOException("Unexpected code " + response);
                // 自定义提示信息
                String errorMessage = "Failed to obtain access token. Status code: " + response.code() + ", Message: " + response.message();
                ServiceAssert.isTrue(false, errorMessage);
            }
            return formatOcrResult(response.body().string());
        }
    }

    // 将 MultipartFile 转换为 Base64 编码
    public String convertToBase64(MultipartFile file, boolean urlEncode) throws IOException {
        // 检查图片格式
        String filename = file.getOriginalFilename();
        if (filename == null) {
            ServiceAssert.isTrue(false, "文件名为空");
        }
        String extension = filename.substring(filename.lastIndexOf('.') + 1).toLowerCase();
        if (!SUPPORTED_FORMATS.contains(extension)) {
            ServiceAssert.isTrue(false, "不支持的图片格式: " + extension);
        }
        // 从 MultipartFile 中获取字节数组
        byte[] bytes = file.getBytes();
        // 将字节数组编码为 Base64 字符串
        String base64 = Base64.getEncoder().encodeToString(bytes);
        // 如果需要 URL 编码
        if (urlEncode) {
            base64 = URLEncoder.encode(base64, "utf-8");
        }
        return base64;
    }


    //组装返回OCR识别的结果
    public static String formatOcrResult(String ocrResult) {
        StringBuilder resultText = new StringBuilder();
        try {
            // 解析 OCR 结果
            JSONObject jsonObject = JSON.parseObject(ocrResult);

            // 检查是否包含 words_result 数组
            if (jsonObject.containsKey("words_result")) {
                var wordsResult = jsonObject.getJSONArray("words_result");
                if (wordsResult != null && !wordsResult.isEmpty()) {
                    for (int i = 0; i < wordsResult.size(); i++) {
                        JSONObject wordObject = wordsResult.getJSONObject(i);
                        String word = wordObject.getString("words");
                        if (word != null && !word.isEmpty()) {
                            resultText.append(word).append(" ");
                        }
                    }
                } else {
                    // 如果没有识别到文字,直接返回空值
                    return "";
                }
            } else {
                // OCR 结果中不包含 words_result,也返回空值
                return "";
            }
        } catch (Exception e) {
            ServiceAssert.isTrue(false,e.getMessage());
            //resultText.append("处理 OCR 结果时出错:").append(e.getMessage());
        }
        return resultText.toString().trim();
    }
}

2.这是上传为图片链接去进行OCR识别

导入依赖

     <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20210307</version> <!-- 或者最新版本 -->
        </dependency>

接口实现

@RequestMapping("/api")
@RestController
@AllArgsConstructor
@CrossOrigin(origins = "*")
public class OcrController {

    private final OcrServiceImpl ocrService;

    @GetMapping("/ocr")
    public String recognizeImage(@RequestParam String imageUrl) {
        try {
            return BaiduOcrService.recognizeImage(imageUrl);
        } catch (IOException e) {
            e.printStackTrace();
            return "Error occurred while recognizing image.";
        }
    }
}

service层实现

package com.example.test.controller.ocr;

import okhttp3.*;
import org.json.JSONObject;

import java.io.IOException;

public class BaiduOcrService {

    private static final String API_KEY = "";
    private static final String SECRET_KEY = "";
    private static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();

    // 获取 Access Token
    private static String getAccessToken() throws IOException {
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY
                + "&client_secret=" + SECRET_KEY);
        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");
    }

    // 调用 OCR 接口
    public static String recognizeImage(String imageUrl) throws IOException {
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        RequestBody body = RequestBody.create(mediaType, "url=" + imageUrl + "&detect_direction=false&paragraph=false&probability=false");
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic?access_token=" + getAccessToken())
                .method("POST", body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .addHeader("Accept", "application/json")
                .build();
        Response response = HTTP_CLIENT.newCall(request).execute();
        return response.body().string();
    }
}

以上就是OCR实现2种过程

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Java实现调用百度OCR票据识别服务,可以按照以下步骤进行: 1. 首先,我们需要获取百度AI开放平台的相关API Key和Secret Key。可以在百度AI开放平台的官方网站上注册并创建一个应用,然后获取到这两个关键的身份验证参数。 2. 在Java中,可以使用百度AI开放平台提供的Java SDK来调用相关服务。首先,需要确保项目中已经引入了百度OCRJava SDK依赖。 3. 创建一个OCRClient对象,并使用之前获取到的API Key和Secret Key进行身份验证。 4. 为要识别的票据准备好图片数据。可以使用Java的File类来读取本地图片文件,也可以直接使用网络上的图片URL。将图片数据转换为字节数组。 5. 调用票据识别的方法,传入要识别的图片数据。可以使用票据识别的方法来识别票据中的各种字段信息,如发票代码、发票号码等。 6. 处理返回的结果。根据百度OCR API的返回结果,解析出需要的字段信息,并进行相应的业务处理。 7. 最后,记得释放资源和处理异常情况,确保程序的稳定性和安全性。 这样,我们就可以在Java调用百度OCR票据识别服务了。记得在调用API之前,阅读相关文档和了解API的使用限制和注意事项,以确保调用的有效性。 ### 回答2: 在Java调用百度OCR票据识别功能,可以通过以下几个步骤来实现。 首先,需要在百度云AI平台上创建一个OCR应用,并获取应用的API Key和Secret Key。这些凭证将用于后续的认证和授权。 然后,需要引入百度AIP Java SDK,可以通过maven等方式将它添加到项目的依赖中,以便能够在代码中使用百度OCR相关的接口。 接下来,在代码中构建AipOcr对象,将API Key和Secret Key以及OCR接口的请求地址设置进去。可以通过AipOcr的实例来调用百度OCR相关的接口。 调用百度OCR票据识别功能时,可以通过调用AipOcr对象的receiptRecognize方法来实现。将票据图片的二进制数据作为参数传递给该方法即可。 对于返回的结果,可以通过解析返回的JSON数据来获取识别结果。如票据的种类、识别的文字内容、发票代码、发票号码等信息。 最后,根据需要对返回的识别结果进行处理和展示,可以输出到控制台,保存到文件,或者在界面上显示出来。 总结起来,调用百度OCR票据识别功能需要先获取API Key和Secret Key,然后引入百度AIP Java SDK,构建AipOcr对象,并调用相关接口进行票据识别。最后根据识别结果进行后续处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值