zoukankan      html  css  js  c++  java
  • smartforms生成 PDF 压缩后下载至PC端或发至mail

    1.smartforms--->生成PDF如下:
     "smartforms 名称
         LSMNAME = 'ZFIS0010'.
         CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'   " 内定函数
            EXPORTING
               FORMNAME           = LSMNAME "'ZFIS0010S'
            IMPORTING
               FM_NAME            = L_NAME
            EXCEPTIONS
               NO_FORM            = 1
               NO_FUNCTION_MODULE = 2
            OTHERS             = 3.
       IF SY-SUBRC <> 0.
        " Call Smart Forms ERROR!
        MESSAGE S001 DISPLAY LIKE 'E' WITH TEXT-E02.  " 提示表单错误
      ELSE.
    *--->---smrt forms參數設定---
        LS_CONTROL-NO_DIALOG = 'X'.   " No dialog window
        LS_CONTROL-GETOTF    = 'X'.   " Get OTF data
        LS_CONTROL-LANGU     = 'M'.
        LS_CONTROL-NO_OPEN   = 'X'.
        LS_CONTROL-PREVIEW   = 'X'.
        LS_COMPOSER-TDDEST   = 'FPW1'.
        LS_COMPOSER-TDIMMED  = 'X'.   " print immediately
    
    *--->---設定印表機--- " OTF: 直接下載檔案
        CALL FUNCTION 'SSF_OPEN'
         EXPORTING
           CONTROL_PARAMETERS = LS_CONTROL
           OUTPUT_OPTIONS     = LS_COMPOSER
           USER_SETTINGS = ''
         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.
    
    *--->---get OTF file---
        CLEAR: CH_OTF.
    
     " 动态调用新生成的函数
          CALL FUNCTION L_NAME
            EXPORTING
              USER_SETTINGS             = ''
              CONTROL_PARAMETERS = LS_CONTROL
              OUTPUT_OPTIONS         = LS_COMPOSER
              ZUGDT                          = ANLA-ZUGDT
            G_TOTALLINES             = G_TOTALLINES
            IMPORTING
              JOB_OUTPUT_INFO         = CH_OTF
            TABLES
             GT_LYS      = GT_LYS
           EXCEPTIONS
            FORMATTING_ERROR      = 1
            INTERNAL_ERROR            = 2
            SEND_ERROR                 = 3
            USER_CANCELED         = 4
           OTHERS                            = 5.
    
        IF SY-SUBRC <> 0.
     " GET OTF data ERROR!
          MESSAGE S001 DISPLAY LIKE 'E' WITH TEXT-E03. " 提示表单错误
        ENDIF.
    " 调用完整代码 PERFORM 并取消部分的注释,
    PERFORM SEND_PDF TABLES CH_OTF-OTFDATA. ENDIF.

    2.完整代码如下(不包含smartforms):

    REPORT  ZMM_PDF_ZPI_MAIL NO STANDARD PAGE HEADING
              MESSAGE-ID 00 LINE-SIZE 177 LINE-COUNT 200.
    DATA:g_val        TYPE c,
         w_pripar     TYPE pri_params,
         w_arcpar     TYPE arc_params,
         input_length TYPE i,
         content_x    TYPE xstring,
         content_s    TYPE string,
         spool_no     LIKE tsp01-rqident,
         it_pdf       TYPE TABLE OF tline WITH HEADER LINE,
         wa_pdf       LIKE LINE OF it_pdf,
         file_tab     TYPE STANDARD TABLE OF solisti1,
         bin_file     TYPE xstring,
         bytecount    TYPE i,
         zip          TYPE xstring,
         path_table   TYPE TABLE OF char1024.
    DATA: BEGIN OF it_t001 OCCURS 0,
            bukrs     TYPE t001-bukrs,
            butxt     TYPE t001-butxt,
          END OF it_t001.
    
    DATA:LT_TLINE TYPE STANDARD TABLE OF TLINE WITH HEADER LINE.
    DATA:  G_MAIL_ADDRESS TYPE AD_SMTPADR.
    DATA:g_zipper     TYPE REF TO cl_abap_zip.
    DATA:file_name    TYPE string VALUE 'Report_output.pdf'.
    DATA:file_name2    TYPE string VALUE 'Report_output2.pdf'.
    DATA:file_path    TYPE string VALUE 'D:	emppdf_report.ZIP'.
    
     SELECTION-SCREEN BEGIN OF BLOCK A WITH FRAME TITLE TEXT-BO1.
    
    SELECT-OPTIONS: s_addr FOR g_mail_address
                  NO INTERVALS DEFAULT'Yuexiang.Tao@dahata.com'.
      SELECTION-SCREEN END OF BLOCK A.
    
    START-OF-SELECTION.
      PERFORM get_data.
      PERFORM print_data CHANGING spool_no.
      PERFORM convert_spool_2_pdf.
      PERFORM convert_binary_2_xstring.
    
    END-OF-SELECTION.
    *&---------------------------------------------------------------------*
    *&      Form  get_data
    *&---------------------------------------------------------------------*
    FORM get_data .
    
      SELECT * FROM t001
        INTO CORRESPONDING FIELDS OF TABLE it_t001 UP TO 10 ROWS.
    
    ENDFORM.                    " get_data
    *&---------------------------------------------------------------------*
    *&      Form  print_data
    *&---------------------------------------------------------------------*
    FORM print_data  CHANGING spool_no.
      CALL FUNCTION 'GET_PRINT_PARAMETERS'
        EXPORTING
          in_archive_parameters  = w_arcpar
          in_parameters          = w_pripar
          layout                 = 'X_65_132'
          line_count             = 65
          line_size              = 255
          no_dialog              = 'X'
        IMPORTING
          out_archive_parameters = w_arcpar
          out_parameters         = w_pripar
          valid                  = g_val.
      IF g_val  NE space AND sy-subrc = 0.
        w_pripar-prrel = space.
        w_pripar-primm = space.
        NEW-PAGE PRINT ON NEW-SECTION PARAMETERS w_pripar ARCHIVE PARAMETERS w_arcpar NO DIALOG.
        "Output which is gone to spool
        LOOP AT it_t001.
          WRITE:/ it_t001.
        ENDLOOP.
        NEW-PAGE PRINT OFF.
        CALL FUNCTION 'ABAP4_COMMIT_WORK'.
      ENDIF.
      IF NOT sy-spono IS INITIAL.
        spool_no = sy-spono.
      ENDIF.
    ENDFORM.                    " print_data
    *&---------------------------------------------------------------------*
    *&      Form  convert_spool_2_pdf
    *&---------------------------------------------------------------------*
    FORM convert_spool_2_pdf .
      CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
        EXPORTING
          src_spoolid   = spool_no
          no_dialog     = space
        IMPORTING
          pdf_bytecount = bytecount
        TABLES
          pdf           = it_pdf.
    
    *"---> pdf 内表格式转换固定格式
        CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE'
        EXPORTING
          line_width_src = 134
          line_width_dst = 255
        TABLES
          content_in     = it_pdf
          content_out    = file_tab.
    
    ENDFORM.  " convert_spool_2_pdf
    
    *&---------------------------------------------------------------------*
    *&      Form  convert_binary_2_xstring
    *&---------------------------------------------------------------------*
    FORM convert_binary_2_xstring .
      "create xstring from table
      CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
        EXPORTING
          input_length = bytecount
        IMPORTING
          buffer       = content_x
        TABLES
          binary_tab   = file_tab.
    
        PERFORM SEND_PDF ."TABLES CH_OTF-OTFDATA. "CH_OTF-OTFDATA 是 JOB_OUTPUT_INFO 返回的参数
    *   PERFORM SEND_PDF TABLES CH_OTF-OTFDATA.
    ENDFORM.      " convert_binary_2_xstring
    
    FORM SEND_PDF. "TABLES IT_OTF STRUCTURE ITCOO
    *  smartforms 传过来值请启用一下注释代码
    *FORM SEND_PDF TABLES IT_OTF STRUCTURE ITCOO .
    
    DATA: "LT_PDF TYPE STANDARD TABLE OF TLINE,
          L_PDF_FSIZE    TYPE I, " PDF XSTRING SIZE
          MSG1(50) TYPE C.
    
    * ---CONVERT OTF TO PDF---
    *  CALL FUNCTION 'CONVERT_OTF'
    *    EXPORTING
    *     FORMAT      = 'PDF'
    *     MAX_LINEWIDTH    = 132
    *      IMPORTING
    *     BIN_FILESIZE     = L_PDF_FSIZE
    *      TABLES
    *     OTF    = IT_OTF
    *     LINES       = IT_PDF
    *      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.
    
    *-----------------pdf mail 压缩文件 ---------------------
    DATA:file_name    TYPE string VALUE 'output.pdf',
             file_name2    TYPE string VALUE 'output2.pdf',
             zip          TYPE xstring,
             l_obj_len2       TYPE i,
             file_path    TYPE string VALUE 'D:	emppdf_out.ZIP',
             g_zipper     TYPE REF TO cl_abap_zip.
    
    
     "---> 转换 xstring
     CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
        EXPORTING
          input_length = bytecount
        IMPORTING
          buffer       = content_x
        TABLES
          binary_tab   = file_tab.
    
    DATA: l_send_request  TYPE REF TO cl_bcs,
            l_zip           TYPE REF TO cl_abap_zip,
            l_sender        TYPE REF TO cl_sapuser_bcs,
            l_recipient     TYPE REF TO cl_cam_address_bcs,
            l_body_text     TYPE bcsy_text,
            l_obj_len       TYPE so_obj_len,
            l_subject       TYPE so_obj_des,
            l_exception     TYPE REF TO cx_bcs,
            l_message       TYPE string,
            l_content       TYPE solix_tab,
            l_html_xstr     TYPE xstring,
            lv_xstring TYPE xstring,
            l_zip_xstr      TYPE xstring,
            l_len           TYPE i,
            l_document      TYPE REF TO cl_document_bcs.
    
    TRY.
    
          l_send_request = cl_bcs=>create_persistent( ).
          l_subject = 'cl_abap_zip & cl_bcs example'.
          APPEND:  '<HTML><BODY>'   TO l_body_text,
                     'Hi,'       TO l_body_text,
                  '<p>Pls refer to the attached. Thanks.' TO l_body_text,
                   '</BODY><HTML>'       TO l_body_text.
          l_document = cl_document_bcs=>create_document(
                                i_type        = 'HTM'
                                i_text        = l_body_text
                                i_subject     = l_subject
                        ).
    
        CREATE OBJECT l_zip.
    " 第一个pdf文件
          CALL METHOD l_zip->add
            EXPORTING
              name    = 'cl_bcs example.PDF'
              content = content_x.
    
    " 第二个pdf文件
          CALL METHOD l_zip->add
            EXPORTING
              name    = 'cl_bcs example2.PDF'
              content = content_x.
    
    *创建一个压缩文件
          CALL METHOD l_zip->save
            RECEIVING
              zip = l_zip_xstr.
    
          CALL METHOD cl_bcs_convert=>xstring_to_solix
            EXPORTING
              iv_xstring =  l_zip_xstr
            RECEIVING
              et_solix   = l_content.
    
    *获取文件大小, ( XSTRLEN 计算文件大小 )
           l_obj_len = XSTRLEN( l_zip_xstr ) .
    
    CALL METHOD l_document->add_attachment
            EXPORTING
              i_attachment_size    = l_obj_len
              i_attachment_type    = 'ZIP'
              i_attachment_subject = l_subject
              i_att_content_hex    = l_content.
          l_send_request->set_document( l_document ).
          l_sender = cl_sapuser_bcs=>create( sy-uname ).
          LOOP AT s_addr.
            l_recipient = cl_cam_address_bcs=>create_internet_address(
                            s_addr-low ).
            CALL METHOD l_send_request->add_recipient
              EXPORTING
                i_recipient = l_recipient.
          ENDLOOP.
          CALL METHOD l_send_request->set_send_immediately( 'X' ).
          CALL METHOD l_send_request->send(
          EXPORTING
            i_with_error_screen  = 'X'
            ).
          COMMIT WORK.
    
          MESSAGE S001 WITH '邮件发送成功!' DISPLAY LIKE 'S'.
       CATCH cx_bcs INTO l_exception.
          l_message = l_exception->get_text( ).
          MESSAGE l_message TYPE 'E'.
      ENDTRY.
    
    *      IF SY-SUBRC = 0.
    *           MESSAGE S001 WITH '邮件发送成功!' DISPLAY LIKE 'S'.
    *      ENDIF.
    *----------------- end pdf mail 压缩文件 ---------------------
    
    *-----------------pdf 压缩文件 载到本端 -------------------
    *---->下载压缩 pdf文件
    "创建 g_zipper 压缩文件
     CREATE OBJECT g_zipper.
    
      "第一个 pdf(xstring类型 )add file to zip
      CALL METHOD g_zipper->add
        EXPORTING
          name    = file_name
          content = content_x.
    
    *   "第二个 pdf(xstring类型 )add file to zip
      CALL METHOD g_zipper->add
        EXPORTING
          name    = file_name2
          content = content_x.
    
    *创建一个压缩文件
      CALL METHOD g_zipper->save
        RECEIVING
          zip = zip.
    
      l_obj_len2 = XSTRLEN( zip ) .
    
    *字码转换 (xstring --> 二进制)
      CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
        EXPORTING
          buffer        = zip
        IMPORTING
          output_length = l_obj_len2
        TABLES
          binary_tab    = file_tab.
    
    *下载压缩文件到本端
      CALL FUNCTION 'GUI_DOWNLOAD'
        EXPORTING
          bin_filesize = l_obj_len2
          filename     = file_path
          filetype     = 'BIN'
        TABLES
          data_tab     = file_tab.
    *----------------- end pdf 压缩文件 载到本端 -------------------
    ENDFORM.

    效果如下:

    打开效果内容如下:

     

    原文参考:https://wiki.scn.sap.com/wiki/display/ABAP/CL_ABAP_ZIP+usage+-+Zipping+ABAP+report+output

  • 相关阅读:
    python学习-装饰器
    python-内置函数
    HA高可用解决方案-RHCS部署
    mac安装nose,command not found:nosetests
    iPhone的home键进果汁了,按起来粘粘的感觉
    Reportng 的测试报告在 Jenkins 中显示不全
    atom markdown报错:AssertionError: html-pdf: Failed to load PhantomJS module.
    markdown的图片外链
    reportng定制修改
    运行maven build报错No goals have been specified for this build.
  • 原文地址:https://www.cnblogs.com/Brokenshelltao/p/12145790.html
Copyright © 2011-2022 走看看