阿里云OCR识别

发布时间:2024年01月24日

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;
        }
    }

文章来源:https://blog.csdn.net/wangjingrong123/article/details/135815728
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。