Application Development 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: 

PDF file format error - Smartform to e-mail attachment

Former Member
0 Kudos

Hi All,

I am trying to convert smartform output to PDF and send as an e-mail/fax attachment. Every thing works fine except when I try to open attachment in e-mail it says ‘Not supported file type or File Damage –> May be not correctly decoded’. I have attached my code for reference, any hints much appreciated. Thanks in advance.

Regards,

Tim

data: t_otf type table of itcoo,

t_tline type table of tline,

g_filesize TYPE I.

  • Internal Table declarations

DATA: i_otf TYPE itcoo OCCURS 0 WITH HEADER LINE,

i_tline TYPE TABLE OF tline WITH HEADER LINE,

i_receivers TYPE TABLE OF somlreci1 WITH HEADER LINE,

i_record LIKE solisti1 OCCURS 0 WITH HEADER LINE,

  • Objects to send mail.

i_objpack LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE,

i_objtxt LIKE solisti1 OCCURS 0 WITH HEADER LINE,

  • i_objbin LIKE solisti1 OCCURS 0 WITH HEADER LINE,

i_objbin LIKE SOLIX OCCURS 0 WITH HEADER LINE,

i_reclist LIKE somlreci1 OCCURS 0 WITH HEADER LINE,

  • Work Area declarations

w_objhead TYPE soli_tab,

w_ctrlop TYPE ssfctrlop,

w_compop TYPE ssfcompop,

w_return TYPE ssfcrescl,

w_doc_chng typE sodocchgi1,

w_data TYPE sodocchgi1,

w_buffer TYPE string,"To convert from 132 to 255

  • Variables declarations

v_form_name TYPE rs38l_fnam,

v_len_in LIKE sood-objlen,

v_len_out LIKE sood-objlen,

v_len_outn TYPE i,

v_lines_txt TYPE i,

v_lines_bin TYPE i.

<b> CALL FUNCTION FM_NAME</b>. .......

t_otf[] = wa_outinfo-otfdata[].

CALL FUNCTION <b>'CONVERT_OTF'</b>

EXPORTING

FORMAT = 'PDF'

MAX_LINEWIDTH = 132

  • ARCHIVE_INDEX = ' '

  • COPYNUMBER = 0

  • ASCII_BIDI_VIS2LOG = ' '

  • PDF_DELETE_OTFTAB = ' '

IMPORTING

BIN_FILESIZE = g_filesize

  • BIN_FILE = g_binfile

TABLES

OTF = t_otf

LINES = i_tline

EXCEPTIONS

ERR_MAX_LINEWIDTH = 1

ERR_FORMAT = 2

ERR_CONV_NOT_POSSIBLE = 3

ERR_BAD_OTF = 4

OTHERS = 5.

      • convert PDF 132 to 255

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

  • Convert PDF from 132 to 255.

LOOP AT i_tline.

  • Replacing space by ~

TRANSLATE i_tline USING ' ~'.

CONCATENATE w_buffer i_tline INTO w_buffer.

ENDLOOP.

  • Replacing ~ by space

TRANSLATE w_buffer USING '~ '.

DO.

i_record = w_buffer.

  • Appending 255 characters as a record

APPEND i_record.

SHIFT w_buffer LEFT BY 255 PLACES.

IF w_buffer IS INITIAL.

EXIT.

ENDIF.

ENDDO.

Refresh: i_reclist,

i_objtxt,

i_objbin,

i_objpack.

clear w_objhead.

  • Object with PDF.

loop at i_record.

i_objbin-line = i_record-line.

append i_objbin.

endloop.

  • i_objbin[] = i_record[].

DESCRIBE TABLE i_objbin LINES v_lines_bin.

  • Object with main text of the mail.

i_objtxt = 'Find attached the output of the smart form.'.

APPEND i_objtxt.

i_objtxt = 'Regards,'.

APPEND i_objtxt.

i_objtxt = 'test'.

APPEND i_objtxt.

DESCRIBE TABLE i_objtxt LINES v_lines_txt.

  • Document information.

w_doc_chng-obj_name = 'Smartform'.

w_doc_chng-expiry_dat = sy-datum + 10.

w_doc_chng-obj_descr = 'Smart form output'.

w_doc_chng-sensitivty = 'F'. "Functional object

w_doc_chng-doc_size = v_lines_txt * 255.

  • Pack to main body as RAW.

  • Obj. to be transported not in binary form

CLEAR i_objpack-transf_bin.

*Start line of object header in transport packet

i_objpack-head_start = 1.

  • Number of lines of an object header in object packet

i_objpack-head_num = 0.

  • Start line of object contents in an object packet

i_objpack-body_start = 1.

  • Number of lines of the object contents in an object packet

i_objpack-body_num = v_lines_txt.

  • Code for document class

i_objpack-doc_type = 'RAW'.

APPEND i_objpack.

  • Packing as PDF.

i_objpack-transf_bin = 'X'.

i_objpack-head_start = 1.

i_objpack-head_num = 1.

i_objpack-body_start = 1.

i_objpack-body_num = v_lines_bin.

i_objpack-doc_type = 'PDF'.

i_objpack-obj_name = 'Smartform'.

CONCATENATE 'Smartform_output' '.pdf'

INTO i_objpack-obj_descr.

i_objpack-doc_size = v_lines_bin * 255.

APPEND i_objpack.

  • Document information.

CLEAR i_reclist.

  • e-mail receivers.

i_reclist-receiver = 'my.mail@yahoo.com'.

i_reclist-express = 'X'.

i_reclist-rec_type = 'U'. "Internet address

APPEND i_reclist.

  • Sending mail.

CALL FUNCTION <b>'SO_NEW_DOCUMENT_ATT_SEND_API1'</b>

EXPORTING

document_data = w_doc_chng

put_in_outbox = 'X'

COMMIT_WORK = 'X'

TABLES

packing_list = i_objpack

object_header = w_objhead

contents_hex = i_objbin

contents_txt = i_objtxt

receivers = i_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.

ENDIF.

1 ACCEPTED SOLUTION

former_member223537
Active Contributor
0 Kudos

Hi Tim,

Please refer this link :

http://www.sapdevelopment.co.uk/reporting/rep_spooltopdf.htm

Best regards,

Prashant

5 REPLIES 5

former_member223537
Active Contributor
0 Kudos

Hi Tim,

Please refer this link :

http://www.sapdevelopment.co.uk/reporting/rep_spooltopdf.htm

Best regards,

Prashant

Former Member
0 Kudos

Tim I am also facing same error message did u find any solution for it????

0 Kudos

Hi Nilesh,

Pass the converted OTF file thru "CONTENTS_BIN" rather then "contents_hex" in "'SO_NEW_DOCUMENT_ATT_SEND_API1'" function module. with "contents_hex" there must be some end of file issue. Try and see it works.

Regards,

Tim

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

EXPORTING

document_data = gl_doc_chng

put_in_outbox = 'X'

COMMIT_WORK = 'X'

TABLES

packing_list = glt_objpack

object_header = glt_objhead

<b> CONTENTS_BIN = i_objbin

  • contents_hex = i_objbin</b>

contents_txt = gt_objcont

receivers = i_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.

0 Kudos

Hi Tim,

I used this to send a smartform in pdf format by email.

Hope it helps

Cristian

REPORT y_cb_test_051 .

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

  • DATA DECLARATION

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

TYPE-POOLS: meein.

TABLES: toa_dara,

nast,

tnapr,

arc_params.

DATA: ent_retco TYPE sy-subrc,

ent_screen TYPE c,

l_xkomk LIKE TABLE OF komk WITH HEADER LINE,

xscreen. "Kz. Probeausgabe

DATA: i_texto_cuerpo LIKE solisti1 OCCURS 0 WITH HEADER LINE.

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

  • SELECT OPTIONS / PARAMETERS

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

PARAMETERS:

p_kappl LIKE nast-kappl OBLIGATORY DEFAULT 'EF',

p_objky LIKE nast-objky OBLIGATORY DEFAULT '0010001125',

p_kschl LIKE nast-kschl OBLIGATORY DEFAULT 'NEU',

p_spras LIKE nast-spras OBLIGATORY DEFAULT 'EN',

p_parnr LIKE nast-parnr OBLIGATORY DEFAULT '50009123',

p_parvw LIKE nast-parvw OBLIGATORY DEFAULT 'BA',

p_erdat LIKE nast-erdat OBLIGATORY DEFAULT '20050908',

p_eruhr LIKE nast-eruhr OBLIGATORY DEFAULT '130105',

p_aende LIKE nast-aende DEFAULT 'X',

p_nacha LIKE nast-nacha DEFAULT '1',

p_ndialo TYPE tdsfflag DEFAULT ' ',

p_telfx LIKE nast-telfx DEFAULT '1-720-220-4274',

p_tland LIKE nast-tland DEFAULT 'US',

p_sform TYPE tdsfname DEFAULT 'ZMMNABPR3PFMMPO_L3' OBLIGATORY.

*PDF TABLES

DATA: tb_pdf LIKE tline OCCURS 0.

DATA: tb_pdf255 TYPE so_text255 OCCURS 0.

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

  • MAIN PROCESSING SECTION

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

START-OF-SELECTION.

  • SELECT SINGLE *

  • INTO nast

  • FROM nast

  • WHERE kappl = p_kappl

  • AND objky = p_objky

  • AND kschl = p_kschl

  • AND spras = p_spras

  • AND parnr = p_parnr

  • AND parvw = p_parvw

  • AND erdat = p_erdat

  • AND eruhr = p_eruhr.

*

  • IF sy-subrc <> 0.

MESSAGE s000(00) WITH 'Record in NAST not found.'.

nast-kappl = p_kappl.

nast-objky = p_objky.

nast-kschl = p_kschl.

nast-spras = p_spras.

nast-parnr = p_parnr.

nast-parvw = p_parvw.

nast-erdat = p_erdat.

nast-eruhr = p_eruhr.

nast-nacha = p_nacha.

nast-telfx = p_telfx.

nast-tland = p_tland.

  • ENDIF.

nast-aende = p_aende.

tnapr-sform = p_sform.

PERFORM entry_neu

USING

ent_retco

ent_screen.

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

  • FORMS

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

&----


*& Form entry_neu

&----


  • text

----


  • -->ENT_RETCO text

  • -->ENT_SCREEN text

----


FORM entry_neu

USING

ent_retco

ent_screen.

DATA: l_druvo LIKE t166k-druvo,

l_nast LIKE nast,

l_from_memory,

l_doc TYPE meein_purchase_doc_print.

DATA: ls_print_data_to_read TYPE lbbil_print_data_to_read.

DATA: ls_bil_invoice TYPE lbbil_invoice.

DATA: lf_fm_name TYPE rs38l_fnam.

DATA: ls_control_param TYPE ssfctrlop.

DATA: ls_composer_param TYPE ssfcompop.

DATA: ls_recipient TYPE swotobjid.

DATA: ls_sender TYPE swotobjid.

DATA: lf_formname TYPE tdsfname.

DATA: ls_addr_key LIKE addr_key.

  • xscreen = ent_screen.

  • clear ent_retco.

IF nast-aende EQ space.

l_druvo = '1'.

ELSE.

l_druvo = '2'.

ENDIF.

CALL FUNCTION 'ME_READ_PO_FOR_PRINTING'

EXPORTING

ix_nast = nast

ix_screen = ent_screen

IMPORTING

ex_retco = ent_retco

ex_nast = l_nast

doc = l_doc

CHANGING

cx_druvo = l_druvo

cx_from_memory = l_from_memory.

CHECK ent_retco EQ 0.

IF nast-adrnr IS INITIAL.

PERFORM get_addr_key

CHANGING ls_addr_key.

ELSE.

ls_addr_key = nast-adrnr.

ENDIF.

*Set the print Parameters

PERFORM set_print_param USING ls_addr_key

CHANGING ls_control_param

ls_composer_param

ls_recipient

ls_sender

ent_retco.

*Get the Smart Form name.

IF NOT tnapr-sform IS INITIAL.

lf_formname = tnapr-sform.

ELSE.

lf_formname = tnapr-fonam.

ENDIF.

  • determine smartform function module for invoice

CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'

EXPORTING

formname = lf_formname

IMPORTING

fm_name = lf_fm_name

EXCEPTIONS

no_form = 1

no_function_module = 2

OTHERS = 3.

IF sy-subrc <> 0.

  • error handling

ent_retco = sy-subrc.

  • perform protocol_update_i.

ENDIF.

ls_control_param-getotf = 'X'.

DATA: l_document_output_info TYPE ssfcrespd,

l_job_output_info TYPE ssfcrescl,

l_job_output_options TYPE ssfcresop.

CALL FUNCTION lf_fm_name

EXPORTING

archive_index = toa_dara

archive_parameters = arc_params

control_parameters = ls_control_param

mail_recipient = ls_recipient

mail_sender = ls_sender

output_options = ls_composer_param

user_settings = ' '

zxekko = l_doc-xekko

zxpekko = l_doc-xpekko

  • zxaend = l_doc-xaend

IMPORTING

document_output_info = l_document_output_info

job_output_info = l_job_output_info

job_output_options = l_job_output_options

TABLES

l_xekpo = l_doc-xekpo[]

l_xekpa = l_doc-xekpa[]

l_xpekpo = l_doc-xpekpo[]

l_xeket = l_doc-xeket[]

l_xtkomv = l_doc-xtkomv[]

l_xekkn = l_doc-xekkn[]

l_xekek = l_doc-xekek[]

l_xaend = l_doc-xaend[]

l_xkomk = l_xkomk

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.

BREAK-POINT.

ENDIF.

  • Converts OTF to PDF

DATA: v_len_in TYPE i.

CALL FUNCTION 'CONVERT_OTF'

EXPORTING

format = 'PDF'

max_linewidth = 132

IMPORTING

bin_filesize = v_len_in

TABLES

otf = l_job_output_info-otfdata

lines = tb_pdf

EXCEPTIONS

err_max_linewidth = 0

err_format = 1

err_conv_not_possible = 2

OTHERS = 3.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

  • Change the PDF format from 132 to 255.

CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE'

EXPORTING

  • line_width_src =

  • line_width_dst =

transfer_bin = 'X'

TABLES

content_in = tb_pdf

content_out = tb_pdf255

EXCEPTIONS

err_line_width_src_too_long = 1

err_line_width_dst_too_long = 2

err_conv_failed = 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.

DATA: lw_subject TYPE so_obj_des.

DATA: lwa_body TYPE solisti1.

DATA: ltb_body TYPE TABLE OF solisti1.

DATA: lw_filename TYPE char100.

DATA: ltb_recipients TYPE TABLE OF somlreci1.

DATA: lwa_recipients TYPE somlreci1.

lw_subject = 'This is the email subject'.

lwa_body-line = 'This is the email body - Line1'.

APPEND lwa_body TO ltb_body.

lwa_body-line = 'This is the email body - Line2'.

APPEND lwa_body TO ltb_body.

lwa_body-line = 'This is the email body - Line3'.

APPEND lwa_body TO ltb_body.

lwa_body-line = 'This is the email body - Line4'.

APPEND lwa_body TO ltb_body.

lw_filename = 'Contract'.

*RECIPIENTS

lwa_recipients-rec_type = 'U'.

lwa_recipients-express = 'X'.

lwa_recipients-receiver = sy-uname.

lwa_recipients-copy = ''.

APPEND lwa_recipients TO ltb_recipients.

  • RECIPIENTS

lwa_recipients-rec_type = 'U'.

lwa_recipients-express = 'X'.

lwa_recipients-receiver = 'john.doe@abc.com'.

lwa_recipients-copy = ''.

APPEND lwa_recipients TO ltb_recipients.

  • RECIPIENTS

lwa_recipients-rec_type = 'U'.

lwa_recipients-express = 'X'.

lwa_recipients-receiver = 'john.doe@gmail.com'.

lwa_recipients-copy = ''.

APPEND lwa_recipients TO ltb_recipients.

  • Sends the PDF by email.

PERFORM f_send_pdf_by_email

TABLES

tb_pdf255

ltb_body

ltb_recipients

USING

lw_subject

lw_filename.

ENDFORM. "entry_neu

&----


*& Form ZCA_MAIL_BIN

&----


  • text

----


FORM f_send_pdf_by_email

TABLES

ptb_pdf255 STRUCTURE solisti1

ptb_body STRUCTURE solisti1

ptb_recipients STRUCTURE somlreci1

USING

pw_subject TYPE so_obj_des

pw_filename TYPE char100.

*-DATA DECLARATION----


  • Variables y tablas internas.

DATA: BEGIN OF ltb_objbin OCCURS 0.

INCLUDE STRUCTURE solisti1.

DATA: END OF ltb_objbin.

DATA: lwa_doc_chng LIKE sodocchgi1,

lw_tab_lines LIKE sy-tabix,

ltb_objtxt LIKE solisti1 OCCURS 10 WITH HEADER LINE,

ltb_objpack LIKE sopcklsti1 OCCURS 2 WITH HEADER LINE.

*-MAIN PROCESSING SECTION----


clear: ltb_objbin, ltb_objtxt, ltb_objpack, lwa_doc_chng.

refresh: ltb_objbin, ltb_objtxt, ltb_objpack.

  • Control Data

lwa_doc_chng-obj_name = 'URGENT'.

lwa_doc_chng-sensitivty = 'P'.

lwa_doc_chng-no_change = 'X'.

lwa_doc_chng-priority = '1'.

lwa_doc_chng-obj_prio = '1'.

lwa_doc_chng-obj_langu = sy-langu.

lwa_doc_chng-no_change = 'X'.

  • Email Subject

lwa_doc_chng-obj_descr = pw_subject.

  • Email Body

ltb_objtxt[] = ptb_body[].

CLEAR ltb_objtxt.

DESCRIBE TABLE ltb_objtxt LINES lw_tab_lines.

IF lw_tab_lines GT 0.

READ TABLE ltb_objtxt INDEX lw_tab_lines.

lwa_doc_chng-doc_size =

( lw_tab_lines - 1 ) * 255 + STRLEN( ltb_objtxt ).

CLEAR ltb_objpack-transf_bin.

ltb_objpack-body_start = 1.

ltb_objpack-body_num = lw_tab_lines.

ltb_objpack-doc_type = 'RAW'.

APPEND ltb_objpack.

ENDIF.

  • Attachment

  • Move the binary attachment to other internal table.

ltb_objbin[] = ptb_pdf255[].

ltb_objpack-transf_bin = 'X'.

ltb_objpack-body_start = 1.

  • Get the number of lines in the Attachment (PDF FILE)

DESCRIBE TABLE ltb_objbin LINES lw_tab_lines.

ltb_objpack-body_num = lw_tab_lines.

ltb_objpack-doc_type = 'PDF'.

ltb_objpack-obj_descr = pw_filename.

ltb_objpack-obj_name = pw_filename.

ltb_objpack-doc_size = lw_tab_lines * 255.

APPEND ltb_objpack.

  • Call the function to send the PDF file by email

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

EXPORTING

document_data = lwa_doc_chng

put_in_outbox = 'X'

TABLES

packing_list = ltb_objpack

contents_bin = ltb_objbin

contents_txt = ltb_objtxt

receivers = ptb_recipients

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.

CASE sy-subrc.

WHEN 0.

WHEN 1. RAISE too_many_receivers.

WHEN 2. RAISE document_not_sent .

WHEN 3. RAISE document_type_not_exist.

WHEN 4. RAISE operation_no_authorization.

WHEN 5. RAISE parameter_error.

WHEN 7. RAISE enqueue_error .

WHEN OTHERS. RAISE x_error.

ENDCASE.

COMMIT WORK.

ENDFORM. "ZCA_MAIL_BIN

&----


*& Form get_addr_key

&----


  • text

----


  • -->P_CS_BIL_INVOICE_HD_ADR text

  • <--P_CS_ADDR_KEY text

----


FORM get_addr_key

CHANGING l_addr_key LIKE addr_key.

DATA: l_lfa1 LIKE lfa1.

SELECT SINGLE * FROM lfa1 INTO l_lfa1

WHERE lifnr = nast-parnr.

IF sy-subrc = 0.

MOVE l_lfa1-adrnr TO l_addr_key.

ENDIF.

ENDFORM. " get_addr_key

&----


*& Form set_print_param

&----


  • text

----


  • -->P_LS_ADDR_KEY text

  • <--P_LS_CONTROL_PARAM text

  • <--P_LS_COMPOSER_PARAM text

  • <--P_LS_RECIPIENT text

  • <--P_LS_SENDER text

  • <--P_CF_RETCODE text

----


FORM set_print_param USING is_addr_key LIKE addr_key

CHANGING cs_control_param TYPE ssfctrlop

cs_composer_param TYPE ssfcompop

cs_recipient TYPE swotobjid

cs_sender TYPE swotobjid

cf_retcode TYPE sy-subrc.

DATA: ls_itcpo TYPE itcpo.

DATA: lf_repid TYPE sy-repid.

DATA: lf_device TYPE tddevice.

DATA: ls_recipient TYPE swotobjid.

DATA: ls_sender TYPE swotobjid.

lf_repid = sy-repid.

  • CALL FUNCTION 'WFMC_PREPARE_SMART_FORM'

CALL FUNCTION 'Z_MMNA_WFMC_PREPARE_SMART_FORM'

EXPORTING

pi_nast = nast

pi_addr_key = is_addr_key

pi_repid = lf_repid

IMPORTING

pe_returncode = cf_retcode

pe_itcpo = ls_itcpo

pe_device = lf_device

pe_recipient = cs_recipient

pe_sender = cs_sender.

IF cf_retcode = 0.

MOVE-CORRESPONDING ls_itcpo TO cs_composer_param.

cs_composer_param-tdimmed = ' '.

cs_control_param-device = lf_device.

cs_control_param-no_dialog = 'X'.

  • cs_control_param-no_dialog = p_ndialo.

cs_control_param-preview = xscreen.

cs_control_param-getotf = ls_itcpo-tdgetotf.

cs_control_param-langu = nast-spras.

ENDIF.

ENDFORM. "set_print_param

Message was edited by: Cristian Berri

Former Member
0 Kudos

PDF setting