smartforms生成 PDF 压缩后下载至PC端或发至mail

Posted brokenshelltao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了smartforms生成 PDF 压缩后下载至PC端或发至mail相关的知识,希望对你有一定的参考价值。

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.

完整代码如下:

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 DEFAULTYuexiang.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

以上是关于smartforms生成 PDF 压缩后下载至PC端或发至mail的主要内容,如果未能解决你的问题,请参考以下文章

SAP Smartform转成PDF方法汇总

smartforms 二维码打印

一次排查多线程问题的记录

生成多个pdf文件并压缩它

Ruby on rails - 压缩和下载pdf文件

如何运用Java组件itext生成pdf