Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Regarding emailing password protected PDF using smartform

Former Member
0 Likes
5,388

Hi all,

My requirement is to sent email a password protected PDF that is generated from a smartform.

I have gone through many posts and made the development, however the pdf is mailed but not opening and giving the error "The file is damaged and could not be opened".

The steps the followed as as below

1.     Go to SM69  and create a new external system.

2.     Generated the FM name using "SSF_FUNCTION_MODULE_NAME"

3.     Called the above generated FM with options and imported the OTFDATA table.

4.     Converted the OTF data Tab to Lines using FM "CONVERT_OTF".

5.     Stored the file to in server using read dataset. (I have downloaded the file and it is opening properly, may be issue is from the below steps)

6.     Executed the FM's SXPG_COMMAND_LIST_GET, SXPG_COMMAND_CHECK and SXPG_COMMAND_EXECUTE to make the pdf password protected.

7.     Finally sent the pdf as mail attachment using FM "SO_NEW_DOCUMENT_ATT_SEND_API1".

The mail is sent but the pdf is not opening.

Please find the code attached.

*****************************************************************************************************************************************************************

REPORT ZSDS_PGI_PRINT.

TABLES : EKPO.

************************************************************************

*****  I-N-T-E-R-N-A-L  T-A-B-L-E-S  D-E-C-L-A-R-A-T-I-O-N  A-R-E-A ****

************************************************************************

DATA : T_DATA      TYPE STANDARD TABLE OF EKPO.

************************************************************************

**********      W-O-R-K--A-R-E-A  D-E-C-L-A-R-A-T-I-O-N      ***********

************************************************************************

DATA :    WA_DATA     TYPE EKPO.

************************************************************************

******    V-A-R-I-A-B-L-E-S   D-E-C-L-A-R-A-T-I-O-N   A-R-E-A    *******

************************************************************************

DATA : FM_NAME         TYPE RS38L_FNAM,

       CONTROL         TYPE SSFCTRLOP,

       OUTPUT_OPTIONS  TYPE SSFCOMPOP,

       XSFPARAM_LINE   TYPE SSFXSFP.

DATA : GS_OTFDATA TYPE SSFCRESCL,

       GT_OTF TYPE TABLE OF ITCOO.

DATA : GT_LINES TYPE STANDARD  TABLE OF TLINE,

GS_LINES TYPE TLINE.

DATA : BIN_FILE TYPE XSTRING.

DATA : GS_DOCDATA TYPE SODOCCHGI1.

DATA : GS_RECLIST      TYPE SOMLRECI1,

GT_RECLIST TYPE STANDARD TABLE OF SOMLRECI1.

DATA : GT_OBJBIN TYPE STANDARD TABLE OF SOLISTI1,

GS_OBJBIN TYPE SOLISTI1.

DATA :  GS_OBJPACK TYPE SOPCKLSTI1,

GT_OBJPACK TYPE STANDARD TABLE OF SOPCKLSTI1.

DATA : ITAB_ATTACH TYPE  XSTRING  .

DATA : T_ATTACHMENT TYPE  SOLIX_TAB.

************************************************************************

********           S-E-L-E-C-T-I-O-N    S-C-R-E-E-N         ************

************************************************************************

SELECTION-SCREEN   : BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-099.

SELECT-OPTIONS     : S_EBELN FOR EKPO-EBELN.

SELECTION-SCREEN   : END OF BLOCK B1.

************************************************************************

********           S-T-A-R-T O-F S-E-L-E-C-T-I-O-N          ************

************************************************************************

START-OF-SELECTION.

  PERFORM GET_DATA.

  IF NOT T_DATA IS INITIAL.

    PERFORM PRINTER_SETTINGS.

    PERFORM SMART_FORM.

  ELSE.

    MESSAGE 'No Entries Found' TYPE 'I'.

    LEAVE LIST-PROCESSING.

  ENDIF.

*&---------------------------------------------------------------------*

*&      Form  GET_DATA

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM GET_DATA .

  SELECT * FROM EKPO INTO TABLE T_DATA

  UP TO 10 ROWS.

ENDFORM.                    " GET_DATA

*&---------------------------------------------------------------------*

*&      Form  printer_settings

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM PRINTER_SETTINGS .

*    activate XSF Output Mode

  OUTPUT_OPTIONS-XSF        = ' '.      " XSF Output active

  OUTPUT_OPTIONS-XSFCMODE   = 'X'.      " Get XSF params from program

  OUTPUT_OPTIONS-XSFOUTMODE = 'S'.      " Application

  CLEAR OUTPUT_OPTIONS-XSFOUTDEV.

  OUTPUT_OPTIONS-XSFACTION  = 'http://www.sap.com'.

  OUTPUT_OPTIONS-XSFFORMAT  = 'X'.      " Formatting ON

  XSFPARAM_LINE-NAME  = 'GRAPHICS'.

  XSFPARAM_LINE-VALUE = 'EXTRACT'.

  APPEND XSFPARAM_LINE TO OUTPUT_OPTIONS-XSFPARS.

  XSFPARAM_LINE-NAME  = 'GRAPHICS-DIRECTORY'.

*  xsfparam_line-value = c_gr_dir.

  APPEND XSFPARAM_LINE TO OUTPUT_OPTIONS-XSFPARS.

  XSFPARAM_LINE-NAME  = 'CONTENT-ID'.

  XSFPARAM_LINE-VALUE = 'ENABLE'.

  APPEND XSFPARAM_LINE TO OUTPUT_OPTIONS-XSFPARS.

  OUTPUT_OPTIONS-TDIMMED = 'X'.

  OUTPUT_OPTIONS-TDNEWID = ' '.

  OUTPUT_OPTIONS-TDNOPRINT = ' '.

  OUTPUT_OPTIONS-TDDEST = 'LOCL'.

* silent mode ON

  CONTROL-NO_DIALOG = 'X'.

  CONTROL-PREVIEW   = ''.

  CONTROL-GETOTF    = 'X'.

ENDFORM.                    " printer_settings

*&---------------------------------------------------------------------*

*&      Form  smart_form

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM SMART_FORM .

  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'

    EXPORTING

      FORMNAME           = 'ZPDF_PWD'

    IMPORTING

      FM_NAME            = FM_NAME

    EXCEPTIONS

      NO_FORM            = 1

      NO_FUNCTION_MODULE = 2

      OTHERS             = 3.

  IF SY-SUBRC <> 0.

    WRITE: / 'ERROR 1'.

  ENDIF.

  CALL FUNCTION FM_NAME

    EXPORTING

      CONTROL_PARAMETERS = CONTROL

      OUTPUT_OPTIONS     = OUTPUT_OPTIONS

      USER_SETTINGS      = SPACE  "'X'

    IMPORTING

      JOB_OUTPUT_INFO    = GS_OTFDATA

    TABLES

      T_DATA             = T_DATA

    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.

  CLEAR GT_OTF.

  GT_OTF[] = GS_OTFDATA-OTFDATA[].

  CLEAR GT_LINES.

  CALL FUNCTION 'CONVERT_OTF'

    EXPORTING

      FORMAT                = 'PDF'

      MAX_LINEWIDTH         = 132

    IMPORTING

      BIN_FILESIZE          = BIN_FILE

    TABLES

      OTF                   = GT_OTF

      LINES                 = GT_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.

  DATA L_FILE TYPE STRING  .

  CONCATENATE  'c:\usr\sap\IDS\Attendance_record\work' '.PDF' INTO L_FILE.

  OPEN DATASET L_FILE FOR OUTPUT IN BINARY MODE  .

  IF  SY-SUBRC = 0 .

    LOOP AT GT_LINES INTO GS_LINES .

      TRANSFER GS_LINES TO L_FILE .

    ENDLOOP.

    CLOSE DATASET L_FILE .

  ELSE.

    WRITE : / 'operating system could not open file' .

  ENDIF.

**&******************************************************************

*      ASSIGNING THE DESCRIPTION OF THE OBJECT SENT IN MAIL

*&******************************************************************

  CLEAR GS_DOCDATA.

  GS_DOCDATA-OBJ_NAME = 'SAPRPT'.

  GS_DOCDATA-OBJ_DESCR = 'test'.

  GS_DOCDATA-OBJ_LANGU = SY-LANGU.

*&******************************************************************************

*        ASSIGNING THE EMAIL-ID TO STRUCTURE OF API RECIPIENT LIST TABLE

*&******************************************************************************

  CLEAR : GT_RECLIST,GS_RECLIST.

***IF INTERNAL MAIL-ID

*  gs_reclist-receiver = sy-uname.

*  gs_reclist-rec_type = 'B'.

***IF EXTERNAL MAIL-ID

  GS_RECLIST-RECEIVER = '[email protected]'.

  GS_RECLIST-REC_TYPE = 'U'.

  APPEND GS_RECLIST TO GT_RECLIST.

*&******************************************************************

*     PASSING THE SAP SCRIPT LINES TO SAP OFFICE

*&******************************************************************

  DATA :  GV_LEN TYPE I,

           GV_POS TYPE I.

  CLEAR : GS_OBJBIN,GS_LINES.

  LOOP AT GT_LINES INTO GS_LINES.

    GV_POS = 255 - GV_LEN.

    IF GV_POS > 134.

      GV_POS = 134.

    ENDIF.

    GS_OBJBIN+GV_LEN = GS_LINES(GV_POS).

    GV_LEN = GV_LEN + GV_POS.

    IF GV_LEN = 255.

      APPEND GS_OBJBIN TO GT_OBJBIN.

      CLEAR : GS_OBJBIN,GV_LEN.

      IF GV_POS < 134.

        GS_OBJBIN = GS_LINES+GV_POS.

        GV_LEN = 134 - GV_POS.

      ENDIF.

    ENDIF.

  ENDLOOP.

  IF GV_LEN > 0.

    APPEND GS_OBJBIN TO GT_OBJBIN.

  ENDIF.

*&******************************************************************

*           FILLING THE DETAILS IN SAP OFFICE

*&******************************************************************

  DATA : GV_TAB_LINES TYPE I.

  DESCRIBE TABLE GT_OBJBIN LINES GV_TAB_LINES.

  CLEAR GS_OBJBIN.

  READ TABLE GT_OBJBIN INTO GS_OBJBIN INDEX GV_TAB_LINES.

  IF SY-SUBRC = 0.

    GS_OBJPACK-DOC_SIZE = ( GV_TAB_LINES - 1 ) * 255 + STRLEN( GS_OBJBIN ).

    GS_OBJPACK-TRANSF_BIN = 'X'.

    GS_OBJPACK-HEAD_START = 1.

    GS_OBJPACK-HEAD_NUM = 0.

    GS_OBJPACK-BODY_START = 1.

    GS_OBJPACK-BODY_NUM = GV_TAB_LINES.

    GS_OBJPACK-DOC_TYPE = 'PDF'.

    GS_OBJPACK-OBJ_NAME = 'ATTACHMENT'.

    GS_OBJPACK-OBJ_DESCR = 'TEST'.

    APPEND GS_OBJPACK TO GT_OBJPACK.

  ENDIF.

*********************************************************************

*********************************************************************

  DATA: BEGIN OF COMMAND_LIST OCCURS 0.

          INCLUDE STRUCTURE SXPGCOLIST.

  DATA: END OF COMMAND_LIST .

  DATA: BEGIN OF EXEC_PROTOCOL OCCURS 0.

          INCLUDE STRUCTURE BTCXPM.

  DATA: END OF EXEC_PROTOCOL.

  DATA: STATUS LIKE BTCXP3-EXITSTAT,

   COMMANDNAME LIKE SXPGCOLIST-NAME VALUE 'ZDJ_ENCRYPTPDF',

    SEL_NO LIKE SY-TABIX.

* GET LIST OF EXTERNAL COMMANDS

  CALL FUNCTION 'SXPG_COMMAND_LIST_GET'

    EXPORTING

      COMMANDNAME     = COMMANDNAME

      OPERATINGSYSTEM = SY-OPSYS

    TABLES

      COMMAND_LIST    = COMMAND_LIST

    EXCEPTIONS

      OTHERS          = 1.

  CALL FUNCTION 'SXPG_COMMAND_CHECK'

    EXPORTING

      COMMANDNAME                = COMMAND_LIST-NAME

      OPERATINGSYSTEM            = SY-OPSYS

    EXCEPTIONS

      NO_PERMISSION              = 1

      COMMAND_NOT_FOUND          = 2

      PARAMETERS_TOO_LONG        = 3

      SECURITY_RISK              = 4

      WRONG_CHECK_CALL_INTERFACE = 5

      X_ERROR                    = 6

      TOO_MANY_PARAMETERS        = 7

      PARAMETER_EXPECTED         = 8

      ILLEGAL_COMMAND            = 9

      COMMUNICATION_FAILURE      = 10

      SYSTEM_FAILURE             = 11

      OTHERS                     = 12.

  CLEAR COMMAND_LIST.

  REFRESH COMMAND_LIST.

  DATA: V_DIR_INPUT      TYPE SXPGCOLIST-PARAMETERS.

  DATA: V_DIR_INPUT1      TYPE SXPGCOLIST-PARAMETERS.

  COMMAND_LIST-NAME = 'ZDJ_ENCRYPTPDF'.

  COMMAND_LIST-OPSYSTEM = 'Windows NT'.

  DATA : DOC  TYPE STRING.

  DATA : PASS TYPE STRING ,

        NAME(40).

  DOC = 'invoice'.

  PASS = '123456'.

  CONCATENATE   'cmd/c d:\pdf\encryptpdf.exe' DOC'.PDF' INTO NAME.

  CONCATENATE 'cmd /c d:\pdf\encryptpdf.exe' '-i'  NAME  '-o ' NAME  '-u'  PASS INTO V_DIR_INPUT SEPARATED BY SPACE .

  READ TABLE COMMAND_LIST INDEX SEL_NO.

  CONCATENATE COMMAND_LIST-OPCOMMAND V_DIR_INPUT INTO COMMAND_LIST-OPCOMMAND SEPARATED BY SPACE.

* CHECK AUTHORIZATION

  COMMAND_LIST-ADDPAR = 'X'.

  APPEND COMMAND_LIST.

  .

CONSTANTS: C_EXTCOM    TYPE SXPGCOLIST-NAME VALUE 'ZDJ_ENCRYPTPDF',

   C_OPER      TYPE SYOPSYS VALUE 'Windows NT'.

  DATA: T_RESULT         TYPE STANDARD TABLE OF BTCXPM.

  V_DIR_INPUT  =  COMMAND_LIST-OPCOMMAND.

  CALL FUNCTION 'SXPG_COMMAND_EXECUTE'

    EXPORTING

      COMMANDNAME                   = C_EXTCOM

      ADDITIONAL_PARAMETERS         = V_DIR_INPUT

      OPERATINGSYSTEM               = C_OPER

    TABLES

      EXEC_PROTOCOL                 = T_RESULT

    EXCEPTIONS

      NO_PERMISSION                 = 1

      COMMAND_NOT_FOUND             = 2

      PARAMETERS_TOO_LONG           = 3

      SECURITY_RISK                 = 4

      WRONG_CHECK_CALL_INTERFACE    = 5

      PROGRAM_START_ERROR           = 6

      PROGRAM_TERMINATION_ERROR     = 7

      X_ERROR                       = 8

      PARAMETER_EXPECTED            = 9

      TOO_MANY_PARAMETERS           = 10

      ILLEGAL_COMMAND               = 11

      WRONG_ASYNCHRONOUS_PARAMETERS = 12

      CANT_ENQ_TBTCO_ENTRY          = 13

      JOBCOUNT_GENERATION_ERROR     = 14

      OTHERS                        = 15.

  OPEN DATASET L_FILE FOR INPUT IN BINARY MODE.

  IF SY-SUBRC = 0.

    READ DATASET L_FILE INTO ITAB_ATTACH.

    CLOSE DATASET L_FILE.

  ENDIF.

  CALL METHOD CL_BCS_CONVERT=>XSTRING_TO_SOLIX

    EXPORTING

      IV_XSTRING = ITAB_ATTACH

    RECEIVING

      ET_SOLIX   = T_ATTACHMENT.

  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

    EXPORTING

      DOCUMENT_DATA              = GS_DOCDATA

      PUT_IN_OUTBOX              = 'X'

      COMMIT_WORK                = 'X'

    TABLES

      PACKING_LIST               = GT_OBJPACK

      CONTENTS_BIN               = GT_OBJBIN

      CONTENTS_HEX               = T_ATTACHMENT

      RECEIVERS                  = GT_RECLIST

    EXCEPTIONS

      TOO_MANY_RECEIVERS         = 1

      DOCUMENT_NOT_SENT          = 2

      DOCUMENT_TYPE_NOT_EXIST    = 3

      OPERATION_NO_AUTHORIZATION = 4

      PARAMETER_ERROR            = 5

      X_ERROR                    = 6

      ENQUEUE_ERROR              = 7

      OTHERS                     = 8.

  IF SY-SUBRC <> 0.

    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

       WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ELSE.

    WRITE 'SENT SUCCESSFULLY'.

  ENDIF.

ENDFORM.                    " smart_form

*****************************************************************************************************************************************************************

Thanks

Pavan

Hi all,

My requirement is to sent email a password protected PDF that is generated from a smartform.

I have gone through many posts and made the development, however the pdf is mailed but not opening and giving the error "The file is damaged and could not be opened".

The steps the followed as as below

1.     Go to SM69  and create a new external system.

2.     Generated the FM name using "SSF_FUNCTION_MODULE_NAME"

3.     Called the above generated FM with options and imported the OTFDATA table.

4.     Converted the OTF data Tab to Lines using FM "CONVERT_OTF".

5.     Stored the file to in server using read dataset. (I have downloaded the file and it is opening properly, may be issue is from the below steps)

6.     Executed the FM's SXPG_COMMAND_LIST_GET, SXPG_COMMAND_CHECK and SXPG_COMMAND_EXECUTE to make the pdf password protected.

7.     Finally sent the pdf as mail attachment using FM "SO_NEW_DOCUMENT_ATT_SEND_API1".

The mail is sent but the pdf is not opening.

Please find the code attached.

*****************************************************************************************************************************************************************

REPORT ZSDS_PGI_PRINT.

TABLES : EKPO.

************************************************************************

*****  I-N-T-E-R-N-A-L  T-A-B-L-E-S  D-E-C-L-A-R-A-T-I-O-N  A-R-E-A ****

************************************************************************

DATA : T_DATA      TYPE STANDARD TABLE OF EKPO.

************************************************************************

**********      W-O-R-K--A-R-E-A  D-E-C-L-A-R-A-T-I-O-N      ***********

************************************************************************

DATA :    WA_DATA     TYPE EKPO.

************************************************************************

******    V-A-R-I-A-B-L-E-S   D-E-C-L-A-R-A-T-I-O-N   A-R-E-A    *******

************************************************************************

DATA : FM_NAME         TYPE RS38L_FNAM,

       CONTROL         TYPE SSFCTRLOP,

       OUTPUT_OPTIONS  TYPE SSFCOMPOP,

       XSFPARAM_LINE   TYPE SSFXSFP.

DATA : GS_OTFDATA TYPE SSFCRESCL,

       GT_OTF TYPE TABLE OF ITCOO.

DATA : GT_LINES TYPE STANDARD  TABLE OF TLINE,

GS_LINES TYPE TLINE.

DATA : BIN_FILE TYPE XSTRING.

DATA : GS_DOCDATA TYPE SODOCCHGI1.

DATA : GS_RECLIST      TYPE SOMLRECI1,

GT_RECLIST TYPE STANDARD TABLE OF SOMLRECI1.

DATA : GT_OBJBIN TYPE STANDARD TABLE OF SOLISTI1,

GS_OBJBIN TYPE SOLISTI1.

DATA :  GS_OBJPACK TYPE SOPCKLSTI1,

GT_OBJPACK TYPE STANDARD TABLE OF SOPCKLSTI1.

DATA : ITAB_ATTACH TYPE  XSTRING  .

DATA : T_ATTACHMENT TYPE  SOLIX_TAB.

************************************************************************

********           S-E-L-E-C-T-I-O-N    S-C-R-E-E-N         ************

************************************************************************

SELECTION-SCREEN   : BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-099.

SELECT-OPTIONS     : S_EBELN FOR EKPO-EBELN.

SELECTION-SCREEN   : END OF BLOCK B1.

************************************************************************

********           S-T-A-R-T O-F S-E-L-E-C-T-I-O-N          ************

************************************************************************

START-OF-SELECTION.

  PERFORM GET_DATA.

  IF NOT T_DATA IS INITIAL.

    PERFORM PRINTER_SETTINGS.

    PERFORM SMART_FORM.

  ELSE.

    MESSAGE 'No Entries Found' TYPE 'I'.

    LEAVE LIST-PROCESSING.

  ENDIF.

*&---------------------------------------------------------------------*

*&      Form  GET_DATA

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM GET_DATA .

  SELECT * FROM EKPO INTO TABLE T_DATA

  UP TO 10 ROWS.

ENDFORM.                    " GET_DATA

*&---------------------------------------------------------------------*

*&      Form  printer_settings

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM PRINTER_SETTINGS .

*    activate XSF Output Mode

  OUTPUT_OPTIONS-XSF        = ' '.      " XSF Output active

  OUTPUT_OPTIONS-XSFCMODE   = 'X'.      " Get XSF params from program

  OUTPUT_OPTIONS-XSFOUTMODE = 'S'.      " Application

  CLEAR OUTPUT_OPTIONS-XSFOUTDEV.

  OUTPUT_OPTIONS-XSFACTION  = 'http://www.sap.com'.

  OUTPUT_OPTIONS-XSFFORMAT  = 'X'.      " Formatting ON

  XSFPARAM_LINE-NAME  = 'GRAPHICS'.

  XSFPARAM_LINE-VALUE = 'EXTRACT'.

  APPEND XSFPARAM_LINE TO OUTPUT_OPTIONS-XSFPARS.

  XSFPARAM_LINE-NAME  = 'GRAPHICS-DIRECTORY'.

*  xsfparam_line-value = c_gr_dir.

  APPEND XSFPARAM_LINE TO OUTPUT_OPTIONS-XSFPARS.

  XSFPARAM_LINE-NAME  = 'CONTENT-ID'.

  XSFPARAM_LINE-VALUE = 'ENABLE'.

  APPEND XSFPARAM_LINE TO OUTPUT_OPTIONS-XSFPARS.

  OUTPUT_OPTIONS-TDIMMED = 'X'.

  OUTPUT_OPTIONS-TDNEWID = ' '.

  OUTPUT_OPTIONS-TDNOPRINT = ' '.

  OUTPUT_OPTIONS-TDDEST = 'LOCL'.

* silent mode ON

  CONTROL-NO_DIALOG = 'X'.

  CONTROL-PREVIEW   = ''.

  CONTROL-GETOTF    = 'X'.

ENDFORM.                    " printer_settings

*&---------------------------------------------------------------------*

*&      Form  smart_form

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM SMART_FORM .

  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'

    EXPORTING

      FORMNAME           = 'ZPDF_PWD'

    IMPORTING

      FM_NAME            = FM_NAME

    EXCEPTIONS

      NO_FORM            = 1

      NO_FUNCTION_MODULE = 2

      OTHERS             = 3.

  IF SY-SUBRC <> 0.

    WRITE: / 'ERROR 1'.

  ENDIF.

  CALL FUNCTION FM_NAME

    EXPORTING

      CONTROL_PARAMETERS = CONTROL

      OUTPUT_OPTIONS     = OUTPUT_OPTIONS

      USER_SETTINGS      = SPACE  "'X'

    IMPORTING

      JOB_OUTPUT_INFO    = GS_OTFDATA

    TABLES

      T_DATA             = T_DATA

    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.

  CLEAR GT_OTF.

  GT_OTF[] = GS_OTFDATA-OTFDATA[].

  CLEAR GT_LINES.

  CALL FUNCTION 'CONVERT_OTF'

    EXPORTING

      FORMAT                = 'PDF'

      MAX_LINEWIDTH         = 132

    IMPORTING

      BIN_FILESIZE          = BIN_FILE

    TABLES

      OTF                   = GT_OTF

      LINES                 = GT_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.

  DATA L_FILE TYPE STRING  .

  CONCATENATE  'c:\usr\sap\IDS\Attendance_record\work' '.PDF' INTO L_FILE.

  OPEN DATASET L_FILE FOR OUTPUT IN BINARY MODE  .

  IF  SY-SUBRC = 0 .

    LOOP AT GT_LINES INTO GS_LINES .

      TRANSFER GS_LINES TO L_FILE .

    ENDLOOP.

    CLOSE DATASET L_FILE .

  ELSE.

    WRITE : / 'operating system could not open file' .

  ENDIF.

**&******************************************************************

*      ASSIGNING THE DESCRIPTION OF THE OBJECT SENT IN MAIL

*&******************************************************************

  CLEAR GS_DOCDATA.

  GS_DOCDATA-OBJ_NAME = 'SAPRPT'.

  GS_DOCDATA-OBJ_DESCR = 'test'.

  GS_DOCDATA-OBJ_LANGU = SY-LANGU.

*&******************************************************************************

*        ASSIGNING THE EMAIL-ID TO STRUCTURE OF API RECIPIENT LIST TABLE

*&******************************************************************************

  CLEAR : GT_RECLIST,GS_RECLIST.

***IF INTERNAL MAIL-ID

*  gs_reclist-receiver = sy-uname.

*  gs_reclist-rec_type = 'B'.

***IF EXTERNAL MAIL-ID

  GS_RECLIST-RECEIVER = '[email protected]'.

  GS_RECLIST-REC_TYPE = 'U'.

  APPEND GS_RECLIST TO GT_RECLIST.

*&******************************************************************

*     PASSING THE SAP SCRIPT LINES TO SAP OFFICE

*&******************************************************************

  DATA :  GV_LEN TYPE I,

           GV_POS TYPE I.

  CLEAR : GS_OBJBIN,GS_LINES.

  LOOP AT GT_LINES INTO GS_LINES.

    GV_POS = 255 - GV_LEN.

    IF GV_POS > 134.

      GV_POS = 134.

    ENDIF.

    GS_OBJBIN+GV_LEN = GS_LINES(GV_POS).

    GV_LEN = GV_LEN + GV_POS.

    IF GV_LEN = 255.

      APPEND GS_OBJBIN TO GT_OBJBIN.

      CLEAR : GS_OBJBIN,GV_LEN.

      IF GV_POS < 134.

        GS_OBJBIN = GS_LINES+GV_POS.

        GV_LEN = 134 - GV_POS.

      ENDIF.

    ENDIF.

  ENDLOOP.

  IF GV_LEN > 0.

    APPEND GS_OBJBIN TO GT_OBJBIN.

  ENDIF.

*&******************************************************************

*           FILLING THE DETAILS IN SAP OFFICE

*&******************************************************************

  DATA : GV_TAB_LINES TYPE I.

  DESCRIBE TABLE GT_OBJBIN LINES GV_TAB_LINES.

  CLEAR GS_OBJBIN.

  READ TABLE GT_OBJBIN INTO GS_OBJBIN INDEX GV_TAB_LINES.

  IF SY-SUBRC = 0.

    GS_OBJPACK-DOC_SIZE = ( GV_TAB_LINES - 1 ) * 255 + STRLEN( GS_OBJBIN ).

    GS_OBJPACK-TRANSF_BIN = 'X'.

    GS_OBJPACK-HEAD_START = 1.

    GS_OBJPACK-HEAD_NUM = 0.

    GS_OBJPACK-BODY_START = 1.

    GS_OBJPACK-BODY_NUM = GV_TAB_LINES.

    GS_OBJPACK-DOC_TYPE = 'PDF'.

    GS_OBJPACK-OBJ_NAME = 'ATTACHMENT'.

    GS_OBJPACK-OBJ_DESCR = 'TEST'.

    APPEND GS_OBJPACK TO GT_OBJPACK.

  ENDIF.

*********************************************************************

*********************************************************************

  DATA: BEGIN OF COMMAND_LIST OCCURS 0.

          INCLUDE STRUCTURE SXPGCOLIST.

  DATA: END OF COMMAND_LIST .

  DATA: BEGIN OF EXEC_PROTOCOL OCCURS 0.

          INCLUDE STRUCTURE BTCXPM.

  DATA: END OF EXEC_PROTOCOL.

  DATA: STATUS LIKE BTCXP3-EXITSTAT,

   COMMANDNAME LIKE SXPGCOLIST-NAME VALUE 'ZDJ_ENCRYPTPDF',

    SEL_NO LIKE SY-TABIX.

* GET LIST OF EXTERNAL COMMANDS

  CALL FUNCTION 'SXPG_COMMAND_LIST_GET'

    EXPORTING

      COMMANDNAME     = COMMANDNAME

      OPERATINGSYSTEM = SY-OPSYS

    TABLES

      COMMAND_LIST    = COMMAND_LIST

    EXCEPTIONS

      OTHERS          = 1.

  CALL FUNCTION 'SXPG_COMMAND_CHECK'

    EXPORTING

      COMMANDNAME                = COMMAND_LIST-NAME

      OPERATINGSYSTEM            = SY-OPSYS

    EXCEPTIONS

      NO_PERMISSION              = 1

      COMMAND_NOT_FOUND          = 2

      PARAMETERS_TOO_LONG        = 3

      SECURITY_RISK              = 4

      WRONG_CHECK_CALL_INTERFACE = 5

      X_ERROR                    = 6

      TOO_MANY_PARAMETERS        = 7

      PARAMETER_EXPECTED         = 8

      ILLEGAL_COMMAND            = 9

      COMMUNICATION_FAILURE      = 10

      SYSTEM_FAILURE             = 11

      OTHERS                     = 12.

  CLEAR COMMAND_LIST.

  REFRESH COMMAND_LIST.

  DATA: V_DIR_INPUT      TYPE SXPGCOLIST-PARAMETERS.

  DATA: V_DIR_INPUT1      TYPE SXPGCOLIST-PARAMETERS.

  COMMAND_LIST-NAME = 'ZDJ_ENCRYPTPDF'.

  COMMAND_LIST-OPSYSTEM = 'Windows NT'.

  DATA : DOC  TYPE STRING.

  DATA : PASS TYPE STRING ,

        NAME(40).

  DOC = 'invoice'.

  PASS = '123456'.

  CONCATENATE   'cmd/c d:\pdf\encryptpdf.exe' DOC'.PDF' INTO NAME.

  CONCATENATE 'cmd /c d:\pdf\encryptpdf.exe' '-i'  NAME  '-o ' NAME  '-u'  PASS INTO V_DIR_INPUT SEPARATED BY SPACE .

  READ TABLE COMMAND_LIST INDEX SEL_NO.

  CONCATENATE COMMAND_LIST-OPCOMMAND V_DIR_INPUT INTO COMMAND_LIST-OPCOMMAND SEPARATED BY SPACE.

* CHECK AUTHORIZATION

  COMMAND_LIST-ADDPAR = 'X'.

  APPEND COMMAND_LIST.

  .

CONSTANTS: C_EXTCOM    TYPE SXPGCOLIST-NAME VALUE 'ZDJ_ENCRYPTPDF',

   C_OPER      TYPE SYOPSYS VALUE 'Windows NT'.

  DATA: T_RESULT         TYPE STANDARD TABLE OF BTCXPM.

  V_DIR_INPUT  =  COMMAND_LIST-OPCOMMAND.

  CALL FUNCTION 'SXPG_COMMAND_EXECUTE'

    EXPORTING

      COMMANDNAME                   = C_EXTCOM

      ADDITIONAL_PARAMETERS         = V_DIR_INPUT

      OPERATINGSYSTEM               = C_OPER

    TABLES

      EXEC_PROTOCOL                 = T_RESULT

    EXCEPTIONS

      NO_PERMISSION                 = 1

      COMMAND_NOT_FOUND             = 2

      PARAMETERS_TOO_LONG           = 3

      SECURITY_RISK                 = 4

      WRONG_CHECK_CALL_INTERFACE    = 5

      PROGRAM_START_ERROR           = 6

      PROGRAM_TERMINATION_ERROR     = 7

      X_ERROR                       = 8

      PARAMETER_EXPECTED            = 9

      TOO_MANY_PARAMETERS           = 10

      ILLEGAL_COMMAND               = 11

      WRONG_ASYNCHRONOUS_PARAMETERS = 12

      CANT_ENQ_TBTCO_ENTRY          = 13

      JOBCOUNT_GENERATION_ERROR     = 14

      OTHERS                        = 15.

  OPEN DATASET L_FILE FOR INPUT IN BINARY MODE.

  IF SY-SUBRC = 0.

    READ DATASET L_FILE INTO ITAB_ATTACH.

    CLOSE DATASET L_FILE.

  ENDIF.

  CALL METHOD CL_BCS_CONVERT=>XSTRING_TO_SOLIX

    EXPORTING

      IV_XSTRING = ITAB_ATTACH

    RECEIVING

      ET_SOLIX   = T_ATTACHMENT.

  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

    EXPORTING

      DOCUMENT_DATA              = GS_DOCDATA

      PUT_IN_OUTBOX              = 'X'

      COMMIT_WORK                = 'X'

    TABLES

      PACKING_LIST               = GT_OBJPACK

      CONTENTS_BIN               = GT_OBJBIN

      CONTENTS_HEX               = T_ATTACHMENT

      RECEIVERS                  = GT_RECLIST

    EXCEPTIONS

      TOO_MANY_RECEIVERS         = 1

      DOCUMENT_NOT_SENT          = 2

      DOCUMENT_TYPE_NOT_EXIST    = 3

      OPERATION_NO_AUTHORIZATION = 4

      PARAMETER_ERROR            = 5

      X_ERROR                    = 6

      ENQUEUE_ERROR              = 7

      OTHERS                     = 8.

  IF SY-SUBRC <> 0.

    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

       WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ELSE.

    WRITE 'SENT SUCCESSFULLY'.

  ENDIF.

ENDFORM.                    " smart_form

*****************************************************************************************************************************************************************

Thanks

Pavan

14 REPLIES 14
Read only

Former Member
0 Likes
4,621

This message was moderated.

Read only

0 Likes
4,621

Hi,

Gone through the post,

I have generated the PDF file and saved to application server,

After that I have executed the FMs to make the pdf password protected.

even though I am able too pen the PDF without password.

Thanks

Pavan

Read only

rosenberg_eitan
Active Contributor
0 Likes
4,621

Hi,

First of all I suggest you use cl_bcs for the mail.

if you do not make the PDF password protected is it working ?

Send a binary file as attachment:

The result of this form can be used as attachment to CL_bcs:

FORM upload_file_2

   USING

     p_path TYPE pathextern

   CHANGING

     it_solix TYPE solix_tab .

   DATA: big_string TYPE xstring .

   DATA: mess TYPE string .

   OPEN  DATASET p_path FOR INPUT IN BINARY MODE MESSAGE mess .

   READ  DATASET p_path INTO big_string .

   CLOSE DATASET p_path .

   CALL METHOD cl_bcs_convert=>xstring_to_solix

     EXPORTING

       iv_xstring = big_string

     RECEIVING

       et_solix   = it_solix.

ENDFORM .                    "upload_file_2

See also :

note form FORM mail_1_prep_5

Regards .

Read only

0 Likes
4,621

Hi,

Thanks for the reply,

Yes, Without PDF password protected it is working.

Thanks,

Pavan.

Read only

0 Likes
4,621

Hi,

have you tried the external command by itself ?

Regards .

Read only

0 Likes
4,621

Hi,

I think that "additional_parameters" needs to be just the parameters for encryptpdf.exe

Also when using CONCATENATE use "RESPECTING BLANKS" .

From the help text look at the examples:

Encrypt PDF Command Line Options, Royalty free for developers

Also what is "cmd /c" use for ?

I usually prefer to call a batch file

Like here

note the external command usage

Regards .

Read only

0 Likes
4,621

I understand the "cmd /c"......

Read only

0 Likes
4,621

CONCATENATE   'cmd/c d:\pdf\encryptpdf.exe' DOC'.PDF' INTO NAME.


Why not use L_FILE ?

Read only

0 Likes
4,621

I've created a PDF file with smartforms then zip with password. its worked, could you try that.

Read only

0 Likes
4,621

Hi,

Yes, I will try,

Could you share something regarding the same.

Thanks,

Pavan.

Read only

0 Likes
4,621

program vca.

   data: begin of gt_tabl occurs 0,

         line(255),

         end of gt_tabl.

   data: gv_fm_name  type rs38l_fnam,

         gw_book     type ppftbook,

         gw_option   type ssfcompop,

         gw_param    type ssfctrlop,

         gs_info     type ssfcrescl,

         gt_pdf      type table of tline with header line,

         gt_hex      type table of solix,

         gv_filesize type i,

         gv_line     type xstring,

         gv_unixcmd(255).

   parameters p_mail(255) lower case obligatory.

start-of-selection.

   clear gv_fm_name.

   call function 'SSF_FUNCTION_MODULE_NAME'

     exporting

       formname           = 'SPPFDEMO_BOOK'

     importing

       fm_name            = gv_fm_name

     exceptions

       no_form            = 1

       no_function_module = 2

       others             = 3.

   check sy-subrc = 0.

   clear gw_param.

   gw_param-getotf        = 'X'.

   gw_param-no_dialog     = 'X'.

   clear gw_option.

   gw_option-tdnoprev     = 'X'.

   clear gs_info.

   call function gv_fm_name

     exporting

       output_options     = gw_option

       control_parameters = gw_param

       is_book            = gw_book

     importing

       job_output_info    = gs_info

     exceptions

       formatting_error   = 1

       internal_error     = 2

       send_error         = 3

       user_canceled      = 4

       others             = 5.

   check gs_info-otfdata[] is not initial.

   refresh gt_pdf.

   call function 'CONVERT_OTF'

     exporting

       format             = 'PDF'

       use_cascading      = 'X'

     importing

       bin_filesize       = gv_filesize

     tables

       otf                = gs_info-otfdata

       lines              = gt_pdf.

   check gt_pdf[] is not initial.

   open dataset '/tmp/zip_aix/pdffiles/file_name.pdf'

   for output in binary mode.

   if sy-subrc = 0.

     loop at gt_pdf.

       transfer gt_pdf to '/tmp/zip_aix/pdffiles/file_name.pdf'.

     endloop.

     close dataset '/tmp/zip_aix/pdffiles/file_name.pdf'.

   endif.

   clear gv_unixcmd.

   concatenate 'zip'

               '/tmp/zip_aix/'

               '-P' 'password'

               '/tmp/zip_aix/pdffiles/file_name.pdf'

          into gv_unixcmd separated by space.

   call 'SYSTEM' ID 'COMMAND' FIELD gv_unixcmd ID 'TAB'

                              FIELD gt_tabl-*sys*.

   if sy-subrc = 0.

     open dataset '/tmp/zip_aix/.zip' for input in binary mode.

     if sy-subrc = 0.

       do.

         read dataset '/tmp/zip_aix/.zip' into gv_line.

         if sy-subrc <> 0.

           exit.

         endif.

         refresh gt_hex.

         call function 'SCMS_XSTRING_TO_BINARY'

           exporting

             buffer          = gv_line

             append_to_table = 'X'

           importing

             output_length   = gv_filesize

           tables

             binary_tab      = gt_hex.

       enddo.

       close dataset '/tmp/zip_aix/.zip'.

     endif.

   endif.

   check gt_hex[] is not initial.

   data: gw_document_data type sodocchgi1,

         gt_packing_list  type sopcklsti1 occurs 0 with header line,

         gt_receivers     type somlreci1  occurs 0 with header line,

         gt_contents_hex  type solix      occurs 0,

         gt_contents_txt  type solisti1   occurs 0 with header line,

         gt_html          type html_table with header line,

         gv_sender        type so_rec_ext,

         gv_idx1          type i,

         gv_idx2          type i.

   refresh: gt_packing_list,

            gt_contents_txt,

            gt_contents_hex,

            gt_html.

   clear gw_document_data.

   gw_document_data-obj_name  = 'PDF_ZIP'.

   gw_document_data-obj_descr = 'file_name'.

   gw_document_data-no_change = 'X'.

   add gv_filesize to gw_document_data-doc_size.

   gv_idx1 = lines( gt_contents_hex ) + 1.

   append lines of gt_hex to gt_contents_hex.

   gv_idx2 = lines( gt_hex ).

   gt_packing_list-transf_bin = 'X'.

   gt_packing_list-head_start = 0.

   gt_packing_list-head_num   = 0.

   gt_packing_list-body_start = gv_idx1.

   gt_packing_list-body_num   = gv_idx2.

   gt_packing_list-doc_type   = 'ZIP'.

   gt_packing_list-obj_name   = 'file_name.zip'.

   gt_packing_list-obj_descr  = 'file_name.zip'.

   gt_packing_list-obj_langu  = 'E'.

   gt_packing_list-doc_size   = gv_filesize.

   append gt_packing_list.

   clear gt_packing_list.

   refresh gt_receivers.

   gt_receivers-rec_type = 'U'.

   gt_receivers-receiver = p_mail.

   append gt_receivers.

   clear gt_receivers.

   call function 'SO_DOCUMENT_SEND_API1'

     exporting

       document_data              = gw_document_data

       sender_address             = gv_sender

       sender_address_type        = space

       commit_work                = 'X'

     tables

       packing_list               = gt_packing_list

       contents_txt               = gt_contents_txt

       contents_hex               = gt_contents_hex

       receivers                  = gt_receivers

     exceptions

       too_many_receivers         = 1

       document_not_sent          = 2

       document_type_not_exist    = 3

       operation_no_authorization = 4

       parameter_error            = 5

       x_error                    = 6

       enqueue_error              = 7

       others                     = 8.

   submit rsconn01 with mode = 'INT' and return.

   clear gv_unixcmd.

   gv_unixcmd = 'rm /tmp/zip_aix/pdffiles/file_name.pdf'.

   call 'SYSTEM' ID 'COMMAND' FIELD gv_unixcmd ID 'TAB'

                              FIELD gt_tabl-*sys*.

   clear gv_unixcmd.

   gv_unixcmd = 'rm /tmp/zip_aix/.zip'.

   call 'SYSTEM' ID 'COMMAND' FIELD gv_unixcmd ID 'TAB'

                              FIELD gt_tabl-*sys*.

Read only

0 Likes
4,621

Hi Pavan.,

I created path name /tmp/zip_aix/ and /tmp/zip_aix/pdffiles at SAP R3 for keep PDF file and convert to ZIP file, then I used unix commpand -P for add password and sent to email address.

when I input "password" the PDF file was opend.

Budtawan Vu

Read only

0 Likes
4,621

Can you help me please ?

I have same requirement. Send pdf with password protected.

Read only

Former Member
0 Likes
4,621

hi Budtawan Vu,

Can you help me please ?

I have same requirement. Send pdf with password protected.