百度 AI 提供了一个出租车发票扫描接口:
https://ai.baidu.com/ai-doc/OCR/Zk3h7xxnn
支持识别全国各大城市出租车票的 16 个关键字段,包括发票号码、代码、车号、日期、总金额、燃油附加费、叫车服务费、省、市、单价、里程、上车时间、下车时间等。
我们首先在 postman 里调用该接口。
url:https://aip.baidubce.com/rest/2.0/ocr/v1/taxi_receipt?access_token=[这里传入 Access Token]
按照接口文档的说明,content-type 设置为 application/x-www-form-urlencoded:
在 body 里,类型选择为 x-www-form-urlencoded:
指定参数的 key 为 image,value 为发票图片二进制数据对应的 base 64 编码的 url encode 值。
下图是一个例子。点击 Send 按钮,会收到下图所示的响应数据,该发票里的关键信息被 API 成功解析。
这里我们需要注意一点,在 postman 里,我们指定参数 image 的值,是没有经过 url encode 的图片 base64 encode 的值,即下图图例 A。
而 postman 在发送该 HTTP 请求时,会自动把该base 64 的值做一次 url encode 处理,比如 base64 里的符号 "/", 被处理成了 %2F. 见上图 B 的图例。
也就是说,我们在编写 ABAP 代码时,需要手动调用 cl_http_utility=>escape_url 执行这个 encode 动作。
下面是 ABAP 代码实现,逻辑不难。
report z.
DATA: http_client TYPE REF TO if_http_client.
DATA: ls_token TYPE string.
DATA: lv_token TYPE string.
DATA: url type string.
url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/taxi_receipt'.
ls_token = '这里需要填写你实际获取的 Access Token'.
CONCATENATE url '?access_token=' ls_token INTO lv_token.
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = lv_token
IMPORTING
client = http_client.
http_client->propertytype_logon_popup = http_client->co_enabled .
http_client->propertytype_redirect = http_client->co_disabled .
CALL METHOD http_client->request->set_header_field
EXPORTING
name = '~request_method'
value = 'POST'. "
CALL METHOD http_client->request->set_header_field
EXPORTING
name = '~request_protocol'
value = 'HTTPS/1.1'.
CALL METHOD http_client->request->set_header_field
EXPORTING
name = 'Content-Type'
value = 'application/x-www-form-urlencoded; charset=utf-8'.
*----------上传图片并转换成base64格式 start------------
types: begin of ty_pic,
pic_data(1024) type x,
end of ty_pic.
data: path_string type string.
*parameters: p_file like rlgrap-filename obligatory.
data: lv_content type xstring.
data: encode_str type string.
data: len type i.
data: pic_tab type table of ty_pic."二进制内表
* path_string = p_file.
call function 'GUI_UPLOAD'
exporting
"filename = path_string
filename = 'C:\Users\I042416\Documents\1.jpg'
filetype = 'BIN'
importing
filelength = len
tables
data_tab = pic_tab[].
call function 'SCMS_BINARY_TO_XSTRING'
exporting
input_length = len
importing
buffer = lv_content
tables
binary_tab = pic_tab[]
exceptions
failed = 1
others = 2.
" xstring转base64
CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'
EXPORTING
input = lv_content
IMPORTING
output = encode_str.
*----------上传图片并转换成base64格式 end--------------
"set body body内传base64格式图片
data: gv_json_send TYPE string.
data: lv_len TYPE i.
encode_str = cl_http_utility=>escape_url( encode_str ).
CONCATENATE 'image=' encode_str INTO gv_json_send.
lv_len = strlen( gv_json_send ).
CALL METHOD HTTP_CLIENT->REQUEST->SET_CDATA
EXPORTING
DATA = gv_json_send
OFFSET = 0
LENGTH = lv_len.
CALL METHOD http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2.
CALL METHOD http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.
IF sy-subrc <> 0.
DATA:l_sysubrc TYPE sysubrc,
l_error_text TYPE string.
l_sysubrc = sy-subrc.
CALL METHOD http_client->get_last_error
IMPORTING
code = l_sysubrc
message = l_error_text.
ENDIF.
"Read HTTP RETURN CODE
DATA:http_status_code TYPE i,
status_text TYPE string.
CALL METHOD http_client->response->get_status
IMPORTING
code = http_status_code
reason = status_text
.
WRITE: / 'HTTP_STATUS_CODE = ',
http_status_code,
/ 'STATUS_TEXT = ',
status_text.
"READ RESPONSE DATA
DATA:w_result TYPE string.
CALL METHOD http_client->response->get_cdata
RECEIVING data = w_result .
* 获取返回的数据
DATA: r_value TYPE string,
r_value1 TYPE string,
r_fields TYPE tihttpnvp,
r_h_fields TYPE tihttpnvp.
http_client->response->get_header_fields( CHANGING fields = r_h_fields ). "返回表数据
最后在 ABAP 端接收到成功解析的结果:
更多Jerry的原创文章,尽在:"汪子熙":
网友评论