SMARTFORMT 转 PDF 的实用指南与第三方调用

文摘   2024-11-22 06:07   上海  

一、SMARTFORMT 转 PDF 的方法概述   

SMARTFORMT 转 PDF 有多种实用方法,为用户在不同场景下的需求提供了丰富的选择。

首先是代码开发的方式。通过先调用 smartform 函数获取 OTF 格式数据,接着调用函数 CONVERT_OTF 转换成 PDF 格式数据,最后再调用 GUI_DOWNLOAD 函数进行下载。这种方式需要一定的编程基础,但可以实现较为精细的控制。例如在示例代码中,需要设置各种参数如 LS_CONTROL_PARAMETERSLS_OUTPUT_OPTIONS 等,还需要处理可能出现的各种错误情况,如 FORMATTING_ERRORSEND_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数据
  "打印参数赋值  control-no_dialog       = 'X'."打印不显示  control-getotf          = 'X'."返回OTF表  control-langu           = sy-langu.  output_options-tddest   = 'LP01'."假脱机:设备名  output_options-tdimmed  = 'X'."立即假脱机打印  output_options-tddelete = '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文件到本地----------------******************************  DATAlv_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,包括eventsecretfile等,其中file的内容就是生成的 PDF 数据lv_content。最后调用sendreceive方法发送请求并接收响应。如果一切顺利,就可以将 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.


DATACLIENT 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(40TYPE 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方式)

SAP 发布HTTP接口的Restful ( 含Token 验证)

四、总结与展望    

SMARTFORMT 转 PDF 的方法丰富多样,为用户提供了极大的便利。代码开发方式虽然需要一定编程基础,但能实现精细控制;打印池假脱机请求转换相对便捷,适合熟悉 SAP 系统操作流程的用户;输入 Tcode PDF! 的方式简单快捷,满足对操作便捷性要求高的用户;使用 PDF 虚拟打印机转换则具有较高的灵活性。

而对于第三方调用,通过外部 http 调用的方式为数据传输至第三方系统提供了可能。这种方式在实际应用中能够实现系统间的数据交互,提高工作效率。

展望未来,随着技术的不断发展,SMARTFORMT 转 PDF 的方法可能会更加智能化和自动化。例如,可能会出现更加简洁高效的代码实现方式,减少编程的复杂性;打印池假脱机请求转换可能会更加智能化,自动识别和处理不同类型的请求;输入 Tcode PDF! 的方式可能会更加便捷,甚至可以通过语音指令等方式实现;使用 PDF 虚拟打印机转换可能会与更多的操作系统和软件进行更好的兼容。

同时,第三方调用方式也可能会更加多样化和安全化。可能会出现更多的接口和协议,方便与不同的第三方系统进行数据交互;数据传输的安全性也会得到进一步提高,确保数据在传输过程中的保密性和完整性。

总之,SMARTFORMT 转 PDF 的方法和第三方调用方式在未来有着广阔的发展前景,将为用户提供更加高效、便捷和安全的解决方案。

         

 

    

是老周,如果你喜欢我的文字,请记得点击⬇️关注我。


码字不易,文章下拉,右边点个【赞】和【在看】吧!!

猜您还喜欢合集:


解决方案

SAP优化

ABAP新语法

SAP Note

SAP

ABAP

懒人鱼


猜您还喜欢文章:

聊聊ABAP动态编程

SAP这样优化:乙方开心,甲方放心!

浅谈SAP/SSO介绍及应用

浅谈SAP/ 文档管理解决方案

浅谈SAP/某化学纤维行业客户-优化案例





曰天曰地
我要到哪里去↔️ 灵台方寸山,斜月三星洞。假如有一天全人类不存在,怎么证明人类存在过。AI怎么考古?会怎么考古⚠️
 最新文章