阿里云OCR识别

ocr识别证件照;主要是使用阿里云j接口:

1、注册阿里云账户获取appKey \appSer

2、调用接口

2.1:定义常量

复制代码
public class OrcHttpConstant {

    /**
     *   驾驶证识别appCode
     */
    public static final String OCR_APPCODE = "033f4b0f719d4e01b431a18cba7a79e1";

    /**
     * 调用方式
     */
    public static final String MONTH = "POST";

    /**
    *   驾驶证识别url
    */
    public static final String DRIVER_LICENSE_HOST = "https://cardriving.market.alicloudapi.com";

    /**
    *   驾驶证识别path
    */
    public static final String DRIVER_LICENSE_PATH = "/rest/160601/ocr/ocr_driver_license.json";


    /**
     *   身份证识别url
     */
    public static final String ID_CARD_HOST = "https://cardnumber.market.alicloudapi.com";

    /**
     *   身份证识别path
     */
    public static final String ID_CARD_PATH = "/rest/160601/ocr/ocr_idcard.json";


    /**
     *   行驶证识别url
     */
    public static final String VEHICLE_LICENSE_HOST = "https://driving.market.alicloudapi.com";

    /**
     *   行驶证识别path
     */
    public static final String VEHICLE_LICENSE_PATH = "/rest/160601/ocr/ocr_vehicle.json";


    /**
     *   营业执照证识别url
     */
    public static final String BUSINESS_LICENSE_HOST = "https://bizlicense.market.alicloudapi.com";

    /**
     *   营业执照证识别path
     */
    public static final String BUSINESS_LICENSE_PATH = "/rest/160601/ocr/ocr_business_license.json";


    /**
     *   发票识别url
     */
    public static final String INVOICE_LICENSE_HOST = "https://dgfp.market.alicloudapi.com";

    /**
     *   发票识别path
     */
    public static final String INVOICE_LICENSE_PATH = "/ocrservice/invoice";

}

2.2 :OCR识别工具: 主要是按照type调用个子的方法

复制代码
/**
 * 阿里云OCR识别功能
 */
@Component
@Slf4j
public class AliOcrTools {




    /**
     * orc识别接口
     * @param appCode 识别code
     * @param imgFile 识别图片路径
     * @param isFace 正反面
     * @param type 类型
     * @return
     */
    public static JSONObject orcIdentify(String appCode,String imgFile,Boolean isFace,String type) {
        if(StringUtil.isEmpty(appCode)){
            appCode= OrcHttpConstant.OCR_APPCODE;
        }
        String method = OrcHttpConstant.MONTH;
        switch (type) {
            //驾驶证
            case "1":
                return getDriverLicenseInfo(appCode, imgFile, isFace,method);
            //行驶证
            case "2":
                return getVehicleInfo(appCode, imgFile,isFace,method);
            //营业执照
            case "3":
                return getBusinessLicenseInfo(appCode, imgFile,method);
            //身份证
            case "4":
                return getIdcardInfo(appCode, imgFile,method,isFace);
            //增值税发票
            case "5":
                return getCustomizeInfo(appCode,imgFile,method);
            default:
                return null;
        }
    }

    /**
     * 驾驶证识别
     * flag(true:正面;false反面)
     * @param imgUrl
     *
     */
    public static JSONObject getDriverLicenseInfo(String appcode, String imgUrl,Boolean flag,String method) {
        //String host = "https://dm-52.data.aliyun.com";
        String host = OrcHttpConstant.DRIVER_LICENSE_HOST;
        // String path = "/rest/160601/ocr/ocr_driver_license.json";
        String path = OrcHttpConstant.DRIVER_LICENSE_PATH;
        JSONObject configObj = new JSONObject();
        if(flag){
            configObj.put("side", "face");
        }else {
            configObj.put("side", "back");
        }
        String config_str = configObj.toString();
        Map<String, String> headers = new HashMap<String, String>();
        headers.put("Authorization", "APPCODE " + appcode);
        Map<String, String> querys = new HashMap<String, String>();
        // 对图像进行base64编码
        String imgBase64 = img_base64(imgUrl);
        //如果文档的输入中含有inputs字段,设置为True, 否则设置为False
        Boolean is_old_format = false;
        // 拼装请求body的json字符串
        JSONObject requestObj = new JSONObject();
        try {
            requestObj.put("image", imgBase64);
            if(config_str.length() > 0) {
                requestObj.put("configure", config_str);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        String bodys = requestObj.toString();
        log.info("body:"+bodys);
        return dealReauest(host,path,method,headers,querys,bodys);
    }


    /**
     * 行驶证识别
     * flag(true:正面;false反面)
     * @param imgUrl(反面)
     */
    public static JSONObject getVehicleInfo(String appcode,String imgUrl,Boolean flag,String method) {
       /* String host = "https://dm-53.data.aliyun.com";
        String path = "/rest/160601/ocr/ocr_vehicle.json";*/
        String host = OrcHttpConstant.VEHICLE_LICENSE_HOST;
        String path = OrcHttpConstant.VEHICLE_LICENSE_PATH;
        JSONObject configObj = new JSONObject();
        if(flag){
            configObj.put("side", "face");
        }else {
            configObj.put("side", "back");
        }
        String config_str = configObj.toString();
        Map<String, String> headers = new HashMap<String, String>();
        headers.put("Authorization", "APPCODE " + appcode);
        Map<String, String> querys = new HashMap<String, String>();
        // 对图像进行base64编码
        String imgBase64 = getImgBase64(imgUrl);
        //如果文档的输入中含有inputs字段,设置为True, 否则设置为False
        Boolean is_old_format = false;
        // 拼装请求body的json字符串
        JSONObject requestObj = new JSONObject();
        try {
            if(is_old_format) {
                JSONObject obj = new JSONObject();
                obj.put("image", imgBase64);
                if(config_str.length() > 0) {
                    obj.put("configure", config_str);
                }
                JSONArray inputArray = new JSONArray();
                inputArray.add(obj);
                requestObj.put("inputs", inputArray);
            }else{
                requestObj.put("image", imgBase64);
                if(config_str.length() > 0) {
                    requestObj.put("configure", config_str);
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        String bodys = requestObj.toString();
        return dealReauest(host,path,method,headers,querys,bodys);
    }


    /**
     *  营业执照识别
     *  @param imgUrl
     *  @return
     */
    public static JSONObject getBusinessLicenseInfo(String appcode,String imgUrl,String method) {
       /* String host = "https://dm-58.data.aliyun.com";
        String path = "/rest/160601/ocr/ocr_business_license.json";*/
        String host = OrcHttpConstant.BUSINESS_LICENSE_HOST;
        String path = OrcHttpConstant.BUSINESS_LICENSE_PATH;
        Map<String, String> headers = new HashMap<String, String>();
        headers.put("Authorization", "APPCODE " + appcode);
        headers.put("Content-Type", "application/json; charset=UTF-8");
        Map<String, String> querys = new HashMap<String, String>();
        String imgBase64 = getImgBase64(imgUrl);
        if(imgBase64 == null) {
            return null;
        }
        //拼接请求体
        String bodys =  "{\"image\":\""+imgBase64+"\"}";
        return dealReauest(host,path,method,headers,querys,bodys);
    }


    /**
     * 身份证正反面识别
     * @param appcode 识别码,
     * @param imgUrl 需要识别的文件路径
     * @param method 调用方式
     * @param flag (true:正面;false反面)
     * @return
     */
    public static JSONObject getIdcardInfo(String appcode,String imgUrl,String method,Boolean flag) {
      /*  String host = "http://dm-51.data.aliyun.com";
        String path = "/rest/160601/ocr/ocr_idcard.json";*/
        String host = OrcHttpConstant.ID_CARD_HOST;
        String path = OrcHttpConstant.ID_CARD_PATH;
        JSONObject configObj = new JSONObject();
        if(flag){
            //脸部面
            configObj.put("side", "face");
        }else {
            //国徽
            configObj.put("side", "back");
        }
        String config_str = configObj.toString();
        Map<String, String> headers = new HashMap<String, String>();
        headers.put("Authorization", "APPCODE " + appcode);
        Map<String, String> querys = new HashMap<String, String>();
        // 对图像进行base64编码
        String imgBase64 = img_base64(imgUrl);
        //如果文档的输入中含有inputs字段,设置为True, 否则设置为False
        Boolean is_old_format = false;
        // 拼装请求body的json字符串
        JSONObject requestObj = new JSONObject();
        try {
            if(is_old_format) {
                JSONObject obj = new JSONObject();
                obj.put("image", imgBase64);
                if(config_str.length() > 0) {
                    obj.put("configure", config_str);
                }
                JSONArray inputArray = new JSONArray();
                inputArray.add(obj);
                requestObj.put("inputs", inputArray);
            }else{
                requestObj.put("image", imgBase64);
                if(config_str.length() > 0) {
                    requestObj.put("configure", config_str);
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        String bodys = requestObj.toString();
        return dealReauest(host,path,method,headers,querys,bodys);
    }


    /**
     *
     *
     * @param: [host, path, method, appCode, imgFile]
     * @param: [调用url, 调用路径, 调用方式, 识别码, 需要识别的文件路径]
     * @return: dadao.base.String
     * @author: Mr luo
     * @date: 2023/7/13 15:01
     */
    /**
     * 发票识别
     * @param appCode 识别码,
     * @param imgFile 需要识别的文件路径
     * @param method 调用方式
     * @return
     */
    private static JSONObject getCustomizeInfo(String appCode,String imgFile,String method) {
        String host = OrcHttpConstant.INVOICE_LICENSE_HOST;
        String path = OrcHttpConstant.INVOICE_LICENSE_PATH;
        Map<String, String> headers = new HashMap<>();
        headers.put("Authorization", "APPCODE " + appCode);
        headers.put("Content-Type", "application/json; charset=UTF-8");
        Map<String, String> querys = new HashMap<>();
        String imgBase64 = img_base64(imgFile);
        if (imgBase64 == null) {
            return null;
        }
        String bodys = "{\"img\":\"" + imgBase64 + "\",\"url\":\"\"}";
        return dealReauest(host,path,method,headers,querys,bodys);
    }

    /**
     * 根据图片路径,获取图片的Base64编码(按照网络图片)
     * @param
     * @return
     */
    public static String getImgBase64(String imgUrl)  {
        URL url = null;
        try {
            log.info("imgUrl路径:"+ imgUrl);
            url = new URL(imgUrl);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        //将图片文件转化为字节数组字符串,并对其进行Base64编码处理
        //打开链接
        HttpURLConnection conn = null;
        InputStream inStream = null;
        String base64 = "";
        try {
            conn = (HttpURLConnection) url.openConnection();
            //设置请求方式为"GET"
            conn.setRequestMethod("GET");
            //超时响应时间为5秒
            conn.setConnectTimeout(5 * 1000);
            //通过输入流获取图片数据
            inStream = conn.getInputStream();
            //得到图片的二进制数据,以二进制封装得到数据,具有通用性
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            //创建一个Buffer字符串
            byte[] buffer = new byte[1024];
            //每次读取的字符串长度,如果为-1,代表全部读取完毕
            int len = 0;
            //使用一个输入流从buffer里把数据读取出来
            while ((len = inStream.read(buffer)) != -1) {
                //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
                outStream.write(buffer, 0, len);
            }
            byte[] data = outStream.toByteArray();
            //对字节数组Base64编码
            BASE64Encoder encoder = new BASE64Encoder();
            base64 = encoder.encode(data);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭输入流
            try {
                inStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return base64;
        }
    }

    public static String img_base64(String path) {
        /**
         *  对path进行判断,如果是本地文件就二进制读取并base64编码,如果是url,则返回
         */
        String imgBase64="";
        if (path.startsWith("http")){
            log.info("imgUrl网络地址路径:"+ path);
            imgBase64= getImgBase64(path);
        }else {
            try {
                File file = new File(path);
                byte[] content = new byte[(int) file.length()];
                FileInputStream finputstream = new FileInputStream(file);
                finputstream.read(content);
                finputstream.close();
                imgBase64 = new String(Base64.encodeBase64(content));
            } catch (IOException e) {
                e.printStackTrace();
                return imgBase64;
            }
        }

        return imgBase64;
    }

    /**
     * 识别方法 向阿里云发送请求
     * @param host 调用url
     * @param path 调用路径
     * @param method 调用方式
     * @param headers 请求头
     * @param querys 查询条件
     * @param bodys 参数体
     * @return
     */
    private static JSONObject dealReauest( String host,String path,String method, Map<String, String> headers, Map<String, String> querys,String bodys){
        JSONObject jsonObject = new JSONObject();
        try {
            HttpResponse response = AliHttpUtils.doPost(host, path, method, headers, querys, bodys);
            log.info("返回结果response:"+response.toString());
            int stat = response.getStatusLine().getStatusCode();
            if(stat != 200){
                return null;
            }
            String res = EntityUtils.toString(response.getEntity());
            log.info("识别结果:"+res);
            jsonObject = JSON.parseObject(res);
            jsonObject.put("success",1);
            return jsonObject;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }finally {
            return jsonObject;
        }
    }
相关推荐
我不介意孤独1 天前
面向华为昇腾 NPU 的企业级 PaddleOCR 推理服务,支持多卡多实例动态扩缩容、高召回 OCR 与生产级部署。
服务器·华为·ocr
合合技术团队3 天前
海外发票智能解析:跨版式、多税制票据的自动化处理方案(附GitHub项目地址)
运维·自动化·github·ocr
OCR_133716212753 天前
证件日期防伪核验技术解析:AI+OCR助力多场景精准验真
人工智能·ocr
AI人工智能+3 天前
一种基于深度学习的表格识别技术,通过融合计算机视觉、图神经网络和Transformer等算法,能精准解析复杂表格结构
深度学习·计算机视觉·ocr·表格识别
HyperAI超神经4 天前
在线教程丨单卡即可爆改,面壁智能等开源MiniCPM-V-4.6,1.3B端侧模型支持图像理解/视频理解/OCR/多轮多模态对话
人工智能·ai·ocr
AI人工智能+4 天前
营业执照识别技术通过计算机视觉与人工智能技术,实现企业证照信息的自动化采集
人工智能·深度学习·ocr·营业执照识别
ZHW_AI课题组4 天前
Python调用腾讯API实现车辆号牌识别
python·ocr·腾讯云·api调用
深圳市快瞳科技有限公司4 天前
医疗票据OCR:打通对接壁垒,搞定信息抽取与规则适配
ocr
spencer_tseng4 天前
OCR (AI) 2026.05.13
ai·ocr
许彰午4 天前
# OCR与语音识别——政务AI的两个实用场景
人工智能·ocr·语音识别