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.