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

Sapscript-PDF-Mail error: Insufficient data for an image

msuarezhulet
Participant
0 Likes
445

Hi, I've made a function module that takes a Purcharse Orden from spool, converts to PDF file and then send the form via mail. Everything work fine but the corporative logo in the form can't be seen... When I try to open the attachment, Acrobat Reader launchs a popup with the message "Insufficient data for an image" and then ONLY the logo is not displayed.

Here's the MF code. I'll give points to useful answers. Thank you.


FUNCTION Z_WF_SENDMAIL_PO_PDF.
*"----------------------------------------------------------------------
*"*"Interfase local
*"  IMPORTING
*"     VALUE(PO_ORDER) LIKE  EKKO-EBELN
*"     VALUE(DELETE_SPOOL) LIKE  SYST-FTYPE OPTIONAL
*"     VALUE(FILENAME) LIKE  P05T_RESPONSE-FILENAME OPTIONAL
*"     VALUE(RECEPTOR) LIKE  SWHACTOR STRUCTURE  SWHACTOR
*"  EXCEPTIONS
*"      SENDING_FAILURE
*"      CONVERSION_ERROR
*"      NO_SPOOL
*"      UPLOAD_ERROR
*"----------------------------------------------------------------------

  DATA: T_TSP01 TYPE TSP01 OCCURS 0 WITH HEADER LINE,
        PDF TYPE TLINE OCCURS 0 WITH HEADER LINE.
  DATA: NUMBYTES TYPE I,
        PDFSPOOLID TYPE TSP01-RQIDENT,
        JOBNAME TYPE TBTCJOB-JOBNAME,
        JOBCOUNT TYPE TBTCJOB-JOBCOUNT,
        SPOOLS TYPE I.
  DATA: gd_cnt TYPE i,
        gd_sent_all(1) TYPE c,
        gd_doc_data LIKE sodocchgi1,
        gd_error TYPE sy-subrc.

  DATA: it_packing_list LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE.
  DATA: lt_objpack LIKE sopcklsti1 OCCURS 2 WITH HEADER LINE,
        lt_objhead LIKE solisti1 OCCURS 1 WITH HEADER LINE,
        lt_objbin LIKE solisti1 OCCURS 10 WITH HEADER LINE,
        lt_objtxt LIKE solisti1 OCCURS 10 WITH HEADER LINE,
        lt_reclist LIKE somlreci1 OCCURS 5 WITH HEADER LINE,
        l_document_data TYPE sodocchgi1.

  DATA: l_att_lines TYPE i,
        gd_buffer type string.

  DATA: BEGIN OF lt_mails occurs 0,
          bname like usr21-bname,
          smtp_addr like adr6-smtp_addr,
        END OF lt_mails.

************************************************************************
  REFRESH : pdf, it_packing_list.
  CLEAR : pdf, it_packing_list.

  SELECT RQIDENT
  INTO T_TSP01-RQIDENT
  FROM TSP01
  WHERE RQOWNER EQ receptor-objid
    AND RQCLIENT EQ SY-MANDT.
    APPEND T_TSP01.
  ENDSELECT.

  IF SY-SUBRC NE 0.
    RAISE NO_SPOOL.
  ELSE.
    SORT T_TSP01 DESCENDING.
    READ TABLE T_TSP01 INDEX 1.

    CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'
      EXPORTING
        SRC_SPOOLID              = T_TSP01-RQIDENT
        NO_DIALOG                = ''
      IMPORTING
        PDF_BYTECOUNT            = NUMBYTES
*        PDF_SPOOLID              = PDFSPOOLID
*        BTC_JOBNAME              = JOBNAME
*        BTC_JOBCOUNT             = JOBCOUNT
      TABLES
        PDF                      = PDF
      EXCEPTIONS
        ERR_NO_OTF_SPOOLJOB      = 1
        ERR_NO_SPOOLJOB          = 2
        ERR_NO_PERMISSION        = 3
        ERR_CONV_NOT_POSSIBLE    = 4
        ERR_BAD_DSTDEVICE        = 5
        USER_CANCELLED           = 6
        ERR_SPOOLERROR           = 7
        ERR_TEMSEERROR           = 8
        ERR_BTCJOB_OPEN_FAILED   = 9
        ERR_BTCJOB_SUBMIT_FAILED = 10
        ERR_BTCJOB_CLOSE_FAILED  = 11
        OTHERS                   = 12.

    IF SY-SUBRC NE 0.
      RAISE CONVERSION_ERROR.
    ELSE.
      IF NOT FILENAME IS INITIAL.
        open dataset filename for output in binary mode.
        if sy-subrc ne 0 .
          RAISE UPLOAD_ERROR.
        endif.

        loop at pdf.
          transfer pdf to filename.
          if sy-subrc ne 0 .
            RAISE UPLOAD_ERROR.
          endif.
        ENDLOOP.
      ENDIF.
      IF NOT DELETE_SPOOL IS INITIAL.
        DELETE FROM TSP01 WHERE RQIDENT EQ T_TSP01-RQIDENT.
      ENDIF.

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

      CHECK NOT ( receptor IS INITIAL ).

      CLEAR: lt_reclist, lt_reclist[],
             lt_objhead, lt_objhead[],
             lt_objtxt, lt_objtxt[],
             lt_objbin, lt_objbin[],
             lt_objpack, lt_objpack[].

      CLEAR l_document_data.

* Chequea si fue bajada la orden de spool
      CHECK NOT ( pdf[] IS INITIAL ).

* Transferir los strings de 132 caracters a strings de 255 caracteres.
      loop at pdf.
        translate pdf using ' ~'.
        concatenate gd_buffer pdf into gd_buffer.
      endloop.

      translate gd_buffer using '~ '.

      do.
        lt_objbin = gd_buffer.
        append lt_objbin.
        shift gd_buffer left by 255 places.
        if gd_buffer is initial.
          exit.
        endif.
      enddo.

* Cuerpo del mail
      CONCATENATE 'Se adjunta Pedido de Compra' PO_ORDER INTO lt_objtxt SEPARATED BY SPACE.
      APPEND lt_objtxt.

      DESCRIBE TABLE lt_objtxt LINES l_att_lines.
      READ TABLE lt_objtxt INDEX l_att_lines.

* Titulo del mail
      l_document_data-obj_descr = 'Envio de Pedido de Compra'.
      l_document_data-obj_name = 'Pedido'.
      l_document_data-sensitivty = 'F'.
      l_document_data-expiry_dat = sy-datum + 10.
      l_document_data-doc_size = ( l_att_lines - 1 ) * 255 + strlen( lt_objtxt ).
      l_document_data-obj_langu = sy-langu.

      lt_objhead = 'ORDERS'.
      APPEND lt_objhead.

* Configuración del cuerpo del mail
      CLEAR lt_objpack.
      REFRESH lt_objpack.
      lt_objpack-transf_bin = space.
      lt_objpack-head_start = 1.
      lt_objpack-head_num = 0.
      lt_objpack-body_start = 1.
*      lt_objpack-body_num = 1.
      lt_objpack-body_num = l_att_lines.
      lt_objpack-doc_type = 'RAW'.
*      lt_objpack-doc_size = STRLEN( lt_objtxt ).
      APPEND lt_objpack.

* Configuración del archivo adjunto del mail
      DESCRIBE TABLE lt_objbin LINES l_att_lines.
      READ TABLE lt_objbin INDEX l_att_lines.

      clear lt_objpack.
      lt_objpack-transf_bin = 'X'.
      lt_objpack-head_start = 1.
      lt_objpack-head_num = 1.
      lt_objpack-body_start = 1.
      lt_objpack-body_num = l_att_lines.
      lt_objpack-doc_type = 'PDF'.
      lt_objpack-obj_name = 'Pedido'.
      lt_objpack-obj_descr = 'Pedido de Compra'.
*      lt_objpack-doc_size = ( 255 * ( l_att_lines - 1 ) ) + STRLEN( lt_objbin-line ).
      lt_objpack-doc_size = 255 * l_att_lines.
      append lt_objpack.

* Lista de receptores
      SELECT u~bname a~smtp_addr
        FROM usr21 as u
        INNER JOIN adr6 as a
        ON u~persnumber = a~persnumber
        INTO TABLE lt_mails
        WHERE bname = receptor-objid.

      LOOP AT lt_mails.
        clear lt_reclist.
        refresh lt_reclist.
        lt_reclist-receiver = lt_mails-smtp_addr.
        lt_reclist-rec_type = 'U'.
        lt_reclist-com_type = 'INT'.
        APPEND lt_reclist.
      ENDLOOP.

* Envio del mail
      CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
        EXPORTING
          document_data              = l_document_data
          put_in_outbox              = 'X'
          commit_work                = 'X'
        TABLES
          packing_list               = lt_objpack
          object_header              = lt_objhead
          contents_bin               = lt_objbin
          contents_txt               = lt_objtxt
          receivers                  = lt_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 NE 0.
        RAISE SENDING_FAILURE.
      ENDIF.
    ENDIF.
  ENDIF.

ENDFUNCTION.

Hi, I've made a function module that takes a Purcharse Orden from spool, converts to PDF file and then send the form via mail. Everything work fine but the corporative logo in the form can't be seen... When I try to open the attachment, Acrobat Reader launchs a popup with the message "Insufficient data for an image" and then ONLY the logo is not displayed.

Here's the MF code. I'll give points to useful answers. Thank you.


FUNCTION Z_WF_SENDMAIL_PO_PDF.
*"----------------------------------------------------------------------
*"*"Interfase local
*"  IMPORTING
*"     VALUE(PO_ORDER) LIKE  EKKO-EBELN
*"     VALUE(DELETE_SPOOL) LIKE  SYST-FTYPE OPTIONAL
*"     VALUE(FILENAME) LIKE  P05T_RESPONSE-FILENAME OPTIONAL
*"     VALUE(RECEPTOR) LIKE  SWHACTOR STRUCTURE  SWHACTOR
*"  EXCEPTIONS
*"      SENDING_FAILURE
*"      CONVERSION_ERROR
*"      NO_SPOOL
*"      UPLOAD_ERROR
*"----------------------------------------------------------------------

  DATA: T_TSP01 TYPE TSP01 OCCURS 0 WITH HEADER LINE,
        PDF TYPE TLINE OCCURS 0 WITH HEADER LINE.
  DATA: NUMBYTES TYPE I,
        PDFSPOOLID TYPE TSP01-RQIDENT,
        JOBNAME TYPE TBTCJOB-JOBNAME,
        JOBCOUNT TYPE TBTCJOB-JOBCOUNT,
        SPOOLS TYPE I.
  DATA: gd_cnt TYPE i,
        gd_sent_all(1) TYPE c,
        gd_doc_data LIKE sodocchgi1,
        gd_error TYPE sy-subrc.

  DATA: it_packing_list LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE.
  DATA: lt_objpack LIKE sopcklsti1 OCCURS 2 WITH HEADER LINE,
        lt_objhead LIKE solisti1 OCCURS 1 WITH HEADER LINE,
        lt_objbin LIKE solisti1 OCCURS 10 WITH HEADER LINE,
        lt_objtxt LIKE solisti1 OCCURS 10 WITH HEADER LINE,
        lt_reclist LIKE somlreci1 OCCURS 5 WITH HEADER LINE,
        l_document_data TYPE sodocchgi1.

  DATA: l_att_lines TYPE i,
        gd_buffer type string.

  DATA: BEGIN OF lt_mails occurs 0,
          bname like usr21-bname,
          smtp_addr like adr6-smtp_addr,
        END OF lt_mails.

************************************************************************
  REFRESH : pdf, it_packing_list.
  CLEAR : pdf, it_packing_list.

  SELECT RQIDENT
  INTO T_TSP01-RQIDENT
  FROM TSP01
  WHERE RQOWNER EQ receptor-objid
    AND RQCLIENT EQ SY-MANDT.
    APPEND T_TSP01.
  ENDSELECT.

  IF SY-SUBRC NE 0.
    RAISE NO_SPOOL.
  ELSE.
    SORT T_TSP01 DESCENDING.
    READ TABLE T_TSP01 INDEX 1.

    CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'
      EXPORTING
        SRC_SPOOLID              = T_TSP01-RQIDENT
        NO_DIALOG                = ''
      IMPORTING
        PDF_BYTECOUNT            = NUMBYTES
*        PDF_SPOOLID              = PDFSPOOLID
*        BTC_JOBNAME              = JOBNAME
*        BTC_JOBCOUNT             = JOBCOUNT
      TABLES
        PDF                      = PDF
      EXCEPTIONS
        ERR_NO_OTF_SPOOLJOB      = 1
        ERR_NO_SPOOLJOB          = 2
        ERR_NO_PERMISSION        = 3
        ERR_CONV_NOT_POSSIBLE    = 4
        ERR_BAD_DSTDEVICE        = 5
        USER_CANCELLED           = 6
        ERR_SPOOLERROR           = 7
        ERR_TEMSEERROR           = 8
        ERR_BTCJOB_OPEN_FAILED   = 9
        ERR_BTCJOB_SUBMIT_FAILED = 10
        ERR_BTCJOB_CLOSE_FAILED  = 11
        OTHERS                   = 12.

    IF SY-SUBRC NE 0.
      RAISE CONVERSION_ERROR.
    ELSE.
      IF NOT FILENAME IS INITIAL.
        open dataset filename for output in binary mode.
        if sy-subrc ne 0 .
          RAISE UPLOAD_ERROR.
        endif.

        loop at pdf.
          transfer pdf to filename.
          if sy-subrc ne 0 .
            RAISE UPLOAD_ERROR.
          endif.
        ENDLOOP.
      ENDIF.
      IF NOT DELETE_SPOOL IS INITIAL.
        DELETE FROM TSP01 WHERE RQIDENT EQ T_TSP01-RQIDENT.
      ENDIF.

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

      CHECK NOT ( receptor IS INITIAL ).

      CLEAR: lt_reclist, lt_reclist[],
             lt_objhead, lt_objhead[],
             lt_objtxt, lt_objtxt[],
             lt_objbin, lt_objbin[],
             lt_objpack, lt_objpack[].

      CLEAR l_document_data.

* Chequea si fue bajada la orden de spool
      CHECK NOT ( pdf[] IS INITIAL ).

* Transferir los strings de 132 caracters a strings de 255 caracteres.
      loop at pdf.
        translate pdf using ' ~'.
        concatenate gd_buffer pdf into gd_buffer.
      endloop.

      translate gd_buffer using '~ '.

      do.
        lt_objbin = gd_buffer.
        append lt_objbin.
        shift gd_buffer left by 255 places.
        if gd_buffer is initial.
          exit.
        endif.
      enddo.

* Cuerpo del mail
      CONCATENATE 'Se adjunta Pedido de Compra' PO_ORDER INTO lt_objtxt SEPARATED BY SPACE.
      APPEND lt_objtxt.

      DESCRIBE TABLE lt_objtxt LINES l_att_lines.
      READ TABLE lt_objtxt INDEX l_att_lines.

* Titulo del mail
      l_document_data-obj_descr = 'Envio de Pedido de Compra'.
      l_document_data-obj_name = 'Pedido'.
      l_document_data-sensitivty = 'F'.
      l_document_data-expiry_dat = sy-datum + 10.
      l_document_data-doc_size = ( l_att_lines - 1 ) * 255 + strlen( lt_objtxt ).
      l_document_data-obj_langu = sy-langu.

      lt_objhead = 'ORDERS'.
      APPEND lt_objhead.

* Configuración del cuerpo del mail
      CLEAR lt_objpack.
      REFRESH lt_objpack.
      lt_objpack-transf_bin = space.
      lt_objpack-head_start = 1.
      lt_objpack-head_num = 0.
      lt_objpack-body_start = 1.
*      lt_objpack-body_num = 1.
      lt_objpack-body_num = l_att_lines.
      lt_objpack-doc_type = 'RAW'.
*      lt_objpack-doc_size = STRLEN( lt_objtxt ).
      APPEND lt_objpack.

* Configuración del archivo adjunto del mail
      DESCRIBE TABLE lt_objbin LINES l_att_lines.
      READ TABLE lt_objbin INDEX l_att_lines.

      clear lt_objpack.
      lt_objpack-transf_bin = 'X'.
      lt_objpack-head_start = 1.
      lt_objpack-head_num = 1.
      lt_objpack-body_start = 1.
      lt_objpack-body_num = l_att_lines.
      lt_objpack-doc_type = 'PDF'.
      lt_objpack-obj_name = 'Pedido'.
      lt_objpack-obj_descr = 'Pedido de Compra'.
*      lt_objpack-doc_size = ( 255 * ( l_att_lines - 1 ) ) + STRLEN( lt_objbin-line ).
      lt_objpack-doc_size = 255 * l_att_lines.
      append lt_objpack.

* Lista de receptores
      SELECT u~bname a~smtp_addr
        FROM usr21 as u
        INNER JOIN adr6 as a
        ON u~persnumber = a~persnumber
        INTO TABLE lt_mails
        WHERE bname = receptor-objid.

      LOOP AT lt_mails.
        clear lt_reclist.
        refresh lt_reclist.
        lt_reclist-receiver = lt_mails-smtp_addr.
        lt_reclist-rec_type = 'U'.
        lt_reclist-com_type = 'INT'.
        APPEND lt_reclist.
      ENDLOOP.

* Envio del mail
      CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
        EXPORTING
          document_data              = l_document_data
          put_in_outbox              = 'X'
          commit_work                = 'X'
        TABLES
          packing_list               = lt_objpack
          object_header              = lt_objhead
          contents_bin               = lt_objbin
          contents_txt               = lt_objtxt
          receivers                  = lt_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 NE 0.
        RAISE SENDING_FAILURE.
      ENDIF.
    ENDIF.
  ENDIF.

ENDFUNCTION.

1 REPLY 1
Read only

Former Member
0 Likes
402

Hi Marcos,

I'm having the exact same issue with a sapscript PDF...it is displaying this error message but not the company logo. Were you able to work around this?

Thanks!

Todd Murphy

The Hershey Company