美文网首页SAP
用 ABAP 调用 OCR 接口实现出租车发票扫描

用 ABAP 调用 OCR 接口实现出租车发票扫描

作者: _扫地僧_ | 来源:发表于2022-01-03 10:07 被阅读0次

    百度 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的原创文章,尽在:"汪子熙":


    相关文章

      网友评论

        本文标题:用 ABAP 调用 OCR 接口实现出租车发票扫描

        本文链接:https://www.haomeiwen.com/subject/bempfrtx.html