记录ABAP开发的日常——将SmartForms保存为PDF
前言:有同事在项目上遇到一个需求,需要将打印的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'
EXPORTING
formname = uv_fname
* VARIANT = ' '
direct_call = 'X'
IMPORTING
fm_name = l_fm_name
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
* 获取OTF数据
IF sy-subrc = 0.
CALL FUNCTION l_fm_name
EXPORTING
control_parameters = ls_ctrl_form
output_options = ls_output_opt
user_settings = lv_user_settings
IMPORTING
job_output_info = ls_job_output_info
TABLES
i_tab = gt_data
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* 转为二进制
CALL FUNCTION 'CONVERT_OTF'
EXPORTING
format = 'PDF'
* max_linewidth = 132
IMPORTING
bin_filesize = lv_pdf_len
TABLES
otf = ls_job_output_info-otfdata[]
lines = lt_pdf_lines
EXCEPTIONS
err_max_linewidth = 1
err_format = 2
err_conv_not_possible = 3
err_bad_otf = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH 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_directory
CHANGING
desktop_directory = lv_path
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc = 0.
CALL METHOD cl_gui_cfw=>flush .
" 用户选择名称、路径
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
* window_title = '指定保存文件名'
* default_extension = 'XLSX'
default_file_name = lv_filename
* file_filter = filetype
initial_directory = lv_path
prompt_on_overwrite = 'X'
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_full_path
* USER_ACTION =
* FILE_ENCODING =
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 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 PDF
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = lv_pdf_len
filename = lv_full_path
filetype = 'BIN'
TABLES
data_tab = lt_pdf_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.
ENDIF.
ENDFORM.
4.实现效果#
以上就是SmartForms转PDF的简单实现了,感兴趣的小伙伴可以自己去尝试下。
作者:ITiger
出处:https://www.cnblogs.com/zyhcs/p/15704983.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
转载请注明出处!
分类:
ABAP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步