PDF多份文档合并为一份

REPORT Z_PDF_MODULE.
TYPES: BEGIN OF gty_result,
         content TYPE fpcontent,
       END OF gty_result,
       gty_result_tab TYPE STANDARD TABLE OF gty_result.
DATA: ls_result    TYPE gty_result,
          gt_result       TYPE gty_result_tab.
START-OF-SELECTION.
  PERFORM FRM_PRINT_SFP.
*&---------------------------------------------------------------------*
*&      Form  FRM_PRINT_SFP
*&---------------------------------------------------------------------*
*      启动打印
*      打开->导入->填充数据->关闭
* 多份PDF合并为一份 FP_CHECK_BATCH_PDF_RETURN
* FP_GET_PDF_TABLE gets all the PDFs returned by ADS
*----------------------------------------------------------------------*
FORM FRM_PRINT_SFP .
  DATA: FM_NAME         TYPE RS38L_FNAM,      "功能模块的名称
        FP_DOCPARAMS    TYPE SFPDOCPARAMS,    "格式处理格式参数
        FP_OUTPUTPARAMS TYPE SFPOUTPUTPARAMS, "格式处理输出参数
*--------------------------------------------------------------------*
        lt_data  TYPE tsfixml,
        LV_SEP TYPE C,
        L_FILE  TYPE STRING,
        LS_PDF_FILE TYPE FPFORMOUTPUT,
        LO_PDF_MERGER TYPE REF TO CL_RSPO_PDF_MERGE,
        LT_PDF_TABLE TYPE TFPCONTENT,
        lv_merged_document TYPE xstring,
        lv_rc     TYPE i value 0,
        lv_len TYPE i,
        msg TYPE REF TO cx_rspo_pdf_merge.
*--------------------------------------------------------------------*
*打印默认勾选参数
  FP_OUTPUTPARAMS-DEST =  'LP01'.
  FP_OUTPUTPARAMS-NODIALOG = abap_true.
  FP_OUTPUTPARAMS-PREVIEW = abap_false.
  FP_OUTPUTPARAMS-GETPDF = 'M'.
  FP_OUTPUTPARAMS-ASSEMBLE = abap_true.
  FP_OUTPUTPARAMS-BUMODE = 'M'.
  FP_OUTPUTPARAMS-REQNEW = abap_true.


* 设置语言
*  FP_DOCPARAMS-LANGU   = 'E'.
*  FP_DOCPARAMS-COUNTRY = 'US'.

*&----打开 SPOOL JOB
  CALL FUNCTION 'FP_JOB_OPEN'               "& FORM PROCESSING: CALL FORM
    CHANGING
      IE_OUTPUTPARAMS = FP_OUTPUTPARAMS
    EXCEPTIONS
      CANCEL          = 1
      USAGE_ERROR     = 2
      SYSTEM_ERROR    = 3
      INTERNAL_ERROR  = 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.

*&----获取ADOBE FORM的名称参数
  CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
    EXPORTING
      I_NAME     = 'ZYC_PDF_T01'
    IMPORTING
      E_FUNCNAME = FM_NAME.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                     WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
*&----数据填充
DO 2 TIMES .
    CALL FUNCTION FM_NAME
      EXPORTING
        /1BCDWB/DOCPARAMS = FP_DOCPARAMS
        "HEAD              = GW_HEAD
        "ITEM              = GT_ITEM
      IMPORTING
        /1BCDWB/FORMOUTPUT = LS_PDF_FILE
      EXCEPTIONS
        USAGE_ERROR       = 1
        SYSTEM_ERROR      = 2
        INTERNAL_ERROR    = 3
        OTHERS            = 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.
    CLEAR LS_PDF_FILE.
ENDDO.
*&----关闭
  CALL FUNCTION 'FP_JOB_CLOSE'
    EXCEPTIONS
      USAGE_ERROR    = 1
      SYSTEM_ERROR   = 2
      INTERNAL_ERROR = 3
      OTHERS         = 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.
*--------------------------------------------------------------------*begin 1
*第一种方式:
*&&-- Merging different PDF files into one
  TRY .
    CREATE OBJECT LO_PDF_MERGER.
  CATCH cx_rspo_pdf_merge INTO msg.
    "WRITE:/ msg->GET_LONGTEXT().
  ENDTRY.

  CALL FUNCTION 'FP_GET_PDF_TABLE'
           IMPORTING
              E_PDF_TABLE = LT_PDF_TABLE.
*--------------------------------------------------------------------*
* Add documents to attribute table of PDF merger
  LOOP AT LT_PDF_TABLE INTO DATA(LWA_FORM).
    LO_PDF_MERGER->ADD_DOCUMENT( LWA_FORM ).
  ENDLOOP.
* Call kernel method to do the merge of the specified files.
  lo_pdf_merger->merge_documents( IMPORTING merged_document = lv_merged_document
                                                      rc = lv_rc ).
*--------------------------------------------------------------------*end 1
*--------------------------------------------------------------------* begin 2
*  CALL FUNCTION 'FP_GET_PDF_TABLE'
*           IMPORTING
*              E_PDF_TABLE = LT_PDF_TABLE.
*  CLEAR ls_result.
*  LOOP AT LT_PDF_TABLE INTO LS_RESULT-content.
*    INSERT ls_result INTO TABLE gt_result.
*    CLEAR ls_result.
*  ENDLOOP.
*--------------------------------------------------------------------*end 2
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_TEMP_DIRECTORY
    CHANGING
      TEMP_DIR             = L_FILE
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.
  IF SY-SUBRC IS NOT INITIAL.
    MESSAGE ID 'ED' TYPE 'E' NUMBER '256'.
  ENDIF.
  CALL METHOD CL_GUI_CFW=>FLUSH
    EXCEPTIONS
      CNTL_SYSTEM_ERROR = 1
      CNTL_ERROR        = 2
      OTHERS            = 3.
  IF SY-SUBRC IS NOT INITIAL.
    MESSAGE ID 'ED' TYPE 'E' NUMBER '256'.
  ENDIF.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_FILE_SEPARATOR
    CHANGING
      FILE_SEPARATOR       = LV_SEP
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.
  IF SY-SUBRC IS NOT INITIAL.
    MESSAGE ID 'ED' TYPE 'E' NUMBER '256'.
  ENDIF.
  CONCATENATE L_FILE LV_SEP SY-REPID '.pdf'  INTO L_FILE.
*--------------------------------------------------------------------*BEGIN 1
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      BUFFER     = lv_merged_document
    IMPORTING
      output_length = lv_len
    TABLES
      BINARY_TAB = LT_DATA.
*--------------------------------------------------------------------* END 1
*--------------------------------------------------------------------*BEGIN 2
*  CLEAR ls_result.
*  READ TABLE gt_result INTO ls_result INDEX 1.
*  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
*    EXPORTING
*      BUFFER     =  ls_result-content
*    TABLES
*      BINARY_TAB = LT_DATA.
*--------------------------------------------------------------------*END 2
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD
    EXPORTING
      BIN_FILESIZE            = lv_len"1
      "bin_filesize            = XSTRLEN( ls_result-content ) " 2
      FILENAME                = L_FILE
      FILETYPE                = 'BIN'
    CHANGING
      DATA_TAB                = LT_DATA
    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
      NOT_SUPPORTED_BY_GUI    = 22
      ERROR_NO_GUI            = 23
      OTHERS                  = 24.
  IF SY-SUBRC IS NOT INITIAL.
    MESSAGE ID 'ED' TYPE 'E' NUMBER '256'.
  ENDIF.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>EXECUTE
    EXPORTING
      DOCUMENT               = L_FILE
      SYNCHRONOUS            = 'X'
    EXCEPTIONS
      CNTL_ERROR             = 1
      ERROR_NO_GUI           = 2
      BAD_PARAMETER          = 3
      FILE_NOT_FOUND         = 4
      PATH_NOT_FOUND         = 5
      FILE_EXTENSION_UNKNOWN = 6
      ERROR_EXECUTE_FAILED   = 7
      SYNCHRONOUS_FAILED     = 8
      NOT_SUPPORTED_BY_GUI   = 9
      OTHERS                 = 10.
  IF SY-SUBRC IS NOT INITIAL.
    MESSAGE ID 'ED' TYPE 'I' NUMBER '256'.
  ENDIF.
*  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_DELETE
*    EXPORTING
*      FILENAME             = L_FILE
*    CHANGING
*      RC                   = LV_RC
*    EXCEPTIONS
*      FILE_DELETE_FAILED   = 1
*      CNTL_ERROR           = 2
*      ERROR_NO_GUI         = 3
*      FILE_NOT_FOUND       = 4
*      ACCESS_DENIED        = 5
*      UNKNOWN_ERROR        = 6
*      NOT_SUPPORTED_BY_GUI = 7
*      WRONG_PARAMETER      = 8
*      OTHERS               = 9.
*  IF SY-SUBRC IS NOT INITIAL.
*    MESSAGE ID 'ED' TYPE 'E' NUMBER '256'.
*  ENDIF.
ENDFORM.

 

posted @ 2023-10-16 14:44  kang09  阅读(26)  评论(0编辑  收藏  举报