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 = 'test1@gmail.com'.
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