有道智云OCR API说明文档


有道智云OCR API简介

有道智云OCR API接口提供有道的OCR文字识别服务,包含文字片段识别功能。您只需要通过调用有道智云OCR API,传入经过Base64编码的图片,通过POST请求方式,就可以得到相应的文字识别结果。

有道智云OCR API HTTP地址:

有道智云OCR API HTTPS地址:

接口调用参数

调用API需要向接口发送以下字段来访问服务。

字段名 类型 含义 必填 备注
img text 要识别的图片,需要Base64编码 True 必须是Base64编码
langType text 要识别的语言类型,目前支持英文(en),和中英混合(zh-en) True 目前只支持英文:en
imgType text 图片类型,目前只支持Base64 True 目前只支持Base64:1
appKey text 应用申请的key True 可在管理控制台查看
salt text 随机数 True  
sign text 签名,通过md5(appkey+img+salt+密钥)生成 True appKey+img+salt+密钥的MD5值
docType text 服务器响应类型,目前只支持json True json

签名生成方法如下: 1、将请求参数中的 appKey(应用ID), img(注意为图片的Base64编码), 随机数(salt)和密钥 按照 appKey+img+salt+密钥 的顺序拼接得到字符串str。 2、对字符串str做md5,得到32位大写的sign(参考Java生成MD5示例)

注意:

1、请先将需要识别的图片转换为Base64编码

2、在发送HTTP请求之前需要对各字段做URL encode。

3、在生成签名拼接 appid+img+salt+密钥 字符串时,img不需要做URL encode,在生成签名之后,发送HTTP请求之前才需要对要发送的待翻译文本字段img做URL encode。

输出结果

返回的结果是json格式,包含字段与FROM和TO的值有关,具体说明如下:

字段名 类型 含义 备注
errorCode text 错误返回码 一定存在
Result text 识别结果 查询正确时一定存在

示例

使用示例查询作为参考说明json返回结果:

{
  "errorCode": "0",
  "Result": {
      "orientation": "Up",
      "textAngle": 0,
      "language": "en",
      "lines": [
          {
              "boundingBox": "30,33,25,10",
              "words": "hello"
          }
      ]
  }
}

其中,orientation代表方向,textAngle代表与垂直向上的偏差角度,language代表识别的语言,lines代表每行的返回结果;boundingBox的四个值代表识别的文字左上角的坐标(x,y),宽度和高度;words代表识别的字

支持的语言表

语言 代码
中英混合 zh-en
英文 en

注意:

1、lanType支持"zh-en"和"en",其中"zh-en"为中英识别,"en"参数表示只识别英文。

2、若为纯英文识别,"zh-en"的识别效果不如"en",请妥善选择

错误代码列表

错误码 含义
101 缺少必填的参数,出现这个情况还可能是et的值和实际加密方式不对应
102 不支持的语言类型
103 翻译文本过长
104 不支持的API类型
105 不支持的签名类型
106 不支持的响应类型
107 不支持的传输加密类型
108 appKey无效,注册账号, 登录后台创建应用和实例并完成绑定, 可获得应用ID和密钥等信息,其中应用ID就是appKey( 注意不是应用密钥)
109 batchLog格式不正确
110 无相关服务的有效实例
111 开发者账号异常
201 解密失败,可能为DES,BASE64,URLDecode的错误
202 签名检验失败
301 辞典查询失败
302 小语种查询失败
303 服务端的其它异常
401 账户已经欠费停
1001 无效的OCR类型
1002 不支持的OCR image类型
1003 不支持的OCR Language类型
1004 识别图片过大
1201 图片base64解密失败
1301 OCR段落识别失败
1411 访问频率受限
1412 超过最大识别字节数

Java Demo示例

java生成http请求代码示例:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sun.org.apache.xml.internal.security.utils.Base64;

import outfox.ead.openapi.util.EnDeCriptUtil;

public class OCRDemoForHttp {

  static Logger logger = LoggerFactory.getLogger(OCRDemoForHttp.class);
  public static void main(String[] args) throws Exception {
      Map<String, String> map = new HashMap<>();
      String url = "http://openapi.youdao.com/ocrapi";
      String appKey = "您的appID";
      String detectType = "10011";
      String imageType = "1";
      String langType = "en";
      String docType = "json";
      String salt = String.valueOf(System.currentTimeMillis());
      String img = getImageStr("图片地址");

      map.put("appKey", appKey);
      map.put("img", img);
      map.put("detectType", detectType);
      map.put("imageType", imageType);
      map.put("langType", langType);
      map.put("salt", salt);
      map.put("docType", docType);
      String sign = md5(appKey + img + salt + "您的应用密钥");
      map.put("sign", sign);
      String result= requestOCRForHttp(url,map);
      System.out.println(result);
  }

  public static String requestOCRForHttp(String url,Map<String,String> requestParams) throws Exception{
      String result = null;
      CloseableHttpClient httpClient = HttpClients.createDefault();
      /**HttpPost*/
      HttpPost httpPost = new HttpPost(url);
      List<NameValuePair> params = new ArrayList<NameValuePair>();
      params.add(new BasicNameValuePair("appKey", requestParams.get("appKey")));
      params.add(new BasicNameValuePair("img", requestParams.get("img")));
      params.add(new BasicNameValuePair("detectType", requestParams.get("detectType")));
      params.add(new BasicNameValuePair("imageType", requestParams.get("imageType")));
      params.add(new BasicNameValuePair("langType", requestParams.get("langType")));
      params.add(new BasicNameValuePair("salt", requestParams.get("salt")));
      params.add(new BasicNameValuePair("sign", requestParams.get("sign")));
      params.add(new BasicNameValuePair("docType", requestParams.get("docType")));
      httpPost.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));
      /**HttpResponse*/
      CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
      try{
          HttpEntity httpEntity = httpResponse.getEntity();
          result = EntityUtils.toString(httpEntity, "utf-8");
          EntityUtils.consume(httpEntity);
      }finally{
          try{
              if(httpResponse!=null){
                  httpResponse.close();
              }
          }catch(IOException e){
              logger.info("          }
      }
      return result;
  }
  /**
   * 获得图片的Base64编码
   * @param imgFile
   * @return
   */
  public static String getImageStr(String imgFile)
  {//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
      InputStream in = null;
      byte[] data = null;
      //读取图片字节数组
      try
      {
          in = new FileInputStream(imgFile);
          data = new byte[in.available()];
          in.read(data);
          in.close();
      }
      catch (IOException e)
      {
          e.printStackTrace();
      }
      //对字节数组Base64编码
      return Base64.encode(data);//返回Base64编码过的字节数组字符串
  }
  /**
   * 生成32位MD5摘要
   * @param string
   * @return
   */
  public static String md5(String string) {
      if(string == null){
          return null;
      }
      char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
              'A', 'B', 'C', 'D', 'E', 'F'};
      byte[] btInput = string.getBytes();
      try{
          /** 获得MD5摘要算法的 MessageDigest 对象 */
          MessageDigest mdInst = MessageDigest.getInstance("MD5");
          /** 使用指定的字节更新摘要 */
          mdInst.update(btInput);
          /** 获得密文 */
          byte[] md = mdInst.digest();
          /** 把密文转换成十六进制的字符串形式 */
          int j = md.length;
          char str[] = new char[j * 2];
          int k = 0;
          for (byte byte0 : md) {
              str[k++] = hexDigits[byte0 >>> 4 & 0xf];
              str[k++] = hexDigits[byte0 & 0xf];
          }
          return new String(str);
      }catch(NoSuchAlgorithmException e){
          return null;
      }
  }
}

常见问题及注意事项

1. 返回110

应用没有绑定服务实例,可以新建服务实例,绑定服务实例。

2. 返回108

appKey无效,注册账号, 登录后台创建应用和实例并完成绑定, 可获得应用ID和密钥等信息,其中应用ID就是appKey( 注意不是应用密钥)

 
有道智云平台介绍
网易有道旗下一个为开发者、企业和政府机构等提供自然语言翻译、文字识别OCR等服务以及行业解决方案的云服务平台,致力于提供安全、可靠和高效的云服务。
联系方式
联系电话:010-8255-8901
商务合作:
投诉反馈:
地址:北京市海淀区西北旺东路10号院 中关村软件园二期西区7号 网易(北京)公司
微信公众号
 
 
 
©2017 网易公司 京ICP证080268号