Problem
Aus SAP heraus soll ein bestehendes PDF Dokument gedruckt werden. Das Dokument wurde nicht mittels Adobe Forms Service erstellt, sondern z.B.: über Dienste zum Objekt an einen Materialstammsatz abgelegt.
Auf dieser Seite ist beschrieben, wie ein PDF Dokument, welches im SAP Dokumentenmanagementsystem abgelegt ist oder mittels GUI_UPLOAD hochgeladen wurde, mittels ABAP ausgedruckt werden kann.
Das Beispielprogramm stammt nicht von mir, sondern aus der SAP Community. In dem Beitrag gibt es noch weitere Hinweise: https://archive.sap.com/discussions/thread/2114729
Ich habe lange nach einer passenden Lösung gesucht und hatte beim experimentieren Probleme mit dem Papierformat. Daher habe ich mich entschieden, diesen kurzen Artikel zu verfassen.
Hinweis
Beim Erstellen des PDF Dokuments muss darauf geachtet werden, dass es exakt DIN A4 Format hat. Andernfalls kommt es zu Problemen beim Drucken. Wird beispielsweise ein PowerPoint Dokument als PDF exportiert, wird als Papierformat 250mm x 190mm übernommen. Wird das Dokument von SAP auf den Drucker ausgegeben, wird der manuelle Papierschacht gewählt, da es kein Standard DIN Format ist.
Wird hingegen das PowerPoint Dokument als PDF gedruckt (z.B. PDFCreator) und hier fest A4 als Papierformat hinterlegt, kann das so erzeugte Dokument erfolgreich ausgegeben werden.
Lösung
*-----------------------------------------------------------------------------
* Drucken von bestehenden PDF Dokumenten (z.B. Dienste zum Objekt)
* direkt aus SAP heraus https://archive.sap.com/discussions/thread/2114729
*-----------------------------------------------------------------------------
REPORT z_print_pdf.
TYPE-POOLS: abap, srmgs.
PARAMETERS: p_prnds LIKE tsp01-rqdest OBLIGATORY DEFAULT 'LOCL',
p_fname TYPE file_table-filename OBLIGATORY LOWER CASE,
p_ncopi TYPE rspocopies OBLIGATORY DEFAULT '1',
p_immed AS CHECKBOX.
*-----------------------------------------------------------------------------
* AT SELECTION-SCREEN ON VALUE REQUEST
*-----------------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.
DATA: lv_rc TYPE i,
lv_filter TYPE string.
DATA: lt_files TYPE filetable.
FIELD-SYMBOLS: <fs_file> LIKE LINE OF lt_files.
CONCATENATE 'PDF (*.pdf)|*.pdf|' cl_gui_frontend_services=>filetype_all INTO lv_filter.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
file_filter = lv_filter
CHANGING
file_table = lt_files
rc = lv_rc
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0 AND lv_rc EQ 0.
MESSAGE 'Error' TYPE 'E' DISPLAY LIKE 'S'.
ENDIF.
READ TABLE lt_files ASSIGNING <fs_file> INDEX 1.
IF sy-subrc EQ 0.
p_fname = <fs_file>-filename.
ENDIF.
*-----------------------------------------------------------------------------
* AT SELECTION-SCREEN
*-----------------------------------------------------------------------------
AT SELECTION-SCREEN.
DATA: lv_name TYPE string,
lv_result TYPE boolean.
lv_name = p_fname.
CALL METHOD cl_gui_frontend_services=>file_exist
EXPORTING
file = lv_name
RECEIVING
result = lv_result
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
MESSAGE 'Bad file!' TYPE 'E' DISPLAY LIKE 'S'.
ENDIF.
IF lv_result NE abap_true.
MESSAGE 'Bad file!' TYPE 'E' DISPLAY LIKE 'S'.
ENDIF.
*-----------------------------------------------------------------------------
* START-OF-SELECTION
*-----------------------------------------------------------------------------
START-OF-SELECTION.
PERFORM process.
*-----------------------------------------------------------------------------
* PROCESS
*-----------------------------------------------------------------------------
FORM process.
DATA: lv_name TYPE string,
lv_size TYPE i,
lv_data TYPE xstring,
lv_retcode TYPE i.
DATA: lt_file TYPE srmgs_bin_content.
" Hochladen der Datei
lv_name = p_fname.
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = lv_name
filetype = 'BIN'
IMPORTING
filelength = lv_size
CHANGING
data_tab = lt_file
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
MESSAGE 'Read file error!' TYPE 'E' DISPLAY LIKE 'S'.
ENDIF.
" Übertragen nach Hex String
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_size
IMPORTING
buffer = lv_data
TABLES
binary_tab = lt_file
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE 'Binary conversion error!' TYPE 'E' DISPLAY LIKE 'S'.
ENDIF.
PERFORM print USING p_prnds lv_data CHANGING lv_retcode.
IF lv_retcode EQ 0.
WRITE: / 'Print OK' COLOR COL_POSITIVE.
ELSE.
WRITE: / 'Print ERROR' COLOR COL_NEGATIVE.
ENDIF.
ENDFORM. " PROCESS
*-----------------------------------------------------------------------------
* PROCESS
*-----------------------------------------------------------------------------
FORM print USING iv_prndst TYPE rspopname
iv_content TYPE xstring
CHANGING ev_retcode TYPE i.
DATA: lv_handle TYPE sy-tabix,
lv_spoolid TYPE rspoid,
lv_partname TYPE adspart,
lv_globaldir TYPE text1024,
lv_dstfile TYPE text1024,
lv_filesize TYPE i,
lv_pages TYPE i.
CLEAR: ev_retcode.
" ADS Spoolauftrag öffnen
CALL FUNCTION 'ADS_SR_OPEN'
EXPORTING
dest = iv_prndst
doctype = 'ADSP'
copies = p_ncopi
immediate_print = p_immed
auto_delete = ' '
IMPORTING
handle = lv_handle
spoolid = lv_spoolid
partname = lv_partname
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
ev_retcode = 4.
RETURN.
ENDIF.
" ADS Spool Pfad ermitteln
CALL FUNCTION 'ADS_GET_PATH'
IMPORTING
ads_path = lv_globaldir.
CONCATENATE lv_globaldir '/' lv_partname '.pdf' INTO lv_dstfile.
" Übertragen der Daten in die neue Spoolfile
OPEN DATASET lv_dstfile FOR OUTPUT IN BINARY MODE.
IF sy-subrc NE 0.
ev_retcode = 4.
RETURN.
ENDIF.
TRANSFER iv_content TO lv_dstfile.
IF sy-subrc NE 0.
ev_retcode = 4.
RETURN.
ENDIF.
CLOSE DATASET lv_dstfile.
IF sy-subrc NE 0.
ev_retcode = 4.
RETURN.
ENDIF.
lv_pages = 1.
lv_filesize = xstrlen( iv_content ).
CALL FUNCTION 'ADS_SR_CONFIRM'
EXPORTING
handle = lv_handle
partname = lv_partname
size = lv_filesize
pages = lv_pages
no_pdf = ' '
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
ev_retcode = 4.
RETURN.
ENDIF.
" Spoolauftrag abschließen
CALL FUNCTION 'ADS_SR_CLOSE'
EXPORTING
handle = lv_handle
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
ev_retcode = 4.
RETURN.
ENDIF.
ENDFORM. " PRINT