最近作者项目中用到了身份证识别跟营业执照的OCR识别,就研究了一下百度云跟腾讯云的OCR产品接口。
1.腾讯云OCR
收费:身份证OCR和营业执照OCR接口,每个接口每个月各有1000次的免费调用
接口说明:
-
身份证OCR接口 -
https://cloud.tencent.com/document/product/866/33524
-
https://cloud.tencent.com/document/product/866/17598
身份证-OCR接入
-
引入腾讯的SDK及JSON
<dependency> <groupId>com.tencentcloudapi</groupId> <artifactId>tencentcloud-sdk-java</artifactId> <version>3.0.58</version> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency>
2.前端html代码
<form action=\"/ocr/uploadFile\" method=\"POST\" enctype=\"multipart/form-data\"> <input type=\"file\" name=\"file\"> <br /> <input type=\"radio\" name=\"card_side\" value=\"FRONT\"> 正面 <input type=\"radio\" name=\"card_side\" value=\"BACK\"> 反面 <br /> <input type=\"submit\" value=\"提交\"> </form>
3.后端代码
@PostMapping(\"uploadFile\") @ResponseBody public IDCardOCRResponse OCRIdCardTest(@RequestParam(value = \"file\") MultipartFile file,@RequestParam(value = \"card_side\") String cardSize,Model model){ try { Credential cred = new Credential(\"AKIDGQfhYTqEs0DMvUQH93wXKsIX\", \"7adThzEEH6mK6zg9MMwX0\"); HttpProfile httpProfile = new HttpProfile(); httpProfile.setEndpoint(\"ocr.tencentcloudapi.com\"); ClientProfile clientProfile = new ClientProfile(); clientProfile.setHttpProfile(httpProfile); OcrClient client = new OcrClient(cred, \"ap-beijing\", clientProfile); Map<String, String> params = new HashMap<>(); params.put(\"ImageBase64\", getBase64FromInputStream(file.getInputStream())); params.put(\"CardSide\", cardSize); System.out.println(getBase64FromInputStream(file.getInputStream())); IDCardOCRRequest req = IDCardOCRRequest.fromJsonString(JSONObject.fromObject(params).toString(), IDCardOCRRequest.class); IDCardOCRResponse resp = client.IDCardOCR(req); return resp; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return null; }
说明:new Credential(\"secretId\",\"secretKey\"),这两个参数在腾讯云控制台申请
4.getBase64FromInputStream代码,把MultipartFile 转为base64
public static String getBase64FromInputStream(InputStream in) { // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理 byte[] data = null; // 读取图片字节数组 try { ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); byte[] buff = new byte[100]; int rc = 0; while ((rc = in.read(buff, 0, 100)) > 0) { swapStream.write(buff, 0, rc); } data = swapStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } return new String(Base64.encodeBase64(data)); }
运行前端html码,选择身份证图片,点击提交就可以返回身份证的信息了。
营业执照-OCR
1.前端html代码
<form action=\"/ocr/bizlicense\" method=\"POST\" enctype=\"multipart/form-data\"> <input type=\"file\" name=\"file\"> <br /> <input type=\"submit\" value=\"提交\"> </form>
2.后端代码
@PostMapping(\"bizlicense\") @ResponseBody public String OCRBizlicenseTest(@RequestParam(value = \"file\") MultipartFile file) throws Exception{ RestTemplate restTemplate = new RestTemplate(); String apiUrl=\"https://recognition.image.myqcloud.com/ocr/bizlicense\"; HttpHeaders headers = new HttpHeaders(); headers.set(\"host\", \"recognition.image.myqcloud.com\"); headers.set(\"content-type\", \"application/json\"); String authorization=QQOCRSignUtils.appSign(XXXX, \"AKIDGQfhYTqEs0DXXX\", \"7adThzEEH6mKXXX\", \"\", 10L); headers.set(\"authorization\",authorization ); JSONObject params = new JSONObject(); params.put(\"appid\", \"XXX\"); params.put(\"image\", getBase64FromInputStream(file.getInputStream())); HttpEntity<JSONObject> entity = new HttpEntity<JSONObject>(params, headers); HttpEntity<String> response = restTemplate.postForEntity(apiUrl, entity, String.class); return response.getBody(); }
3.QQOCRSignUtils.appSign
/** * 生成 Authorization 签名字段 * * @param appId * @param secretId * @param secretKey * @param bucketName * @param expired * @return * @throws Exception */ public static String appSign(long appId, String secretId, String secretKey, String bucketName, long expired) throws Exception { long now = System.currentTimeMillis() / 1000; int rdm = Math.abs(new Random().nextInt()); String plainText = String.format(\"a=%d&b=%s&k=%s&t=%d&e=%d&r=%d\", appId, bucketName, secretId, now, now + expired, rdm); byte[] hmacDigest = HmacSha1(plainText, secretKey); byte[] signContent = new byte[hmacDigest.length + plainText.getBytes().length]; System.arraycopy(hmacDigest, 0, signContent, 0, hmacDigest.length); System.arraycopy(plainText.getBytes(), 0, signContent, hmacDigest.length, plainText.getBytes().length); return Base64Encode(signContent); }
运行前端html码,选择营业执照图片,点击提交就可以返回营业执照的信息了。
2.百度OCR
通过以下步骤创建OCR应用,作者当时在这一步花了很长时间
创建完之后就可以拿到appId,API Key,Secret Key,就可以调用百度提供的api了
收费:身份证OCR和营业执照OCR接口,每个接口每天各有500次的免费调用
接口说明:
-
身份证OCR接口 -
https://cloud.baidu.com/doc/OCR/OCR-API.html#.E8.BA.AB.E4.BB.BD.E8.AF.81.E8.AF.86.E5.88.AB
-
https://cloud.baidu.com/doc/OCR/OCR-API.html#.E8.90.A5.E4.B8.9A.E6.89.A7.E7.85.A7.E8.AF.86.E5.88.AB
身份证OCR
只列出后端的代码,前端代码跟腾讯的一样,只不过前后面身份证枚举值不一样,参考接口文档说明。
@PostMapping(\"ocridcard\") @ResponseBody public String OCRIdCardTest(@RequestParam(value = \"file\") MultipartFile file,@RequestParam(value = \"card_side\") String cardSize,Model model){ try { RestTemplate restTemplate = new RestTemplate(); HttpEntity<String> response = restTemplate.postForEntity(\"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=XXXXXX&client_secret=XXXXXX\",null,String.class); JSONObject jsonObject = JSONObject.fromObject(response.getBody()); System.out.println(response.getBody()); String accessToken = jsonObject.getString(\"access_token\"); String apiUrl=\"https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=\"+accessToken; HttpHeaders headers = new HttpHeaders(); headers.set(\"content-type\", \"application/x-www-form-urlencoded\"); MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); params.add(\"detect_direction\", \"true\"); params.add(\"id_card_side\", cardSize); params.add(\"image\", Base64Utils.getBase64FromInputStream(file.getInputStream())); params.add(\"detect_risk\", \"true\"); System.out.println(Base64Utils.getBase64FromInputStream(file.getInputStream())); System.out.println(URLDecoder.decode(URLEncoder.encode(Base64Utils.getBase64FromInputStream(file.getInputStream()),\"UTF-8\"),\"UTF-8\")); HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(params, headers); response = restTemplate.postForEntity(apiUrl, entity, String.class); return response.getBody(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return null; }
营业执照OCR
@PostMapping(\"ocrbusinesslicense\") @ResponseBody public String OCRBusinessLicenseTest(@RequestParam(value = \"file\") MultipartFile file,Model model){ try { RestTemplate restTemplate = new RestTemplate(); HttpEntity<String> response = restTemplate.postForEntity(\"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=XXXXX&client_secret=XXXXXX\",null,String.class); JSONObject jsonObject = JSONObject.fromObject(response.getBody()); System.out.println(response.getBody()); String accessToken = jsonObject.getString(\"access_token\"); String apiUrl=\"https://aip.baidubce.com/rest/2.0/ocr/v1/business_license?access_token=\"+accessToken; HttpHeaders headers = new HttpHeaders(); headers.set(\"content-type\", \"application/x-www-form-urlencoded\"); MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); params.add(\"detect_direction\", \"true\"); params.add(\"image\", Base64Utils.getBase64FromInputStream(file.getInputStream())); System.out.println(Base64Utils.getBase64FromInputStream(file.getInputStream())); System.out.println(URLDecoder.decode(URLEncoder.encode(Base64Utils.getBase64FromInputStream(file.getInputStream()),\"UTF-8\"),\"UTF-8\")); HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(params, headers); response = restTemplate.postForEntity(apiUrl, entity, String.class); return response.getBody(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return null; }
作者:
Eric.Chen
出处:
https://www.cnblogs.com/lc-chenlong
如果喜欢作者的文章,请关注“写代码的猿”订阅号以便第一时间获得最新内容。本文版权归作者所有,欢迎转载