'use strict';
/**
* Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* @file AipOcr.js
* @author baidu aip
*/
const BaseClient = require('./client/baseClient');
const RequestInfo = require('./client/requestInfo');
const HttpClient = require('./http/httpClient');
const objectTools = require('./util/objectTools');
const METHOD_POST = 'POST';
const GENERAL_BASIC_PATH = '/rest/2.0/ocr/v1/general_basic';
const ACCURATE_BASIC_PATH = '/rest/2.0/ocr/v1/accurate_basic';
const GENERAL_PATH = '/rest/2.0/ocr/v1/general';
const ACCURATE_PATH = '/rest/2.0/ocr/v1/accurate';
const GENERAL_ENHANCED_PATH = '/rest/2.0/ocr/v1/general_enhanced';
const WEB_IMAGE_PATH = '/rest/2.0/ocr/v1/webimage';
const IDCARD_PATH = '/rest/2.0/ocr/v1/idcard';
const BANKCARD_PATH = '/rest/2.0/ocr/v1/bankcard';
const DRIVING_LICENSE_PATH = '/rest/2.0/ocr/v1/driving_license';
const VEHICLE_LICENSE_PATH = '/rest/2.0/ocr/v1/vehicle_license';
const LICENSE_PLATE_PATH = '/rest/2.0/ocr/v1/license_plate';
const BUSINESS_LICENSE_PATH = '/rest/2.0/ocr/v1/business_license';
const RECEIPT_PATH = '/rest/2.0/ocr/v1/receipt';
const TABLE_RECOGNIZE_PATH = '/rest/2.0/solution/v1/form_ocr/request';
const TABLE_RESULT_GET_PATH = '/rest/2.0/solution/v1/form_ocr/get_request_result';
/**
* AipOcr类
*
* @class
* @extends BaseClient
* @constructor
* @param {string} appid appid.
* @param {string} ak access key.
* @param {string} sk security key.
*/
class AipOcr extends BaseClient {
constructor(appId, ak, sk) {
super(appId, ak, sk);
}
commonImpl(param) {
let httpClient = new HttpClient();
let apiUrl = param.targetPath;
delete param.targetPath;
let requestInfo = new RequestInfo(apiUrl,
param, METHOD_POST);
return this.doRequest(requestInfo, httpClient);
}
/**
* 通用文字识别接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* language_type 识别语言类型,默认为CHN_ENG。可选值包括:
- CHN_ENG:中英文混合;
- ENG:英文;
- POR:葡萄牙语;
- FRE:法语;
- GER:德语;
- ITA:意大利语;
- SPA:西班牙语;
- RUS:俄语;
- JAP:日语;
- KOR:韩语;
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语)
* probability 是否返回识别结果中每一行的置信度
* @return {Promise} - 标准Promise对象
*/
generalBasic(image, options) {
let param = {
image: image,
targetPath: GENERAL_BASIC_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 通用文字识别接口
*
* @param {string} url - 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* language_type 识别语言类型,默认为CHN_ENG。可选值包括:
- CHN_ENG:中英文混合;
- ENG:英文;
- POR:葡萄牙语;
- FRE:法语;
- GER:德语;
- ITA:意大利语;
- SPA:西班牙语;
- RUS:俄语;
- JAP:日语;
- KOR:韩语;
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语)
* probability 是否返回识别结果中每一行的置信度
* @return {Promise} - 标准Promise对象
*/
generalBasicUrl(url, options) {
let param = {
url: url,
targetPath: GENERAL_BASIC_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 通用文字识别(高精度版)接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* probability 是否返回识别结果中每一行的置信度
* @return {Promise} - 标准Promise对象
*/
accurateBasic(image, options) {
let param = {
image: image,
targetPath: ACCURATE_BASIC_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 通用文字识别(含位置信息版)接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* recognize_granularity 是否定位单字符位置,big:不定位单字符位置,默认值;small:定位单字符位置
* language_type 识别语言类型,默认为CHN_ENG。可选值包括:
- CHN_ENG:中英文混合;
- ENG:英文;
- POR:葡萄牙语;
- FRE:法语;
- GER:德语;
- ITA:意大利语;
- SPA:西班牙语;
- RUS:俄语;
- JAP:日语;
- KOR:韩语;
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语)
* vertexes_location 是否返回文字外接多边形顶点位置,不支持单字位置。默认为false
* probability 是否返回识别结果中每一行的置信度
* @return {Promise} - 标准Promise对象
*/
general(image, options) {
let param = {
image: image,
targetPath: GENERAL_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 通用文字识别(含位置信息版)接口
*
* @param {string} url - 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* recognize_granularity 是否定位单字符位置,big:不定位单字符位置,默认值;small:定位单字符位置
* language_type 识别语言类型,默认为CHN_ENG。可选值包括:
- CHN_ENG:中英文混合;
- ENG:英文;
- POR:葡萄牙语;
- FRE:法语;
- GER:德语;
- ITA:意大利语;
- SPA:西班牙语;
- RUS:俄语;
- JAP:日语;
- KOR:韩语;
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语)
* vertexes_location 是否返回文字外接多边形顶点位置,不支持单字位置。默认为false
* probability 是否返回识别结果中每一行的置信度
* @return {Promise} - 标准Promise对象
*/
generalUrl(url, options) {
let param = {
url: url,
targetPath: GENERAL_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 通用文字识别(含位置高精度版)接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* recognize_granularity 是否定位单字符位置,big:不定位单字符位置,默认值;small:定位单字符位置
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* vertexes_location 是否返回文字外接多边形顶点位置,不支持单字位置。默认为false
* probability 是否返回识别结果中每一行的置信度
* @return {Promise} - 标准Promise对象
*/
accurate(image, options) {
let param = {
image: image,
targetPath: ACCURATE_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 通用文字识别(含生僻字版)接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* language_type 识别语言类型,默认为CHN_ENG。可选值包括:
- CHN_ENG:中英文混合;
- ENG:英文;
- POR:葡萄牙语;
- FRE:法语;
- GER:德语;
- ITA:意大利语;
- SPA:西班牙语;
- RUS:俄语;
- JAP:日语;
- KOR:韩语;
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语)
* probability 是否返回识别结果中每一行的置信度
* @return {Promise} - 标准Promise对象
*/
generalEnhance(image, options) {
let param = {
image: image,
targetPath: GENERAL_ENHANCED_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 通用文字识别(含生僻字版)接口
*
* @param {string} url - 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* language_type 识别语言类型,默认为CHN_ENG。可选值包括:
- CHN_ENG:中英文混合;
- ENG:英文;
- POR:葡萄牙语;
- FRE:法语;
- GER:德语;
- ITA:意大利语;
- SPA:西班牙语;
- RUS:俄语;
- JAP:日语;
- KOR:韩语;
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语)
* probability 是否返回识别结果中每一行的置信度
* @return {Promise} - 标准Promise对象
*/
generalEnhanceUrl(url, options) {
let param = {
url: url,
targetPath: GENERAL_ENHANCED_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 网络图片文字识别接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语)
* @return {Promise} - 标准Promise对象
*/
webImage(image, options) {
let param = {
image: image,
targetPath: WEB_IMAGE_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 网络图片文字识别接口
*
* @param {string} url - 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语)
* @return {Promise} - 标准Promise对象
*/
webImageUrl(url, options) {
let param = {
url: url,
targetPath: WEB_IMAGE_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 身份证识别接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {string} idCardSide - front:身份证正面;back:身份证背面
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* detect_risk 是否开启身份证风险类型(身份证复印件、临时身份证、身份证翻拍、修改过的身份证)功能,默认不开启,即:false。可选值:true-开启;false-不开启
* @return {Promise} - 标准Promise对象
*/
idcard(image, idCardSide, options) {
let param = {
image: image,
id_card_side: idCardSide,
targetPath: IDCARD_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 银行卡识别接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* @return {Promise} - 标准Promise对象
*/
bankcard(image, options) {
let param = {
image: image,
targetPath: BANKCARD_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 驾驶证识别接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* @return {Promise} - 标准Promise对象
*/
drivingLicense(image, options) {
let param = {
image: image,
targetPath: DRIVING_LICENSE_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 行驶证识别接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* accuracy normal 使用快速服务,1200ms左右时延;缺省或其它值使用高精度服务,1600ms左右时延
* @return {Promise} - 标准Promise对象
*/
vehicleLicense(image, options) {
let param = {
image: image,
targetPath: VEHICLE_LICENSE_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 车牌识别接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* multi_detect 是否检测多张车牌,默认为false,当置为true的时候可以对一张图片内的多张车牌进行识别
* @return {Promise} - 标准Promise对象
*/
licensePlate(image, options) {
let param = {
image: image,
targetPath: LICENSE_PLATE_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 营业执照识别接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* @return {Promise} - 标准Promise对象
*/
businessLicense(image, options) {
let param = {
image: image,
targetPath: BUSINESS_LICENSE_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 通用票据识别接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* recognize_granularity 是否定位单字符位置,big:不定位单字符位置,默认值;small:定位单字符位置
* probability 是否返回识别结果中每一行的置信度
* accuracy normal 使用快速服务,1200ms左右时延;缺省或其它值使用高精度服务,1600ms左右时延
* detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。
* @return {Promise} - 标准Promise对象
*/
receipt(image, options) {
let param = {
image: image,
targetPath: RECEIPT_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 表格文字识别接口
*
* @param {string} image - 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* @return {Promise} - 标准Promise对象
*/
tableBegin(image, options) {
let param = {
image: image,
targetPath: TABLE_RECOGNIZE_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
/**
* 表格识别结果接口
*
* @param {string} requestId - 发送表格文字识别请求时返回的request id
* @param {Object} options - 可选参数对象,key: value都为string类型
* @description options - options列表:
* result_type 期望获取结果的类型,取值为“excel”时返回xls文件的地址,取值为“json”时返回json格式的字符串,默认为”excel”
* @return {Promise} - 标准Promise对象
*/
tableGetresult(requestId, options) {
let param = {
request_id: requestId,
targetPath: TABLE_RESULT_GET_PATH
};
return this.commonImpl(objectTools.merge(param, options));
}
tableRecorgnize(image, type, timeout, interval) {
let self = this;
timeout = timeout || 20000;
interval = interval || 2000;
return this.tableBegin(image).then(function(result) {
if (result.error_code) {
return result;
}
let id = result.result[0]['request_id'];
let pid = null;
let startTime = Date.now();
return new Promise(function(resolve, reject) {
pid = setInterval(function () {
if (Date.now() - startTime > timeout) {
reject({errorMsg: 'get result timeout', requestId: id});
clearInterval(pid);
} else {
self.tableGetresult(id, type).then(function (result) {
if (result['result']['ret_code'] === 3) {
clearInterval(pid);
resolve(result);
}
});
}
}, interval);
})
});
}
}
module.exports = AipOcr;