话不多说 直接上glm-ocr的工具类

复制代码
    <dependency>
            <groupId>ai.z.openapi</groupId>
            <artifactId>zai-sdk</artifactId>
            <version>0.3.3</version>
        </dependency>
复制代码
import ai.z.openapi.ZhipuAiClient;
import ai.z.openapi.service.layoutparsing.LayoutParsingCreateParams;
import ai.z.openapi.service.layoutparsing.LayoutParsingResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;

/**
 * GLM-OCR工具类
 * 用于识别证书图片中的文字内容
 *
 * API文档:https://docs.bigmodel.cn/llms.txt
 */
@Slf4j
@Component
public class GLMOCRUtil {

    @Value("${zhipu.ai.api-key}")
    private String apiKey;

    /**
     * 使用GLM-OCR识别图片中的文字
     *
     * @param imageUrl OSS上的图片URL
     * @return 识别的文字内容
     */
    public String recognizeText(String imageUrl) {
        try {
            log.info("开始OCR识别,图片URL: {}", imageUrl);

            // 1. 初始化客户端
            ZhipuAiClient client = ZhipuAiClient.builder()
                    .ofZHIPU()
                    .apiKey(apiKey)
                    .build();

            // 2. 设置模型
            String model = "glm-ocr";

            // 3. 创建布局解析请求
            LayoutParsingCreateParams params = LayoutParsingCreateParams.builder()
                    .model(model)
                    .file(imageUrl)
                    .build();

            // 4. 发送请求
            LayoutParsingResponse response = client.layoutParsing().layoutParsing(params);
            // 5. 处理响应
            log.info("收到OCR响应,开始处理...");
            log.info("响应是否成功: {}", response.isSuccess());

            // 打印响应对象的详细信息
            log.info("响应对象类型: {}", response.getClass().getName());
            log.info("响应对象所有方法:");
            for (java.lang.reflect.Method method : response.getClass().getMethods()) {
                log.info("  - {} {}", method.getReturnType().getSimpleName(), method.getName());
            }

            if (response != null && response.isSuccess()) {
                // 提取文字内容
                String text = extractTextFromResponse(response);

                if (text != null && !text.isEmpty()) {
                    log.info("OCR识别成功,识别到{}个字符", text.length());
                    log.debug("OCR识别内容预览: {}", text.length() > 200 ? text.substring(0, 200) + "..." : text);
                    return text;
                } else {
                    log.warn("OCR识别结果为空");
                    // 即使结果为空,也尝试打印响应内容
                    log.warn("响应toString: {}", response.toString());
                    return "";
                }
            } else {
                String msg = response != null ? response.getMsg() : "响应为空";
                log.error("OCR识别失败: {}", msg);
                throw new RuntimeException("OCR识别失败: " + msg);
            }

        } catch (Exception e) {
            log.error("OCR识别异常", e);
            throw new RuntimeException("OCR识别失败: " + e.getMessage(), e);
        }
    }

    /**
     * 从响应中提取文字内容
     *
     * 根据官方文档,响应包含 md_results 字段
     */
    private String extractTextFromResponse(LayoutParsingResponse response) {
        try {
            log.info("开始提取OCR识别结果...");
            log.info("响应类型: {}", response.getClass().getName());

            // 尝试使用SDK提供的方法
            // 根据官方文档,应该有 getMd_results() 方法
            try {
                // 方式1:直接调用getMd_results方法
                java.lang.reflect.Method mdResultsMethod = response.getClass().getMethod("getMd_results");
                Object mdResults = mdResultsMethod.invoke(response);
                if (mdResults != null) {
                    String text = mdResults.toString();
                    log.info("通过getMd_results方法获取到OCR结果,长度: {}", text.length());
                    return text;
                }
            } catch (NoSuchMethodException e) {
                log.warn("getMd_results方法不存在,尝试其他方法");
            }

            // 方式2:尝试getData方法
            try {
                java.lang.reflect.Method dataMethod = response.getClass().getMethod("getData");
                Object data = dataMethod.invoke(response);
                if (data != null) {
                    log.info("getData返回: {}", data.getClass().getName());
                    // 如果getData返回的是对象,尝试获取其md_results
                    try {
                        java.lang.reflect.Method dataMdMethod = data.getClass().getMethod("getMd_results");
                        Object dataMd = dataMdMethod.invoke(data);
                        if (dataMd != null) {
                            String text = dataMd.toString();
                            log.info("通过getData().getMd_results获取到OCR结果,长度: {}", text.length());
                            return text;
                        }
                    } catch (Exception ex) {
                        log.warn("getData().getMd_results失败: {}", ex.getMessage());
                    }
                    return data.toString();
                }
            } catch (NoSuchMethodException e) {
                log.warn("getData方法不存在");
            }

            // 方式3:获取响应JSON字符串
            try {
                java.lang.reflect.Method toStringMethod = response.getClass().getMethod("toString");
                Object strResult = toStringMethod.invoke(response);
                log.info("响应toString结果: {}", strResult);

                // 尝试从toString结果中解析
                if (strResult != null && strResult.toString().contains("md_results")) {
                    // 简单解析JSON
                    String jsonStr = strResult.toString();
                    int mdIndex = jsonStr.indexOf("md_results");
                    if (mdIndex > 0) {
                        int startQuote = jsonStr.indexOf("\"", mdIndex + 11);
                        int endQuote = jsonStr.indexOf("\"", startQuote + 1);
                        if (startQuote > 0 && endQuote > startQuote) {
                            String text = jsonStr.substring(startQuote + 1, endQuote);
                            log.info("从toString解析到OCR结果,长度: {}", text.length());
                            return text;
                        }
                    }
                }
            } catch (Exception e) {
                log.warn("解析toString失败: {}", e.getMessage());
            }

            log.error("所有提取方法都失败");
            return null;

        } catch (Exception e) {
            log.error("提取OCR结果异常", e);
            return null;
        }
    }

    /**
     * 使用GLM-OCR识别本地文件(Base64)
     *
     * @param imageBase64 图片Base64编码
     * @return 识别的文字内容
     */
    public String recognizeTextFromBase64(String imageBase64) {
        try {
            log.info("开始OCR识别(Base64方式),数据长度: {} bytes", imageBase64.length());

            // 1. 初始化客户端
            ZhipuAiClient client = ZhipuAiClient.builder()
                    .ofZHIPU()
                    .apiKey(apiKey)
                    .build();

            // 2. 设置模型
            String model = "glm-ocr";

            // 3. 创建布局解析请求(使用Base64)
            LayoutParsingCreateParams params = LayoutParsingCreateParams.builder()
                    .model(model)
                    .file(imageBase64)
                    .build();

            // 4. 发送请求
            LayoutParsingResponse response = client.layoutParsing().layoutParsing(params);

            // 5. 处理响应
            if (response != null && response.isSuccess()) {
                // 提取文字内容
                String text = extractTextFromResponse(response);

                if (text != null && !text.isEmpty()) {
                    log.info("OCR识别成功,识别到{}个字符", text.length());
                    return text;
                } else {
                    log.warn("OCR识别结果为空");
                    return "";
                }
            } else {
                String msg = response != null ? response.getMsg() : "响应为空";
                log.error("OCR识别失败: {}", msg);
                throw new RuntimeException("OCR识别失败: " + msg);
            }

        } catch (Exception e) {
            log.error("OCR识别异常", e);
            throw new RuntimeException("OCR识别失败: " + e.getMessage(), e);
        }
    }
}
相关推荐
weixin_4080996721 小时前
触动精灵调用身份证OCR识别API实现智能信息录入(Lua脚本实战)
junit·ocr·lua·自动化脚本·石榴智能·身份证ocr识别·触动精灵
kevin 11 天前
财报OCR识别怎么做,银行授信场景下,如何把财报录入从3小时提效至5分钟
ocr
tanis_20772 天前
扫描版中文 PDF 怎么提取文字:用 MinerU 做 OCR + 结构化一体处理
人工智能·pdf·ocr
tanis_20772 天前
学术论文 PDF 的版面自动还原:MinerU 对多栏排版、浮动图表与脚注区域的识别实战
人工智能·pdf·ocr
weixin_408099672 天前
按键精灵如何调用身份证OCR接口做实名录入自动化(带完整脚本代码)
自动化·ocr·按键精灵·身份证ocr·石榴智能·ocr api·脚本自动化
AI人工智能+3 天前
文档抽取系统通过OCR与大语言模型融合技术,将非结构化文档(如合同、保单、表格)自动转换为结构化数据
人工智能·语言模型·ocr·文档抽取
石榴树下的七彩鱼3 天前
发票识别OCR API接入详解:自动提取发票全字段并接入财务系统(附Python/JS/PHP示例)
python·ocr·发票识别·财务自动化·api接入·石榴智能·发票ocr
人月神话-Lee5 天前
两个改动,让这个iOS OCR SDK识别成功率翻了一倍
ios·ocr·ai编程·身份证识别·银行卡识别
weixin_408099676 天前
身份证OCR识别如何做到99.9%准确率?揭秘石榴智能六大核心技术(矫正/完整度/翻拍检测/头像提取)
图像处理·人工智能·ocr·api接口·身份证识别·石榴智能
小小测试开发6 天前
EasyOCR用法全攻略:Python开源OCR工具快速上手,图文识别零门槛
python·开源·ocr