SAP ABAP 解析XML,PDF二进制BIN文件流

SAP ABAP 解析PDF二进制BIN文件流

1.解析XML CALL FUNCTION ‘SMUM_XML_PARSE’
2.BASE64解码 CALL FUNCTION ‘SCMS_BASE64_DECODE_STR’
3.将xstring转换为SAP内表 CALL FUNCTION ‘SCMS_XSTRING_TO_BINARY’

*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_download USING ls_alv TYPE ty_alv11.

 
  CLEAR xml_str.
  CONCATENATE
      c_head
      c_head_b2e
      '<requestHeader>'
        '<dtClient>' sy-datum sy-uzeit '</dtClient>'      "客户端时间"
      '</requestHeader>'
      '<xDataBody>'
           '<insId>'  gv_trnid '</insId>'
      '</xDataBody>'
      '</CMBC>'
      INTO xml_str.

  CLEAR return_xstr.
  "---获取XML数据"
  CALL FUNCTION 'Z_HTTP_BANK_GETXML'
    EXPORTING
      input    = xml_str
      urlname  = 'B2E'
    IMPORTING
      output   = return_xstr
      lv_msgtx = msgtx
      lv_msgty = msgty.

  IF msgty = 'S'.
  "---解析XML"
    CLEAR: result_xml.
    CALL FUNCTION 'SMUM_XML_PARSE'
      EXPORTING
        xml_input = return_xstr
      TABLES
        xml_table = result_xml
        return    = return.

    DATA: l_str  TYPE string,
          l_name TYPE string.

 
    READ TABLE result_xml INTO wa_xml WITH KEY cname = 'code' .
    IF sy-subrc = 0 AND wa_xml-cvalue = '0'.
      LOOP AT result_xml INTO wa_xml .

        l_char = wa_xml-cname.
        CONDENSE l_char NO-GAPS .
        TRANSLATE l_char TO UPPER CASE.
        IF l_char = 'FILENAME'."pdf名称
          l_name = wa_xml-cvalue.
        ELSEIF l_char = 'FILECONTENT'."文件  base64 "
          CONCATENATE l_str wa_xml-cvalue INTO l_str."获得PDF二进制流数据"
        ENDIF.

      ENDLOOP.

		"---解析XML并下载"
      PERFORM frm_decode_pdf USING l_str l_name.

    ELSE.
 
    ENDIF.

  ELSE.
 
    MESSAGE message TYPE 'E'.
 
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DECODE_PDF
*&---------------------------------------------------------------------*
*& text   解密pdf,并下载本地
*&---------------------------------------------------------------------*
*&      --> L_STR
*&      --> L_NAME
*&---------------------------------------------------------------------*
FORM frm_decode_pdf  USING  p_str p_name.

  DATA : b_xstr   TYPE xstring,"二进制文件解码后数据"
         bin_size TYPE i.
  DATA : path     TYPE string,
         fullpath TYPE string.
"BASE64解码"
  CALL FUNCTION 'SCMS_BASE64_DECODE_STR'
    EXPORTING
      input    = p_str  "pdf字符串
      unescape = 'X'
    IMPORTING
      output   = b_xstr "xstring
    EXCEPTIONS
      failed   = 1
      OTHERS   = 2.
  IF sy-subrc <> 0.
* implement suitable error handling here
  ENDIF.
 

  DATA:pdf_tab TYPE STANDARD TABLE OF tabl1024.
  DATA:length TYPE i.
*--&--*	"将xstring转换为SAP内表"
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer        = b_xstr
    IMPORTING
      output_length = length
    TABLES
      binary_tab    = pdf_tab.


*--&--*   调用文件保存对话框:
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title      = '导出pdf'
      default_file_name = p_name
      default_extension = 'PDF'
      file_filter       = '*.PDF'
    CHANGING
      filename          = p_name  "在对话框输入
      path              = path
      fullpath          = fullpath.

  CHECK fullpath IS NOT INITIAL.
*--&--*   将数据保存到本地:
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      bin_filesize = bin_size
      filename     = fullpath
      filetype     = 'BIN'
      codepage     = '8450' "gb2312"
      ignore_cerr  = abap_true
    TABLES
      data_tab     = pdf_tab. "type x

ENDFORM.
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将XML文件解析为内表,并在ALV中显示输出,你可以使用以下步骤: 1. 创建ABAP结构:首先,你需要创建一个与XML文件中的数据结构相对应的ABAP结构。确保结构字段与XML元素或属性名称匹配。 2. 定义内表:创建一个内表,使用上一步创建的ABAP结构作为表行类型。 3. 使用XML解析解析XML文件:使用`cl_xml_document`类创建一个XML文档对象,并使用`load`方法加载XML文件。 ```abap DATA: lo_xml_document TYPE REF TO if_ixml_document, lv_file_path TYPE string. lv_file_path = '<XML_FILE_PATH>'. "替换为你的XML文件路径 CREATE OBJECT lo_xml_document. lo_xml_document->load( lv_file_path ). ``` 4. 获取根节点:通过调用`get_root_node`方法获取XML文档的根节点。 ```abap DATA: lo_root_node TYPE REF TO if_ixml_node. lo_root_node = lo_xml_document->get_root_node( ). ``` 5. 遍历XML节点并解析数据:使用循环遍历子节点,并使用`get_attribute_value`方法获取节点属性值,使用`get_text`方法获取节点文本内容。将解析后的数据填充到内表中。 ```abap DATA: lt_data TYPE TABLE OF your_structure, ls_data TYPE your_structure, lo_child_node TYPE REF TO if_ixml_node. lo_child_node = lo_root_node->get_child_nodes( 'NodeName' ). "替换为你的节点名称 WHILE lo_child_node IS BOUND. ls_data-field1 = lo_child_node->get_attribute_value( 'AttributeName' ). "替换为你的属性名称 ls_data-field2 = lo_child_node->get_text( ). APPEND ls_data TO lt_data. lo_child_node = lo_child_node->get_next_sibling( ). ENDWHILE. ``` 6. 显示数据在ALV中:使用ALV控制台类(`cl_salv_table`)创建一个ALV对象,并使用`set_table`方法将内表数据传递给ALV对象。 ```abap DATA: lo_alv_table TYPE REF TO cl_salv_table. CREATE OBJECT lo_alv_table. lo_alv_table->set_table( lt_data ). ``` 7. 显示ALV表格:使用`display`方法显示ALV表格。 ```abap lo_alv_table->display( ). ``` 这样,你就可以将XML文件解析为内表,并在ALV中显示输出。请根据实际情况修改上述代码,并确保ABAP结构与XML文件的结构匹配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值