smartforms导出PDF:
常用函数有;
convert_otf
convert_otfspooljob_2_pdf
convert_abapspooljob_2_pdf
CONVERT_OTF_2_PDF;
SX_OBJECT_CONVER_OTF_PDF;
HRHAP_DOC_CONVERT_SMF_TO_PDF
实例:
FORM export_pdf. DATA:zsmart_name TYPE rs38l_fnam. CALL FUNCTION \'SSF_FUNCTION_MODULE_NAME\' EXPORTING formname = \'ZLE_SHIP_BMEPR\' IMPORTING fm_name = zsmart_name EXCEPTIONS no_form = 1 no_function_module = 2 OTHERS = 3. DATA: w_ctrlop TYPE ssfctrlop, "Smart Forms: 控制结构 "W_CONTROL w_compop TYPE ssfcompop, "SAP Smart Forms: 智能写作器 (传输) 选项"W_OUTPUT. w_return TYPE ssfcrescl. "Smart Forms: 表格打印结束时返回值 DATA: len TYPE i, w_filesize TYPE i, g_pdf_xstring TYPE xstring, l_lines TYPE TABLE OF tline WITH HEADER LINE. DATA doctab TYPE TABLE OF docs WITH HEADER LINE. DATA itab LIKE tline OCCURS 0 WITH HEADER LINE DATA: file_name TYPE string, fullpath TYPE string, path TYPE string, p_sefile LIKE rlgrap-filename VALUE \'D:\\'. "\'/usr/sap/tmp/\'. w_ctrlop-getotf = \'X\'."OTF 表的返回 w_ctrlop-no_dialog = \'X\'."关闭打印对话框 * W_CTRLOP-NO_OPEN = \'X\'."no dialog box * W_CTRLOP-NO_CLOSE = \'X\'."no *&W_COMPOP-TDNOPRINT = \'X\'. w_compop-tdnoprev = \'X\'."没有打印预览 "W_COMPOP用来设置打印参数弹出对话框中的值,下面这几个参数不必要 * W_COMPOP-TDNEWID = \'X\'. "New Spool w_compop-tdimmed = \'X\'. w_compop-tddelete = \'\'. "Delete Spool After Print w_compop-tdfinal = \'X\'. w_compop-tdiexit = \'X\'. "Exit after printing in print preview w_compop-tddest = \'LP02\'. "设备名称 w_compop-xdf2outdev = \'LP02\'. w_compop-tdarmod = \'1\'. *&smartforms打印 ,将打印的值输入到W_RETURN-OTFDATA[]中 CALL FUNCTION zsmart_name EXPORTING control_parameters = w_ctrlop output_options = w_compop * totalpages = totalpages * zbukrs = p_bukrs * zcb = cb gth_header = gth_alv_sel IMPORTING job_output_info = w_return TABLES gtd_item = gtd_item EXCEPTIONS formatting_error = 1 internal_error = 2 send_error = 3 user_canceled = 4 OTHERS = 5. *"CONVERT_OTF函数取不到lines的返回值,所以注释掉,用CONVERT_OTF_2_PDF * CALL FUNCTION \'CONVERT_OTF\' * EXPORTING * format = \'PDF\' * IMPORTING * bin_filesize = len * bin_file = g_pdf_xstring * TABLES * otf = w_return-otfdata[] * lines = itab * EXCEPTIONS * err_max_linewidth = 1 * err_format = 2 * err_conv_not_possible = 3 * err_bad_otf = 4 * OTHERS = 5. CALL FUNCTION \'CONVERT_OTF_2_PDF\' "转换otf数据为二进制PDF文件 * EXPORTING * use_otf_mc_cmd = \'X\' * archive_index = archive_index IMPORTING bin_filesize = len TABLES otf = w_return-otfdata[] doctab_archive = doctab lines = l_lines[] EXCEPTIONS err_conv_not_possible = 1 err_otf_mc_noendmarker = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. * CONCATENATE p_sefile sy-uname \'-\' sy-uzeit \'.pdf\' INTO file_name. "addrss * OPEN DATASET file_name FOR OUTPUT IN BINARY MODE." MESSAGE L_MESSAGE_DB. * IF sy-subrc EQ 0. * TRANSFER g_pdf_xstring TO file_name. * CLOSE DATASET file_name. * ELSE. * MESSAGE \'OPEN ERROR!!\' TYPE \'E\'. * STOP. * ENDIF. CONCATENATE \'D:\\' sy-uname \'-\' sy-uzeit \' FFF.pdf\' INTO file_name. "定义文件名 "这一段不屏蔽, 在打印的时候会有显示选择路径的对话框,屏蔽则直接保存在上面的文件名 "file_name 指定的路径 CALL METHOD cl_gui_frontend_services=>file_save_dialog "保存文件窗口(选择路径) EXPORTING default_extension = \'PDF\' file_filter = \'*.PDF\' default_file_name = file_name CHANGING filename = file_name path = path fullpath = fullpath * user_action = ua EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 OTHERS = 4. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. CALL FUNCTION \'GUI_DOWNLOAD\' "保存文件在本地 EXPORTING bin_filesize = len filename = file_name filetype = \'BIN\' IMPORTING filelength = w_filesize TABLES data_tab = l_lines[] EXCEPTIONS file_write_error = 1 no_batch = 2 gui_refuse_filetransfer = 3 invalid_type = 4 no_authority = 5 unknown_error = 6 header_not_allowed = 7 separator_not_allowed = 8 filesize_not_allowed = 9 header_too_long = 10 dp_error_create = 11 dp_error_send = 12 dp_error_write = 13 unknown_dp_error = 14 access_denied = 15 dp_out_of_memory = 16 disk_full = 17 dp_timeout = 18 file_not_found = 19 dataprovider_exception = 20 control_flush_error = 21 OTHERS = 22. IF sy-subrc <> 0. MESSAGE \'File not downloaded\' TYPE \'I\' . ENDIF. ENDIF. ENDFORM. "export_pdf
新浪博客兔兄博文里提到了动态的方式获取ScriptForm数据转PDF:http://blog.sina.com.cn/s/blog_55c871720102wevc.html
(转PDF应该还可以使用此函数:SX_OBJECT_CONVERT_OTF_PDF)
data: gt_otfdata like itcoo occurs 0 with header line.
以动态的方式获取ScriptForm数据(没有试过,可能获取不到):
field-symbols: type any. data: l_tab_otfdata(30) value \'(SAPLSTXC)OTF[]\'. assign (l_tab_otfdata) to . if sy-subrc = 0. gt_otfdata[] = . endif.
如果上面这种方式取不到Form表单数据,则可以在CLOSEForm时得到:
call function \'CLOSE_FORM\' importing result = result tables otfdata = gt_otfdata exceptions others = 1.
CLOSE_FORM 的otfdata 作用:当调用PRINT_TEXT 或者 OPEN_FORM时,如果参数OPTIONS(结构类型为ITCPO)中的字段TDGETOTF值为\'X\' 时,将会通过参数OTFDATA以OTF的格式输出,在这种情况下,打印输出、屏幕显示、传真将不会被执行。
itcpo-tdnoprint = \' \'.No printing from print preview itcpo-tdnoprev = \'X\'.No print preview itcpo-tdgetotf = \'X\'.Return of OTF table. No printing, display, or faxing
下面开始将ScriptForm数据转换成PDF格式的数据:
data: binfilesize type i. data: i_tline type table of tline with header line, * convert OTF to PDF call function \'CONVERT_OTF\' exporting format = \'PDF\' importing bin_filesize = binfilesize tables otf = gt_otfdata lines = i_tline exceptions err_max_linewidth = 1 err_format = 2 err_conv_not_possible = 3 err_bad_otf = 4 others = 5.
经过上面的PDF的转换,我们就可以将以上的PDF格式的数据直接存储到文本中(此时下载或写入文件时需要以二进制的方式进行传输),这个文本就是PDF。但如果还需要将这个PDF以附件的形式发送邮件,则还需要下一步转换(其实就是将两列的i_tline内表合并成一列的内表i_objbin):
data:i_objbin like solisti1 occurs 0 with header line. call function \'QCE1_CONVERT\' tables t_source_tab = i_tline t_target_tab = i_objbin exceptions convert_not_possible = 1 others = 2.
最后以附件的形式将i_objbin发送出去
1、对于scriptform或者smartform已经ABAP list都可以通过SAP标准程序RSTXPDFT4进行本地保存。
使用本方法需要获得要打印内容的假脱机请求号,可以通过事务码SP02获得。
2、通过自己书写代码实现:
①对于scriptform:首先要设置 函数 OPEN_FORM 的参数 OPTIONS ,OPTIONS中的参数 tdgetotf 设置为\'X\'.
通过函数
CALL FUNCTION \'CLOSE_FORM\' IMPORTING RESULT = RESULT tables otfdata = otfdata.
取得otfdata数据,用于下面的函数:
CALL FUNCTION \'CONVERT_OTF\' EXPORTING format = \'PDF\' IMPORTING bin_filesize = bin_size TABLES otf = otfdata lines = pdf_lines .
调用文件保存对话框:
CALL METHOD cl_gui_frontend_services=>file_save_dialog EXPORTING default_extension = \'PDF\' file_filter = \'*.PDF\' CHANGING filename = filename path = path fullpath = fullpath .
将数据保存到本地:
CALL FUNCTION \'GUI_DOWNLOAD\' EXPORTING bin_filesize = bin_size filename = fullpath filetype = \'BIN\' codepage = \'4110\' IGNORE_CERR = ABAP_TRUE TABLES data_tab = pdf_lines.
②对于smartform:调用的时候需要设置参数control_parameters,getotf 值设置为\'X\'.
在打开smartform时候,通过importing参数job_output_info获得\'CONVERT_OTF\'函数的tables参数OTF的值。job_output_info-otfdata[],,可以通过SSFCOMP_PDF_PREVIEW函数预览smartform的内容:
call function ‘SSFCOMP_PDF_PREVIEW’
exporting
i_otf = t_otf[].
或者通过下面代码下载PDF文件到本地:
CALL FUNCTION \'CONVERT_OTF\' EXPORTING format = \'PDF\' IMPORTING bin_filesize = bin_size TABLES otf = otfdata lines = pdf_lines .
调用文件保存对话框:
CALL METHOD cl_gui_frontend_services=>file_save_dialog EXPORTING default_extension = \'PDF\' file_filter = \'*.PDF\' CHANGING filename = filename path = path fullpath = fullpath .
将数据保存到本地:
CALL FUNCTION \'GUI_DOWNLOAD\' EXPORTING bin_filesize = bin_size filename = fullpath filetype = \'BIN\' codepage = \'4110\' IGNORE_CERR = ABAP_TRUE TABLES data_tab = pdf_lines.