前言:有同事在项目上遇到一个需求,需要将打印的SmartForms保存为PDF。在标准的事务码PDF!里面有实现相应的功能,但是文件名和路径不能自定义,不能满足客户的要求,我听了,觉得有趣,于是决定研究下,通过debug发现,标准事务码PDF!是调用了几个函数将表单数据进行了转换,然后输出为PDF的,只是几个函数之间的调用,实现起来相对来说比较简单,于是写了个Demo作为研究记录,在这里展示下。

实现步骤演示:

1.创建SmartForms Demo结构

1.将SmartForms保存为PDF - 图1

2.绘制SmartForms表单对象

1.将SmartForms保存为PDF - 图2

这里为了节省时间,就没有对表单做样式调整。

3.代码实现

  1. *&---------------------------------------------------------------------*
  2. *& Report ZDEMO_SF2PDF
  3. *&---------------------------------------------------------------------*
  4. *&
  5. *&---------------------------------------------------------------------*
  6. REPORT zdemo_sf2pdf.
  7. **********************************************************************
  8. * PROGRAM DETAIL *
  9. **********************************************************************
  10. * --T-CODE:ZDEMO_SF2PDF
  11. * --AUTHOR:秋の夕
  12. * --CREATE DATE:18.12.2021 13:33:46
  13. * --DESCRIBLE: SmartFormPDF案例
  14. **********************************************************************
  15. * EDIT LOG *
  16. **********************************************************************
  17. * VERSION DATE AUTHOR REMARK
  18. * <DEVK90XXX> <YYYY/MM/DD> <...> <REASON>
  19. **********************************************************************
  20. * DECLARATIONS *
  21. **********************************************************************
  22. *TABLES: .
  23. *
  24. *CONSTANTS: .
  25. *
  26. *TYPES: .
  27. DATA:gt_data TYPE TABLE OF zstest01.
  28. DATA:l_fm_name TYPE rs38l_fnam,
  29. ssf_name TYPE tdsfname.
  30. **********************************************************************
  31. * SELECTION SCREEN *
  32. **********************************************************************
  33. * SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  34. * PARAMETERS: .
  35. *
  36. * SELECT-OPTIONS: .
  37. *
  38. * SELECTION-SCREEN: END OF BLOCK b1.
  39. **********************************************************************
  40. * INITIALIZATION *
  41. **********************************************************************
  42. INITIALIZATION.
  43. ssf_name = 'ZSFTEST01'. "SmartForms对象名"
  44. gt_data = VALUE #( "测试数据"
  45. ( zid = 1 zname = '测试1')
  46. ( zid = 2 zname = '测试2')
  47. ( zid = 3 zname = '测试3')
  48. ( zid = 4 zname = '测试4')
  49. ( zid = 5 zname = '测试5')
  50. ).
  51. **********************************************************************
  52. * AT SELECTION SCREEN *
  53. **********************************************************************
  54. AT SELECTION-SCREEN.
  55. **********************************************************************
  56. * TOP OF PAGE *
  57. **********************************************************************
  58. TOP-OF-PAGE.
  59. **********************************************************************
  60. * END OF PAGE *
  61. **********************************************************************
  62. END-OF-PAGE.
  63. **********************************************************************
  64. * AT USER COMMAND *
  65. **********************************************************************
  66. AT USER-COMMAND.
  67. **********************************************************************
  68. * START OF SELECTION *
  69. **********************************************************************
  70. START-OF-SELECTION.
  71. PERFORM frm_sf_to_pdf USING ssf_name. "转PDF"
  72. **********************************************************************
  73. * END OF SELECTION *
  74. **********************************************************************
  75. END-OF-SELECTION.
  76. **********************************************************************
  77. * FORMS DECLARATIONS *
  78. **********************************************************************
  79. *&---------------------------------------------------------------------*
  80. *& Form frm_sf_to_pdf
  81. *&---------------------------------------------------------------------*
  82. *& text
  83. *&---------------------------------------------------------------------*
  84. *& --> P_FNAME
  85. *&---------------------------------------------------------------------*
  86. FORM frm_sf_to_pdf USING uv_fname TYPE tdsfname.
  87. DATA:
  88. ls_output_opt TYPE ssfcompop,
  89. ls_ctrl_form TYPE ssfctrlop,
  90. lv_user_settings TYPE c,
  91. ls_job_output_info TYPE ssfcrescl,
  92. lv_pdf_len TYPE i,
  93. lt_pdf_lines TYPE TABLE OF tline.
  94. DATA:lv_path TYPE string,
  95. lv_full_path TYPE string,
  96. lv_filename TYPE string.
  97. ls_output_opt-tdnewid = 'X'. "设置属性参数"
  98. ls_output_opt-tdimmed = 'X'.
  99. ls_output_opt-tddelete = 'X'.
  100. ls_output_opt-tdlifetime = 'X'.
  101. ls_output_opt-tddest = 'LP01'.
  102. ls_output_opt-tdprinter = 'CNSAPWIN'.
  103. ls_output_opt-xsfformat = 'X'.
  104. ls_ctrl_form-no_dialog = 'X'. "必要"
  105. ls_ctrl_form-preview = 'X'.
  106. ls_ctrl_form-getotf = 'X'. "必要"
  107. ls_ctrl_form-device = 'PRINTER'.
  108. lv_user_settings = 'X'.
  109. CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
  110. EXPORTING
  111. formname = uv_fname
  112. * VARIANT = ' '
  113. direct_call = 'X'
  114. IMPORTING
  115. fm_name = l_fm_name
  116. EXCEPTIONS
  117. no_form = 1
  118. no_function_module = 2
  119. OTHERS = 3.
  120. * 获取OTF数据
  121. IF sy-subrc = 0.
  122. CALL FUNCTION l_fm_name
  123. EXPORTING
  124. control_parameters = ls_ctrl_form
  125. output_options = ls_output_opt
  126. user_settings = lv_user_settings
  127. IMPORTING
  128. job_output_info = ls_job_output_info
  129. TABLES
  130. i_tab = gt_data
  131. EXCEPTIONS
  132. formatting_error = 1
  133. internal_error = 2
  134. send_error = 3
  135. user_canceled = 4.
  136. IF sy-subrc <> 0.
  137. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  138. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  139. ENDIF.
  140. * 转为二进制
  141. CALL FUNCTION 'CONVERT_OTF'
  142. EXPORTING
  143. format = 'PDF'
  144. * max_linewidth = 132
  145. IMPORTING
  146. bin_filesize = lv_pdf_len
  147. TABLES
  148. otf = ls_job_output_info-otfdata[]
  149. lines = lt_pdf_lines
  150. EXCEPTIONS
  151. err_max_linewidth = 1
  152. err_format = 2
  153. err_conv_not_possible = 3
  154. err_bad_otf = 4
  155. OTHERS = 5.
  156. IF sy-subrc <> 0.
  157. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  158. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  159. ENDIF.
  160. "初始化文件名"
  161. lv_filename = 'ZDEMO_SF2PDF_' && sy-datum && sy-uzeit && '.PDF'.
  162. CALL METHOD cl_gui_frontend_services=>get_desktop_directory
  163. CHANGING
  164. desktop_directory = lv_path
  165. EXCEPTIONS
  166. cntl_error = 1
  167. error_no_gui = 2
  168. not_supported_by_gui = 3
  169. OTHERS = 4.
  170. IF sy-subrc = 0.
  171. CALL METHOD cl_gui_cfw=>flush .
  172. " 用户选择名称、路径
  173. CALL METHOD cl_gui_frontend_services=>file_save_dialog
  174. EXPORTING
  175. * window_title = '指定保存文件名'
  176. * default_extension = 'XLSX'
  177. default_file_name = lv_filename
  178. * file_filter = filetype
  179. initial_directory = lv_path
  180. prompt_on_overwrite = 'X'
  181. CHANGING
  182. filename = lv_filename
  183. path = lv_path
  184. fullpath = lv_full_path
  185. * USER_ACTION =
  186. * FILE_ENCODING =
  187. EXCEPTIONS
  188. cntl_error = 1
  189. error_no_gui = 2
  190. not_supported_by_gui = 3
  191. OTHERS = 4.
  192. IF sy-subrc <> 0.
  193. MESSAGE | 获取文件路径失败!| TYPE 'S' DISPLAY LIKE 'E'.
  194. ENDIF.
  195. ELSE.
  196. MESSAGE | 用户取消操作!| TYPE 'S' DISPLAY LIKE 'E'.
  197. ENDIF.
  198. * CONCATENATE lv_full_path '.PDF' INTO lv_full_path.
  199. * DOWNLOAD PDF
  200. CALL FUNCTION 'GUI_DOWNLOAD'
  201. EXPORTING
  202. bin_filesize = lv_pdf_len
  203. filename = lv_full_path
  204. filetype = 'BIN'
  205. TABLES
  206. data_tab = lt_pdf_lines
  207. EXCEPTIONS
  208. file_write_error = 1
  209. no_batch = 2
  210. gui_refuse_filetransfer = 3
  211. invalid_type = 4
  212. no_authority = 5
  213. unknown_error = 6
  214. header_not_allowed = 7
  215. separator_not_allowed = 8
  216. filesize_not_allowed = 9
  217. header_too_long = 10
  218. dp_error_create = 11
  219. dp_error_send = 12
  220. dp_error_write = 13
  221. unknown_dp_error = 14
  222. access_denied = 15
  223. dp_out_of_memory = 16
  224. disk_full = 17
  225. dp_timeout = 18
  226. file_not_found = 19
  227. dataprovider_exception = 20
  228. control_flush_error = 21
  229. OTHERS = 22.
  230. ENDIF.
  231. ENDFORM.

4.实现效果

1.将SmartForms保存为PDF - 图3
1.将SmartForms保存为PDF - 图4

以上就是SmartForms转PDF的简单实现了,感兴趣的小伙伴可以自己去尝试下。