前言:有同事在项目上遇到一个需求,需要将打印的SmartForms保存为PDF。在标准的事务码PDF!里面有实现相应的功能,但是文件名和路径不能自定义,不能满足客户的要求,我听了,觉得有趣,于是决定研究下,通过debug发现,标准事务码PDF!是调用了几个函数将表单数据进行了转换,然后输出为PDF的,只是几个函数之间的调用,实现起来相对来说比较简单,于是写了个Demo作为研究记录,在这里展示下。
实现步骤演示:
1.创建SmartForms Demo结构
2.绘制SmartForms表单对象
这里为了节省时间,就没有对表单做样式调整。
3.代码实现
*&---------------------------------------------------------------------**& Report ZDEMO_SF2PDF*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT zdemo_sf2pdf.*********************************************************************** PROGRAM DETAIL ************************************************************************ --T-CODE:ZDEMO_SF2PDF* --AUTHOR:秋の夕* --CREATE DATE:18.12.2021 13:33:46* --DESCRIBLE: SmartForm转PDF案例*********************************************************************** EDIT LOG ************************************************************************ VERSION DATE AUTHOR REMARK* <DEVK90XXX> <YYYY/MM/DD> <...> <REASON>*********************************************************************** DECLARATIONS ************************************************************************TABLES: .**CONSTANTS: .**TYPES: .DATA:gt_data TYPE TABLE OF zstest01.DATA:l_fm_name TYPE rs38l_fnam,ssf_name TYPE tdsfname.*********************************************************************** SELECTION SCREEN ************************************************************************ SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.* PARAMETERS: .** SELECT-OPTIONS: .** SELECTION-SCREEN: END OF BLOCK b1.*********************************************************************** INITIALIZATION ***********************************************************************INITIALIZATION.ssf_name = 'ZSFTEST01'. "SmartForms对象名"gt_data = VALUE #( "测试数据"( zid = 1 zname = '测试1')( zid = 2 zname = '测试2')( zid = 3 zname = '测试3')( zid = 4 zname = '测试4')( zid = 5 zname = '测试5')).*********************************************************************** AT SELECTION SCREEN ***********************************************************************AT SELECTION-SCREEN.*********************************************************************** TOP OF PAGE ***********************************************************************TOP-OF-PAGE.*********************************************************************** END OF PAGE ***********************************************************************END-OF-PAGE.*********************************************************************** AT USER COMMAND ***********************************************************************AT USER-COMMAND.*********************************************************************** START OF SELECTION ***********************************************************************START-OF-SELECTION.PERFORM frm_sf_to_pdf USING ssf_name. "转PDF"*********************************************************************** END OF SELECTION ***********************************************************************END-OF-SELECTION.*********************************************************************** FORMS DECLARATIONS ************************************************************************&---------------------------------------------------------------------**& Form frm_sf_to_pdf*&---------------------------------------------------------------------**& text*&---------------------------------------------------------------------**& --> P_FNAME*&---------------------------------------------------------------------*FORM frm_sf_to_pdf USING uv_fname TYPE tdsfname.DATA:ls_output_opt TYPE ssfcompop,ls_ctrl_form TYPE ssfctrlop,lv_user_settings TYPE c,ls_job_output_info TYPE ssfcrescl,lv_pdf_len TYPE i,lt_pdf_lines TYPE TABLE OF tline.DATA:lv_path TYPE string,lv_full_path TYPE string,lv_filename TYPE string.ls_output_opt-tdnewid = 'X'. "设置属性参数"ls_output_opt-tdimmed = 'X'.ls_output_opt-tddelete = 'X'.ls_output_opt-tdlifetime = 'X'.ls_output_opt-tddest = 'LP01'.ls_output_opt-tdprinter = 'CNSAPWIN'.ls_output_opt-xsfformat = 'X'.ls_ctrl_form-no_dialog = 'X'. "必要"ls_ctrl_form-preview = 'X'.ls_ctrl_form-getotf = 'X'. "必要"ls_ctrl_form-device = 'PRINTER'.lv_user_settings = 'X'.CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'EXPORTINGformname = uv_fname* VARIANT = ' 'direct_call = 'X'IMPORTINGfm_name = l_fm_nameEXCEPTIONSno_form = 1no_function_module = 2OTHERS = 3.* 获取OTF数据IF sy-subrc = 0.CALL FUNCTION l_fm_nameEXPORTINGcontrol_parameters = ls_ctrl_formoutput_options = ls_output_optuser_settings = lv_user_settingsIMPORTINGjob_output_info = ls_job_output_infoTABLESi_tab = gt_dataEXCEPTIONSformatting_error = 1internal_error = 2send_error = 3user_canceled = 4.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.* 转为二进制CALL FUNCTION 'CONVERT_OTF'EXPORTINGformat = 'PDF'* max_linewidth = 132IMPORTINGbin_filesize = lv_pdf_lenTABLESotf = ls_job_output_info-otfdata[]lines = lt_pdf_linesEXCEPTIONSerr_max_linewidth = 1err_format = 2err_conv_not_possible = 3err_bad_otf = 4OTHERS = 5.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF."初始化文件名"lv_filename = 'ZDEMO_SF2PDF_' && sy-datum && sy-uzeit && '.PDF'.CALL METHOD cl_gui_frontend_services=>get_desktop_directoryCHANGINGdesktop_directory = lv_pathEXCEPTIONScntl_error = 1error_no_gui = 2not_supported_by_gui = 3OTHERS = 4.IF sy-subrc = 0.CALL METHOD cl_gui_cfw=>flush ." 用户选择名称、路径CALL METHOD cl_gui_frontend_services=>file_save_dialogEXPORTING* window_title = '指定保存文件名'* default_extension = 'XLSX'default_file_name = lv_filename* file_filter = filetypeinitial_directory = lv_pathprompt_on_overwrite = 'X'CHANGINGfilename = lv_filenamepath = lv_pathfullpath = lv_full_path* USER_ACTION =* FILE_ENCODING =EXCEPTIONScntl_error = 1error_no_gui = 2not_supported_by_gui = 3OTHERS = 4.IF sy-subrc <> 0.MESSAGE | 获取文件路径失败!| TYPE 'S' DISPLAY LIKE 'E'.ENDIF.ELSE.MESSAGE | 用户取消操作!| TYPE 'S' DISPLAY LIKE 'E'.ENDIF.* CONCATENATE lv_full_path '.PDF' INTO lv_full_path.* DOWNLOAD PDFCALL FUNCTION 'GUI_DOWNLOAD'EXPORTINGbin_filesize = lv_pdf_lenfilename = lv_full_pathfiletype = 'BIN'TABLESdata_tab = lt_pdf_linesEXCEPTIONSfile_write_error = 1no_batch = 2gui_refuse_filetransfer = 3invalid_type = 4no_authority = 5unknown_error = 6header_not_allowed = 7separator_not_allowed = 8filesize_not_allowed = 9header_too_long = 10dp_error_create = 11dp_error_send = 12dp_error_write = 13unknown_dp_error = 14access_denied = 15dp_out_of_memory = 16disk_full = 17dp_timeout = 18file_not_found = 19dataprovider_exception = 20control_flush_error = 21OTHERS = 22.ENDIF.ENDFORM.
4.实现效果
以上就是SmartForms转PDF的简单实现了,感兴趣的小伙伴可以自己去尝试下。




