Loading

记录ABAP开发的日常——将SmartForms保存为PDF

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

实现步骤演示:

1.创建SmartForms Demo结构

image

2.绘制SmartForms表单对象

image

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

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.实现效果

image
image

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

posted @ 2021-12-18 14:35  Gjboy666  阅读(940)  评论(4编辑  收藏  举报