一、SMARTFORMT 转 PDF 的方法概述
SMARTFORMT 转 PDF 有多种实用方法,为用户在不同场景下的需求提供了丰富的选择。
首先是代码开发的方式。通过先调用 smartform 函数获取 OTF 格式数据,接着调用函数 CONVERT_OTF 转换成 PDF 格式数据,最后再调用 GUI_DOWNLOAD 函数进行下载。这种方式需要一定的编程基础,但可以实现较为精细的控制。例如在示例代码中,需要设置各种参数如 LS_CONTROL_PARAMETERS、LS_OUTPUT_OPTIONS 等,还需要处理可能出现的各种错误情况,如 FORMATTING_ERROR、SEND_ERROR 等。
通过打印池假脱机请求转成 PDF 文件也是一种可行的方法。先打印 smartform 输出假脱机请求,然后可以使用 SP01 查看假脱机请求,选择菜单中的 “假脱机请求 -> 转发 -> 导出为 PDF” 进行下载,或者执行 SAP 标准程序 RSTXPDFT4,输入假脱机请求号进行下载。
在打印预览界面输入 Tcode PDF! 也是一种便捷的方式。在事务栏输入 “PDF!” 后,注意感叹号为半角英文状态下的符号,回车后会弹出独立窗口生成 PDF 文件并打开,用户可以直接点击保存按钮进行下载。
此外,使用 PDF 虚拟打印机也是一种选择。如果主机假脱机访问方法选择了 “G:使用控制技术的前台打印”,则先设置 smartform 打印选项后选择打印机打印 smartform;如果选择了 “F:计算机前台打印”,则设置 smartform 打印选项时可同时选择打印机。同时,还可以使用微软自带的 Microsoft Print to PDF 虚拟打印机,通过 SPAD 配置输出设备来实现转换。
总之,这些方法各有优缺点,用户可以根据自己的实际需求和技术水平选择适合自己的 SMARTFORMT 转 PDF 的方法。
二、具体转换方法详解
(一)代码开发转换
在代码开发转换方法中,首先调用 smartform 函数获取 OTF 格式数据是关键的第一步。这一步骤通常涉及到一系列的参数设置和函数调用。例如,需要指定 smartform 的名称,通过CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'函数获取对应的函数名。如果出现错误,如NO_FORM(没有找到指定的表单)、NO_FUNCTION_MODULE(没有找到对应的函数模块)等情况,需要进行适当的错误处理。
接着,调用函数CONVERT_OTF转换成 PDF 格式数据。这个函数会将获取到的 OTF 数据转换为 PDF 格式,同时可以通过设置参数FORMAT = 'PDF'来明确输出格式。在转换过程中,可能会遇到一些错误情况,如ERR_MAX_LINEWIDTH(最大行宽错误)、ERR_CONV_NOT_POSSIBLE(转换不可能错误)等,需要进行错误处理以确保转换的顺利进行。
最后,调用GUI_DOWNLOAD函数下载转换后的 PDF 文件。这个函数需要设置文件名、文件类型等参数,同时需要处理可能出现的各种错误情况,如FILE_WRITE_ERROR(文件写入错误)、NO_BATCH(没有批处理)等。通过这三个步骤的代码开发,可以实现较为精细的 SMARTFORMT 转 PDF 的功能。
普通SMARTFORMS打印,无法实现转PDF后进行一系列其他操作。
解决办法:使用函数将OTF类型数据转换为PDF。
代码如下:
打印无弹窗,直接转PDF后并保存文件到本地。
"定义打印变量
DATA:fm_name TYPE rs38l_fnam, ""打印程序函数名
lv_formname TYPE tdsfname VALUE 'ZTEST_01'. "SMARTFORMS名字
"打印参数
DATA:control TYPE ssfctrlop,
output_options TYPE ssfcompop,
l_job_output_info TYPE ssfcrescl.
PDF变量
DATA:lv_file_size TYPE i, "PDF文件大小
lv_bin_fiel TYPE xstring, "二进制文件流
lt_lines TYPE STANDARD TABLE OF tline,
lt_otfdata TYPE tsfotf. "OTF数据
"打印参数赋值
= 'X'."打印不显示
= 'X'."返回OTF表
= sy-langu.
= 'LP01'."假脱机:设备名
= 'X'."立即假脱机打印
= 'X'."立即假脱机删除
"获取打印程序函数名
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = lv_formname "创建的FORM名称
IMPORTING
fm_name = fm_name "获取打印程序函数名
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
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 fm_name
EXPORTING
output_options = output_options
control_parameters = control
user_settings = ''
IMPORTING
job_output_info = l_job_output_info "获取返回的打印数据
TABLES
gt_item = lt_item2 "导入的行项目内表
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 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.
"OTF数据赋值
APPEND LINES OF l_job_output_info-otfdata TO lt_otfdata.
"SMARTFORMS转PDF
CALL FUNCTION 'CONVERT_OTF'
EXPORTING
format = 'PDF'
MAX_LINEWIDTH = 132
ARCHIVE_INDEX = ' '
COPYNUMBER = 0
ASCII_BIDI_VIS2LOG = ' '
PDF_DELETE_OTFTAB = ' '
pdf_username = sy-uname
PDF_PREVIEW = ' '
USE_CASCADING = ' '
MODIFIED_PARAM_TABLE =
IMPORTING
bin_filesize = lv_file_size
bin_file = lv_bin_fiel
TABLES
otf = lt_otfdata
lines = lt_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.
***BEGIN&-------------------保存PDF文件到本地----------------******************************
DATA: lv_filename TYPE string, "保存pdf文件名
lv_path TYPE string,
lv_fullpath TYPE string, "文件全路径
lv_user_act TYPE i. "用户操作类型
lv_filename = 'mmmmmmm.pdf'.
CALL METHOD cl_gui_frontend_services=>file_save_dialog "保存文件 窗口
EXPORTING
window_title = '保存文件'
default_extension = 'PDF' "文件后缀
default_file_name = lv_filename "文件名
with_encoding =
file_filter = '*.PDF'
initial_directory =
prompt_on_overwrite = 'X'
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
user_action = lv_user_act "用户操作类型
file_encoding =
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
invalid_default_file_name = 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.
ELSE.
IF lv_user_act = cl_gui_frontend_services=>action_cancel.
MESSAGE '取消存取' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDIF.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = lv_file_size
filename = lv_fullpath
filetype = 'BIN'
APPEND = ' '
IMPORTING
FILELENGTH =
TABLES
data_tab = lt_lines
FIELDNAMES =
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 ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
***EDN&-------------------保存PDF文件到本地----------------******************************
(二)打印池假脱机请求转换
打印 smartform 输出假脱机请求是这个转换方法的第一步。这一步骤通常在 SAP 系统中进行操作,通过打印 smartform 生成假脱机请求。
然后,通过 SP01 查看假脱机请求并导出为 PDF 或执行标准程序下载。如果选择使用 SP01,在查看假脱机请求后,可以选择菜单中的 “假脱机请求 -> 转发 -> 导出为 PDF” 进行下载。另外,也可以执行 SAP 标准程序RSTXPDFT4,输入假脱机请求号进行下载。这种方法相对较为便捷,但需要熟悉 SAP 系统的操作流程。
(三)输入 Tcode PDF! 转换
在打印预览界面输入 Tcode PDF!,可预览 PDF 并点击保存按钮下载。这种方法非常简单快捷,用户只需要在事务栏输入 “PDF!”,注意感叹号为半角英文状态下的符号,回车后会弹出独立窗口生成 PDF 文件。用户可以在这个窗口中预览 PDF 文件,如果满意,可以直接点击保存按钮进行下载。这种方法适用于对操作便捷性要求较高的用户。
(四)使用 PDF 虚拟打印机转换
根据主机假脱机访问方法不同,设置 smartform 打印选项并选择打印机,使用微软自带的虚拟打印机进行转换。如果主机假脱机访问方法选择了 “G:使用控制技术的前台打印”,则先设置 smartform 打印选项后选择打印机打印 smartform;如果选择了 “F:计算机前台打印”,则设置 smartform 打印选项时可同时选择打印机。同时,还可以使用微软自带的 Microsoft Print to PDF 虚拟打印机,通过 SPAD 配置输出设备来实现转换。这种方法具有较高的灵活性,可以根据不同的需求进行设置。
三、第三方调用方法探讨
(一)通过外部 http 调用
调用 sap cl_http_client post 数据流到外部 web 接口,实现 smartform 转为 pdf 发送给第三方系统。
这种方法的思路主要分为两步。第一步是调用 smartform 程序,生成 pdf 数据流。具体来说,首先通过一系列的代码设置,如设置函数名、控制参数、输出选项等。例如,通过CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'导出表单对应的函数名,设置控制参数ls_control_param-getotf = 'X'和ls_control_param-no_dialog = 'X'等。然后调用表单函数,将输出信息导入变量gwa_result中,再通过CALL FUNCTION 'CONVERT_OTF'将 OTF 格式数据转换为 PDF 格式,最终得到 PDF 内容的字符串变量lv_content。
第二步是调用cl_http_client类的post方法发送multipart类型的文件。首先设置目标 URL,如host = 'http://ip:8080/api/img/uploads',然后创建http_client对象,设置请求方法、版本、内容类型等头部信息。接着通过循环添加多个formfield,包括event、secret和file等,其中file的内容就是生成的 PDF 数据lv_content。最后调用send和receive方法发送请求并接收响应。如果一切顺利,就可以将 smartform 生成的 PDF 成功发送给第三方系统。
这种方法需要注意处理可能出现的各种错误情况,如http_communication_failure(HTTP 通信失败)、http_invalid_state(HTTP 无效状态)、http_processing_failed(HTTP 处理失败)等。同时,要确保目标 URL 的正确性和第三方系统的可用性,以保证数据能够成功传输。
SAP 的smartforms 打印出来的pdf,需要直接发送给第三方系统。调用 sap cl_http_client post 数据流到外面web接口。
思路:
1.调用smartform程序,生成pdf数据流
2.调用cl_http_client 类post发送multipart 类型file
下面是abap代码:
REPORT ZSMARTFORMTOHTTP.
DATA: G_FM_NAME TYPE RS38L_FNAM.
DATA: GIT_SPOOLIDS TYPE TSFSPOOLID,
GWA_SPOOL TYPE RSPOID.
DATA: GWA_RESULT TYPE SSFCRESCL,
GWA_OUTPUT TYPE SSFCOMPOP,
G_FILENAME TYPE STRING,
G_BIN_FILESIZE TYPE I,
GIT_LINES TYPE STANDARD TABLE OF TLINE,
GWA_CONTROL TYPE SSFCTRLOP.
DATA SEND_REQUEST TYPE REF TO CL_BCS.
DATA DOCUMENT TYPE REF TO CL_DOCUMENT_BCS.
DATA RECIPIENT TYPE REF TO IF_RECIPIENT_BCS.
DATA BCS_EXCEPTION TYPE REF TO CX_BCS.
DATA SENT_TO_ALL TYPE OS_BOOLEAN.
DATA PDF_SIZE TYPE SO_OBJ_LEN.
DATA PDF_CONTENT TYPE SOLIX_TAB.
DATA PDF_XSTRING TYPE XSTRING.
DATA:G_MAILTO TYPE AD_SMTPADR.
DATA RQ TYPE TSP01.
DATA BIN_SIZE TYPE I.
DATA DUMMY TYPE TABLE OF RSPOATTR.
DATA:LT_SAPFTP_SERVERS TYPE TABLE OF SAPFTP_SERVERS WITH HEADER LINE.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
FORMNAME = 'ZLUO02'
IMPORTING
FM_NAME = G_FM_NAME
EXCEPTIONS
NO_FORM = 1
NO_FUNCTION_MODULE = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
ENDIF.
GWA_CONTROL-NO_DIALOG = 'X'.
GWA_CONTROL-LANGU = SY-LANGU.
GWA_OUTPUT-TDNEWID = 'X'.
GWA_OUTPUT-TDIMMED = ' '.
GWA_OUTPUT-TDDELETE = ' '.
DATA : I_MARA LIKE MARA OCCURS 0 .
DATA : LS_CONTROL_PARAM TYPE SSFCTRLOP,
LT_PDF TYPE TABLE OF TLINE,
LS_PDF LIKE LINE OF LT_PDF,
PDF_FSIZE TYPE I.
LS_CONTROL_PARAM-GETOTF = 'X'.
LS_CONTROL_PARAM-NO_DIALOG = 'X'.
CALL FUNCTION G_FM_NAME
EXPORTING
CONTROL_PARAMETERS = LS_CONTROL_PARAM
IMPORTING
JOB_OUTPUT_INFO = GWA_RESULT
TABLES
I_MARA = I_MARA
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR = 2
SEND_ERROR = 3
USER_CANCELED = 4
OTHERS = 5.
CALL FUNCTION 'CONVERT_OTF'
EXPORTING
FORMAT = 'PDF'
IMPORTING
BIN_FILESIZE = PDF_FSIZE
TABLES
OTF = GWA_RESULT-OTFDATA
LINES = LT_PDF
EXCEPTIONS
ERR_MAX_LINEWIDTH = 1
ERR_FORMAT = 2
ERR_CONV_NOT_POSSIBLE = 3
OTHERS = 4.
FIELD-SYMBOLS <FS_X> TYPE X.
DATA LV_CONTENT TYPE XSTRING.
LOOP AT LT_PDF INTO LS_PDF.
ASSIGN LS_PDF TO <FS_X> CASTING.
CONCATENATE LV_CONTENT <FS_X> INTO LV_CONTENT IN BYTE MODE.
ENDLOOP.
DATA: CLIENT TYPE REF TO IF_HTTP_CLIENT.
DATA HOST TYPE STRING.
DATA L_RESPUESTA TYPE STRING.
HOST = 'http://10.30.51.59:8080/api/img/uploads'.
CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
EXPORTING
URL = HOST
IMPORTING
CLIENT = CLIENT
EXCEPTIONS
ARGUMENT_NOT_FOUND = 1
PLUGIN_NOT_ACTIVE = 2
INTERNAL_ERROR = 3
OTHERS = 4.
CALL METHOD CLIENT->REQUEST->SET_METHOD(
IF_HTTP_REQUEST=>CO_REQUEST_METHOD_POST ).
CLIENT->REQUEST->SET_VERSION(
IF_HTTP_REQUEST=>CO_PROTOCOL_VERSION_1_0 ).
CALL METHOD CLIENT->REQUEST->IF_HTTP_ENTITY~SET_CONTENT_TYPE
EXPORTING
CONTENT_TYPE = 'multipart/form-data'.
CALL METHOD CLIENT->REQUEST->SET_HEADER_FIELD
EXPORTING
NAME = 'Accept'
VALUE = 'text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8'.
CALL METHOD CLIENT->REQUEST->SET_HEADER_FIELD
EXPORTING
NAME = 'Accept-Language'
VALUE = 'es-es,es;q=0.8,en-us;q=0.5,en;q=0.3'.
CALL METHOD CLIENT->REQUEST->SET_HEADER_FIELD
EXPORTING
NAME = 'Accept-Charset'
VALUE = 'ISO-8859-1,utf-8;q=0.7,*;q=0.7'.
CALL METHOD CLIENT->REQUEST->IF_HTTP_ENTITY~SET_FORMFIELD_ENCODING
EXPORTING
FORMFIELD_ENCODING = CL_HTTP_REQUEST=>IF_HTTP_ENTITY~CO_ENCODING_RAW.
*FORM.
DATA : IT_FORMULARIO TYPE TIHTTPNVP,
WA_FORMULARIO LIKE LINE OF IT_FORMULARIO.
DATA PART TYPE REF TO IF_HTTP_ENTITY.
PART = CLIENT->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).
CALL METHOD PART->SET_HEADER_FIELD
EXPORTING
NAME = 'content-disposition'
VALUE = 'form-data;name="event"'.
CALL METHOD PART->APPEND_CDATA
EXPORTING
DATA = 'YO'.
PART = CLIENT->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).
CALL METHOD PART->SET_HEADER_FIELD
EXPORTING
NAME = 'content-disposition'
VALUE = 'form-data;name="secret"'.
CALL METHOD PART->APPEND_CDATA
EXPORTING
DATA = 'file'.
PART = CLIENT->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).
CALL METHOD PART->SET_HEADER_FIELD
EXPORTING
NAME = 'content-disposition'
VALUE = 'form-data; name="file"; filename="HDB_SL_Logfile.log";'.
CALL METHOD PART->SET_CONTENT_TYPE
EXPORTING
* content_type = 'application/x-zip-compressed'.
CONTENT_TYPE = 'multipart/form-data'.
DATA: IT_DATA TYPE XSTRING,
FICHERO(40) TYPE C,
LEN TYPE I.
LEN = XSTRLEN( LV_CONTENT ).
CALL METHOD PART->SET_DATA
EXPORTING
DATA = LV_CONTENT
OFFSET = 0
LENGTH = LEN.
CALL METHOD CLIENT->SEND
EXPORTING
TIMEOUT = 200
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3
OTHERS = 4.
IF SY-SUBRC = 0.
CALL METHOD CLIENT->RECEIVE
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3
OTHERS = 5.
ENDIF.
DATA : STR1 TYPE STRING.
上面是主动发送?其实也可以发布服务被动调用原理一样的。
SAP 发布HTTP接口的Restful ( 含Token 验证)
四、总结与展望
SMARTFORMT 转 PDF 的方法丰富多样,为用户提供了极大的便利。代码开发方式虽然需要一定编程基础,但能实现精细控制;打印池假脱机请求转换相对便捷,适合熟悉 SAP 系统操作流程的用户;输入 Tcode PDF! 的方式简单快捷,满足对操作便捷性要求高的用户;使用 PDF 虚拟打印机转换则具有较高的灵活性。
而对于第三方调用,通过外部 http 调用的方式为数据传输至第三方系统提供了可能。这种方式在实际应用中能够实现系统间的数据交互,提高工作效率。
展望未来,随着技术的不断发展,SMARTFORMT 转 PDF 的方法可能会更加智能化和自动化。例如,可能会出现更加简洁高效的代码实现方式,减少编程的复杂性;打印池假脱机请求转换可能会更加智能化,自动识别和处理不同类型的请求;输入 Tcode PDF! 的方式可能会更加便捷,甚至可以通过语音指令等方式实现;使用 PDF 虚拟打印机转换可能会与更多的操作系统和软件进行更好的兼容。
同时,第三方调用方式也可能会更加多样化和安全化。可能会出现更多的接口和协议,方便与不同的第三方系统进行数据交互;数据传输的安全性也会得到进一步提高,确保数据在传输过程中的保密性和完整性。
总之,SMARTFORMT 转 PDF 的方法和第三方调用方式在未来有着广阔的发展前景,将为用户提供更加高效、便捷和安全的解决方案。
我是老周,如果你喜欢我的文字,请记得点击⬇️关注我。
码字不易,文章下拉,右边点个【赞】和【在看】吧!!
猜您还喜欢合集:
猜您还喜欢文章: