Using Floe to print to the SAP spool

Floe templates can be used to generate PDF output and print output (postscript) using Renda.io

The call to the Renda.io API for generating PDF is standard Floe functionality - simply configure Renda.io settings and use the function /FLOE/PDF_OUT.

But additional code is required to generate output to a printer - this is added into the print program.

In our example, we have a Floe document type 'ORD1' for sales order output.

We configure standard SAP output using a custom print program and this Floe document type:

Then we add logic to the print program as follows:

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
*---------------------------------------------------------------------*
* Use renda to generate pdl and send to spool - KB++
*---------------------------------------------------------------------*
  IF lv_device EQ 'P' AND gv_screen_display IS INITIAL.
*
    l_im_doc = lv_order.

    CALL FUNCTION 'ZFLOE_PRINT'
      EXPORTING
        im_outputparams = ls_outputparams
        im_etype        = gv_etype
        im_elang        = gv_language
        im_document     = l_im_doc
        im_variables    = gt_vars
      IMPORTING
        ex_subrc        = <gv_returncode>
        ex_mess_t       = lt_mess.

* Drop out if API has thrown an error
    IF <gv_returncode> NE 0.

      LOOP AT lt_mess INTO ls_mess.
        CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
          EXPORTING
            msg_arbgb = ls_mess-id
            msg_nr    = ls_mess-number
            msg_ty    = ls_mess-type
            msg_v1    = ls_mess-message_v1
            msg_v2    = ls_mess-message_v2
            msg_v3    = ls_mess-message_v3
            msg_v4    = ls_mess-message_v4
          EXCEPTIONS
            OTHERS    = 0.
      ENDLOOP.
*
    ENDIF.
*
    RETURN.
*
  ENDIF.
*---------------------------------------------------------------------*

Note that we have already filled the floe variables table gt_vars and the output parameters ls_outoutparams

This calls a custom function ZFLOE_PRINT to handle the output generation.

This function has the following logic:

1) Call function ZFLOE_POSTSCRIPT_OUT to retrieve PDF and Postscript files

Then use the normal set of functions for printing:

2) Call standard function ADS_GET_PRINTER_ATTRIBUTES

3) Call standard function FPCOMP_JOB_OPEN to begin the print job

4) Call standard function ADS_SR_OPEN to begin the spool request

5) Call standard function ADS_WRITE_TO_FILE twice - once for the postscript file and once for the PDF file

6) Call standard function ADS_SR_CONFIRM to confirm the spool request

7) Call standard function ADS_SR_CLOSE to complete the spool request

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
FUNCTION zfloe_print.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IM_OUTPUTPARAMS) TYPE  SFPOUTPUTPARAMS
*"     VALUE(IM_ETYPE) TYPE  /FLOE/ETYPE_CODE
*"     VALUE(IM_ELANG) TYPE  /FLOE/ELANG OPTIONAL
*"     VALUE(IM_DOCUMENT) TYPE  /FLOE/DOC_REF OPTIONAL
*"     VALUE(IM_VARIABLES) TYPE  /FLOE/VARS_T OPTIONAL
*"     VALUE(IM_FORM_DATA) TYPE  /FLOE/XML_TAB_T OPTIONAL
*"  EXPORTING
*"     VALUE(EX_SUBRC) TYPE  SYSUBRC
*"     VALUE(EX_MESS_T) TYPE  BAPIRET2_T
*"----------------------------------------------------------------------
*
  INCLUDE fp_spool_constants.
*
  DATA: lv_xpdl        TYPE xstring,
        lv_dest        TYPE rspopname,
        lv_imm_print   TYPE rspo1dispo,
        lv_auto_delete TYPE rspo2dispo,
        lv_name        TYPE rspo0name,
        lv_suffix1     TYPE rspo1name,
        lv_suffix2     TYPE rspo2name,
        lv_receiver    TYPE rsporeceiv,
        lv_division    TYPE rspodivisi,
        lv_coverpage   TYPE c,
        lv_copies      TYPE rspocopies,
        lv_lifetime(6) TYPE c,
        lv_handle      TYPE sytabix,
        lv_spoolid     TYPE rspoid,
        ls_mess        TYPE bapiret2,
        lv_length      TYPE i,
        lv_line_length TYPE i,
        lt_content     TYPE STANDARD TABLE OF w3mime,
        ls_content     TYPE w3mime,
        lv_xpdf        TYPE xstring,
        ls_outpar      TYPE sfpoutpar,
        lv_adsextension  TYPE string,
        lv_v1            TYPE symsgv,
        lv_v2            TYPE symsgv,
        lv_v3            TYPE symsgv,
        lv_v4            TYPE symsgv,
        lv_pagecount     TYPE i,
        lv_partname      TYPE adspart,
        lv_job_id        TYPE string,
        lv_filename(256) TYPE c,
        lv_nopdf(1)      TYPE c,
        lv_size          TYPE i,
        ls_job_result    TYPE sfpjobresult.
*
* Get postscript file from Renda
*
  CALL FUNCTION 'ZFLOE_POSTSCRIPT_OUT'
    EXPORTING
      im_etype     = im_etype
      im_elang     = im_elang
      im_document  = im_document
      im_variables = im_variables
      im_form_data = im_form_data
    IMPORTING
      ex_pdf       = lv_xpdf
      ex_pdl       = lv_xpdl
      ex_subrc     = ex_subrc
      ex_mess_t    = ex_mess_t.
*
  IF ex_subrc IS NOT INITIAL.
    RETURN.
  ENDIF.
  CONCATENATE: im_etype im_elang im_document sy-uname sy-datum sy-uzeit INTO lv_job_id SEPARATED BY '/'.
*
* Open print job
*
  MOVE-CORRESPONDING im_outputparams TO ls_outpar.
  ls_outpar-nodialog   = 'X'.
*
  CALL FUNCTION 'ADS_GET_PRINTER_ATTRIBUTES'
    EXPORTING
      dest         = ls_outpar-dest
    IMPORTING
      adsextension = lv_adsextension.
*
  IF lv_adsextension IS INITIAL.
*
    lv_v1 = ' Unable to print PDF. Printer'.
    lv_v2 = ls_outpar-dest.
    lv_v3 = 'has no adsextensions.'.
    CLEAR : lv_v4.
*
    CALL METHOD /floe/core=>message
      EXPORTING
        im_type   = /floe/core=>c_mess_error
        im_number = '000'
        im_v1     = lv_v1
        im_v2     = lv_v2
        im_v3     = lv_v3
        im_v4     = lv_v4
      IMPORTING
        ex_mess   = ls_mess.
*   Unable to print PDF. Printer &1 has no adsextensions.
    APPEND ls_mess TO ex_mess_t.
    ex_subrc = 4.
    RETURN.
*
  ENDIF.
*
  CALL FUNCTION 'FPCOMP_JOB_OPEN'
    CHANGING
      ie_outpar      = ls_outpar
    EXCEPTIONS
      cancel         = 1
      usage_error    = 2
      system_error   = 3
      internal_error = 4
      OTHERS         = 5.
*
  IF sy-subrc IS NOT INITIAL.
*
    ex_subrc = sy-subrc.
*
    IF sy-subrc NE 1.  "No need to record message if it's a user-cancel
*
      CALL METHOD /floe/core=>message
        EXPORTING
          im_type   = sy-msgty
          im_number = sy-msgno
          im_v1     = sy-msgv1
          im_v2     = sy-msgv2
          im_v3     = sy-msgv3
          im_v4     = sy-msgv4
          im_id     = sy-msgid
          im_no_log = 'X'
        IMPORTING
          ex_mess   = ls_mess.
*
      APPEND ls_mess TO ex_mess_t.
*
    ENDIF.
*
    RETURN.
*
  ENDIF.
*
* Open the ADS job
*
  lv_copies = ls_outpar-copies.
  lv_lifetime = ls_outpar-lifetime.
*
  CALL FUNCTION 'ADS_SR_OPEN'
    EXPORTING
      dest             = ls_outpar-dest
      append           = ' '
      doctype          = 'ADSP'
      immediate_print  = ls_outpar-reqimm
      auto_delete      = ls_outpar-reqdel
      name             = ls_outpar-dataset
      suffix1          = ls_outpar-suffix1
      suffix2          = ls_outpar-suffix2
      receiver         = ls_outpar-receiver
      division         = ls_outpar-division
      coverpage        = ls_outpar-cover
      lifetime         = lv_lifetime
      usespoolid       = ls_outpar-spoolid
      copies           = lv_copies
    IMPORTING
      handle           = lv_handle
      spoolid          = lv_spoolid
      partname         = lv_partname
    EXCEPTIONS
      device_missing   = 1
      no_such_device   = 2
      operation_failed = 3
      wrong_doctype    = 4
      OTHERS           = 5.
*
  IF sy-subrc IS NOT INITIAL.
*
    ex_subrc = sy-subrc.
*
    CALL METHOD /floe/core=>message
      EXPORTING
        im_type   = sy-msgty
        im_number = sy-msgno
        im_v1     = sy-msgv1
        im_v2     = sy-msgv2
        im_v3     = sy-msgv3
        im_v4     = sy-msgv4
        im_id     = sy-msgid
        im_no_log = 'X'
      IMPORTING
        ex_mess   = ls_mess.
*
    APPEND ls_mess TO ex_mess_t.
    RETURN.
*
  ENDIF.
*
* Write PDL spool file (correct type depending on the printer language)
*
  IF ls_outpar-pdltype = c_file_typ_ps.
    CONCATENATE lv_partname c_file_ext_ps INTO lv_filename.
  ELSE.
    CONCATENATE lv_partname c_file_ext_pcl INTO lv_filename.
  ENDIF.
*
  CALL FUNCTION 'ADS_WRITE_TO_FILE'
    EXPORTING
      filename                     = lv_filename
      buffer                       = lv_xpdl
      append                       = ' '
      useglobaldir                 = 'X'
    EXCEPTIONS
      cannot_open_file             = 1
      open_dataset_no_authority    = 2
      open_dataset_internal_error  = 3
      open_dataset_too_many_files  = 4
      dataset_cant_close           = 5
      close_dataset_internal_error = 6
      cannot_close_file            = 7
      cannot_transfer_data         = 8
      transfer_internal_error      = 9
      dataset_write_error          = 10
      OTHERS                       = 11.
*
  IF sy-subrc IS NOT INITIAL.
*
    ex_subrc = sy-subrc.
*
    CALL METHOD /floe/core=>message
      EXPORTING
        im_type   = sy-msgty
        im_number = sy-msgno
        im_v1     = sy-msgv1
        im_v2     = sy-msgv2
        im_v3     = sy-msgv3
        im_v4     = sy-msgv4
        im_id     = sy-msgid
        im_no_log = 'X'
      IMPORTING
        ex_mess   = ls_mess.
*
    APPEND ls_mess TO ex_mess_t.
    RETURN.
*
  ENDIF.
*
* Write PDF spool file
*
  CONCATENATE lv_partname c_file_ext_pdf INTO lv_filename.
*
  CALL FUNCTION 'ADS_WRITE_TO_FILE'
    EXPORTING
      filename                     = lv_filename
      buffer                       = lv_xpdf
      append                       = ' '
      useglobaldir                 = 'X'
    EXCEPTIONS
      cannot_open_file             = 1
      open_dataset_no_authority    = 2
      open_dataset_internal_error  = 3
      open_dataset_too_many_files  = 4
      dataset_cant_close           = 5
      close_dataset_internal_error = 6
      cannot_close_file            = 7
      cannot_transfer_data         = 8
      transfer_internal_error      = 9
      dataset_write_error          = 10
      OTHERS                       = 11.
*
  IF sy-subrc IS NOT INITIAL.
*
    ex_subrc = sy-subrc.
*
    CALL METHOD /floe/core=>message
      EXPORTING
        im_type   = sy-msgty
        im_number = sy-msgno
        im_v1     = sy-msgv1
        im_v2     = sy-msgv2
        im_v3     = sy-msgv3
        im_v4     = sy-msgv4
        im_id     = sy-msgid
        im_no_log = 'X'
      IMPORTING
        ex_mess   = ls_mess.
*
    APPEND ls_mess TO ex_mess_t.
    RETURN.
*
  ENDIF.
*
* Confirm and close ADS job
*
  lv_size = xstrlen( lv_xpdl ).
  lv_nopdf = ls_outpar-nopdf.
*
  CALL FUNCTION 'ADS_SR_CONFIRM'
    EXPORTING
      handle           = lv_handle
      partname         = lv_partname
      size             = lv_size
      pages            = 1
      no_pdf           = lv_nopdf
    EXCEPTIONS
      handle_not_valid = 1
      operation_failed = 2
      OTHERS           = 3.
*
  IF sy-subrc IS NOT INITIAL.
*
    ex_subrc = sy-subrc.
*
    CALL METHOD /floe/core=>message
      EXPORTING
        im_type   = sy-msgty
        im_number = sy-msgno
        im_v1     = sy-msgv1
        im_v2     = sy-msgv2
        im_v3     = sy-msgv3
        im_v4     = sy-msgv4
        im_id     = sy-msgid
        im_no_log = 'X'
      IMPORTING
        ex_mess   = ls_mess.
*
    APPEND ls_mess TO ex_mess_t.
    RETURN.
*
  ENDIF.
*
  CALL FUNCTION 'ADS_SR_CLOSE'
    EXPORTING
      handle           = lv_handle
    EXCEPTIONS
      handle_not_valid = 1
      operation_failed = 2
      OTHERS           = 3.
*
  IF sy-subrc IS NOT INITIAL.
*
    ex_subrc = sy-subrc.
*
    CALL METHOD /floe/core=>message
      EXPORTING
        im_type   = sy-msgty
        im_number = sy-msgno
        im_v1     = sy-msgv1
        im_v2     = sy-msgv2
        im_v3     = sy-msgv3
        im_v4     = sy-msgv4
        im_id     = sy-msgid
        im_no_log = 'X'
      IMPORTING
        ex_mess   = ls_mess.
*
    APPEND ls_mess TO ex_mess_t.
    RETURN.
*
  ENDIF.
*
* Close job
*
  CALL FUNCTION 'FPCOMP_JOB_CLOSE'
    IMPORTING
      e_jobresult    = ls_job_result
    EXCEPTIONS
      usage_error    = 1
      system_error   = 2
      internal_error = 3
      OTHERS         = 4.
*
  IF sy-subrc IS NOT INITIAL.
*
    ex_subrc = sy-subrc.
*
    CALL METHOD /floe/core=>message
      EXPORTING
        im_type   = sy-msgty
        im_number = sy-msgno
        im_v1     = sy-msgv1
        im_v2     = sy-msgv2
        im_v3     = sy-msgv3
        im_v4     = sy-msgv4
        im_id     = sy-msgid
        im_no_log = 'X'
      IMPORTING
        ex_mess   = ls_mess.
*
    APPEND ls_mess TO ex_mess_t.
    RETURN.
*
  ENDIF.
*
* If we've got this far, record a success message
*
  lv_v1 = 'Form print job'.
  lv_v2 = lv_job_id.
  CONDENSE lv_v2 NO-GAPS.
  lv_v3 = 'sent to spooler with request'.
  lv_v4 = lv_spoolid.
*
  CALL METHOD /floe/core=>message
    EXPORTING
      im_type   = /floe/core=>c_mess_success
      im_number = '000'
      im_v1     = lv_v1
      im_v2     = lv_v2
      im_v3     = lv_v3
      im_v4     = lv_v4
    IMPORTING
      ex_mess   = ls_mess.
* Form print job &1 sent to spooler with request &2.
  APPEND ls_mess TO ex_mess_t.
*
ENDFUNCTION.

Function ZFLOE_POSTSCRIPT_OUT contains two steps:

1) Call function /FLOE/PDF_OUT to trigger Renda.io to generate a PDF document

2) Call function ZPDF_TO_POSTSCRIPT to trigger Renda.io to generate a Postscript RAW document

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
FUNCTION zfloe_postscript_out.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IM_ETYPE) TYPE  /FLOE/ETYPE_CODE
*"     VALUE(IM_ELANG) TYPE  /FLOE/ELANG OPTIONAL
*"     VALUE(IM_DOCUMENT) TYPE  /FLOE/DOC_REF OPTIONAL
*"     VALUE(IM_VARIABLES) TYPE  /FLOE/VARS_T OPTIONAL
*"     VALUE(IM_FORM_DATA) TYPE  /FLOE/XML_TAB_T OPTIONAL
*"  EXPORTING
*"     VALUE(EX_PDF) TYPE  XSTRING
*"     VALUE(EX_PDL) TYPE  XSTRING
*"     VALUE(EX_SUBRC) TYPE  SYSUBRC
*"     VALUE(EX_MESS_T) TYPE  BAPIRET2_T
*"----------------------------------------------------------------------
*
  DATA: lv_mess TYPE string,
        lv_v1   TYPE symsgv,
        lv_v2   TYPE symsgv,
        ls_mess TYPE bapiret2.
*
  CALL FUNCTION '/FLOE/PDF_OUT'
    EXPORTING
      im_etype     = im_etype
      im_elang     = im_elang
      im_document  = im_document
      im_variables = im_variables
      im_form_data = im_form_data
    IMPORTING
      ex_pdf       = ex_pdf
      ex_subrc     = ex_subrc
      ex_mess_t    = ex_mess_t.
*
  IF ex_subrc IS NOT INITIAL.
    RETURN.
  ENDIF.
*
  CALL FUNCTION 'ZPDF_TO_POSTSCRIPT'
    EXPORTING
      im_rfcdest = 'RENDA_PDF2PDL'
      im_api_key = '<apikey>'
      im_pdf     = ex_pdf
    IMPORTING
      ex_pdl     = ex_pdl
      ex_mess    = lv_mess
      ex_subrc   = ex_subrc.
*
  IF lv_mess IS NOT INITIAL.
*
    lv_v1 = lv_mess.
*
    CALL METHOD /floe/core=>message
      EXPORTING
        im_type   = /floe/core=>c_mess_error
        im_number = '000'
        im_v1     = lv_v1
        im_v2     = lv_v2
        im_v3     = lv_v2
        im_v4     = lv_v2
      IMPORTING
        ex_mess   = ls_mess.
*
    APPEND ls_mess TO ex_mess_t.
*
  ENDIF.
*
ENDFUNCTION.

Function ZPDF_TO_POSTSCRIPT performs the API call using a configured RFC destination

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
FUNCTION zfloe_postscript_out.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IM_ETYPE) TYPE  /FLOE/ETYPE_CODE
*"     VALUE(IM_ELANG) TYPE  /FLOE/ELANG OPTIONAL
*"     VALUE(IM_DOCUMENT) TYPE  /FLOE/DOC_REF OPTIONAL
*"     VALUE(IM_VARIABLES) TYPE  /FLOE/VARS_T OPTIONAL
*"     VALUE(IM_FORM_DATA) TYPE  /FLOE/XML_TAB_T OPTIONAL
*"  EXPORTING
*"     VALUE(EX_PDF) TYPE  XSTRING
*"     VALUE(EX_PDL) TYPE  XSTRING
*"     VALUE(EX_SUBRC) TYPE  SYSUBRC
*"     VALUE(EX_MESS_T) TYPE  BAPIRET2_T
*"----------------------------------------------------------------------
*
  DATA: lv_mess TYPE string,
        lv_v1   TYPE symsgv,
        lv_v2   TYPE symsgv,
        ls_mess TYPE bapiret2.
*
  CALL FUNCTION '/FLOE/PDF_OUT'
    EXPORTING
      im_etype     = im_etype
      im_elang     = im_elang
      im_document  = im_document
      im_variables = im_variables
      im_form_data = im_form_data
    IMPORTING
      ex_pdf       = ex_pdf
      ex_subrc     = ex_subrc
      ex_mess_t    = ex_mess_t.
*
  IF ex_subrc IS NOT INITIAL.
    RETURN.
  ENDIF.
*
  CALL FUNCTION 'ZPDF_TO_POSTSCRIPT'
    EXPORTING
      im_rfcdest = 'RENDA_PDF2PDL'
      im_api_key = '<apikey>'
      im_pdf     = ex_pdf
    IMPORTING
      ex_pdl     = ex_pdl
      ex_mess    = lv_mess
      ex_subrc   = ex_subrc.
*
  IF lv_mess IS NOT INITIAL.
*
    lv_v1 = lv_mess.
*
    CALL METHOD /floe/core=>message
      EXPORTING
        im_type   = /floe/core=>c_mess_error
        im_number = '000'
        im_v1     = lv_v1
        im_v2     = lv_v2
        im_v3     = lv_v2
        im_v4     = lv_v2
      IMPORTING
        ex_mess   = ls_mess.
*
    APPEND ls_mess TO ex_mess_t.
*
  ENDIF.
*
ENDFUNCTION.

 

 

Since this approach sends both the postscript RAW data to the print spool and the PDF, the document output can be viewed in the Spool as a PDF.