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.