话不多说 直接上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);
        }
    }
}
相关推荐
Albart5752 天前
保姆级教程|Python+DeepSeek-V4-Pro实现AI客服Demo 支持OCR扫描PDF+全格式RAG知识库(附完整源码)
人工智能·python·ocr·ai客服·大模型api·私有知识库·deepseek
SamChan902 天前
对比 4 种主流 PDF 文档解析方案:PyMuPDF vs pdfplumber vs Apache PDFBox vs 大模型 OCR
python·ai·pdf·ocr·apache·机器翻译
zhonyu鱼2 天前
Pot 翻译:开源免费的跨平台划词翻译与 OCR 工具
windows·macos·开源·ocr·开源软件
AI人工智能+3 天前
医疗器械生产备案凭证识别技术,以AI为核心驱动力,为构建透明、高效、安全的医疗器械流通秩序提供了坚实的技术支撑。
人脸识别·ocr·医疗器械生产备案凭证识别
Zguigo3 天前
OCR 核心原理 + 模型 + 检测与识别
数据库·ocr
楚识科技3 天前
从感知到执行:OCR RPA深度融合构建端到端智能流程自动化新范式
自动化·ocr·rpa
楚识科技4 天前
破除通用瓶颈——企业级OCR定制化开发的架构思维与实战范式
架构·ocr
程序员-李俞4 天前
Mistral OCR 4真正改变的不是“识字”:文档AI正在变成Agent的数据入口
人工智能·windows·ai作画·aigc·ocr·ai编程·ai写作
楚识科技4 天前
不动产证OCR赋能金融房产:从字段提取到核验闭环的落地逻辑
金融·数据挖掘·ocr
苏苏susuus4 天前
从像素到汉字:OCR 模型是如何依靠 CNN “学会“识字的?
人工智能·cnn·ocr