PDF Druck mit mehreren Parts

Die Aufgabenstellung des Kunden bestand darin, dass ein Druck einer Auftragsbestätigung ausgegeben werden sollte. Im Anschluss sollten im DMS abgelegte PDF Dokumente mit ausgegegeben werden.

Der erste Ansatz führte daher über die Funktionsbausteine CV120_DOC_CHECKOUT_VIEW und CV120_START_APPLICATION. Diese wurden nach dem Druck der AB angestoßen und führten dazu, dass die PDF Dokumente im Adobe Reader angezeigt und gedruckt werden konnten.

Dies war zum Einen sehr arbeitsintensiv für die Anwender, zum anderen war so nicht die Reihenfolge der Ausdrucke garantiert, da die Ausgabe auf einem Netzwerkdrucker erfolgen sollte.

Es musste also eine andere Lösung her. *hirn* *hirn* *google* *google*

Der zweite Ansatz führte zum Erfolg. Es musste ein PDF-Spoolauftrag erzeugt werden, der alle zu druckenden Dokumente aufnimmt. Vorraussetzung hierfür ist natürlich der Adobe Document Service. Nach etlichen Tagen war es dann vollbracht.

  • Die Dokumente wurden gelesen.

*———————————————————————-
* Dokumentendatei lesen
*———————————————————————-

CALL FUNCTION ‚CV120_KPRO_MASTER_DATA_GET‘
EXPORTING
pf_dokar            ls_drawdokar
pf_doknr            ls_drawdoknr
pf_dokvr            ls_drawdokvr
pf_doktl            ls_drawdoktl
*         PF_ACTIVE_ONLY      = ‚ ‚
*         PF_ACTIVE_ATTR_ONLY = ‚ ‚
*         PF_COMP_GET         = ‚X‘
TABLES
ptx_data            lt_dms_tbl_file
EXCEPTIONS
not_found           1
error               2
OTHERS              3.
IF sysubrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

 

  • Die Daten der Dokumente wurden geladen.

*———————————————————————-
* Daten des Dokuments laden
*———————————————————————-
CLEAR ls_phio_object.

SELECT SINGLE phio_id ph_class INTO (ls_phio_objectobjid ,ls_phio_objectclass)
FROM dms_ph_cd1
WHERE loio_id ls_dms_phiolo_objid.

DATA:lv_xstr TYPE xstring,
ls_xmlr TYPE sdokcntbin,
lo_conv TYPE REF TO cl_abap_conv_obj.

DATA lt_file_info TYPE TABLE OF sdokfilaci.
DATA ls_file_info TYPE sdokfilaci.

CALL FUNCTION ‚SDOK_PHIO_LOAD_CONTENT‘
EXPORTING
object_id           ls_phio_object
client              symandt
TABLES
file_content_binary lt_file_content_binary
file_access_info    lt_file_info
EXCEPTIONS
not_existing        1
not_authorized      2
no_content          3
bad_storage_type    4
OTHERS              5.

 

  • Größe und Name ermitteln / Daten konvertieren

*———————————————————————-
* Größe des Dokuments ermitteln
*———————————————————————-
ls_dms_pdfstrattsize ls_file_infofile_size.

CREATE OBJECT lo_conv.
LOOP AT lt_file_content_binary INTO ls_xmlr.
CALL METHOD lo_conv->convert
EXPORTING
inbuff    ls_xmlr
outbufflg 25000
IMPORTING
outbuff   lv_xstr.
CONCATENATE lv_xstring lv_xstr INTO lv_xstring IN BYTE MODE.
ENDLOOP.

*———————————————————————-
* Daten des Dokuments in XSTRING konvertieren
*———————————————————————-
CALL METHOD cl_bcs_convert=>xstring_to_solix
EXPORTING
iv_xstring lv_xstring
RECEIVING
et_solix   ls_dms_pdfstrsolixtab.

*———————————————————————-
* Name des Dokuments ermitteln
*———————————————————————-
SELECT SINGLE filename
INTO ls_dms_pdfstratttitle
FROM dms_doc_files
WHERE dokar ls_drawdokar
AND  doknr ls_drawdoknr
AND  dokvr ls_drawdokvr
AND  doktl ls_drawdoktl.

APPEND ls_dms_pdfstr TO e_dms_pdftab.

Dann musste das alles noch in den PDF Spoolauftrag gepackt werden:

************************************************
* ADS Spoolauftrag öffnen
************************************************
CALL FUNCTION ‚ADS_SR_OPEN‘
EXPORTING
dest             nastldest
*     ldest            = nast-ldest
name             nastdsnam
suffix1          nastdsuf1
suffix2          nastdsuf2
copies           lv_copies
immediate_print  nastdimme
auto_delete      nastdelet
titleline        nasttdcovtitle
receiver         nasttdreceiver
division         nasttddivision
authority        nasttdautority
append           abap_true
lifetime         ‚8‘
doctype          ‚ADSP‘
IMPORTING
handle           lv_handle
spoolid          lv_spoolid
partname         lv_partname
EXCEPTIONS
device_missing   1
no_such_device   2
operation_failed 3
wrong_doctype    4
wrong_devicetype 5
OTHERS           6.
IF sysubrc NE 0.
ev_retcode 4.
RETURN.
ENDIF.

CONCATENATE lv_partname ‚.pdf‘ INTO lv_filename.

 

 

* PDF in Spool schreiben
CALL FUNCTION ‚ADS_WRITE_TO_FILE‘
EXPORTING
filename                     lv_filename
buffer                       lv_xstring
append                       ‚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 sysubrc NE 0.
ev_retcode 4.
RETURN.
ENDIF.

* PDF Größe ermitteln
CLEARlv_sizelv_pageslv_new_partname.
lv_size     xstrlenlv_xstring ).
lv_pages    gv_resulttdpages.

** ADS_CREATE_PDF_SPOOLJOB
*      lv_total_pages = lv_total_pages + lv_pages.

* Schreiben einer Zeile in einen offenen ADS Spoolauftrag
CALL FUNCTION ‚ADS_SR_CONFIRM‘
EXPORTING
handle           lv_handle
partname         lv_partname
size             lv_size
pages            lv_pages
IMPORTING
new_partname     lv_new_partname
EXCEPTIONS
handle_not_valid 1
operation_failed 2
OTHERS           3.
IF sysubrc NE 0.
ev_retcode 4.
RETURN.
ENDIF.

CONCATENATE lv_new_partname ‚.pdf‘ INTO lv_filename.
lv_partname lv_new_partname.

 


CALL FUNCTION ‚ADS_SR_CLOSE‘
EXPORTING
handle lv_handle
final  ‚X‘
EXCEPTIONS
OTHERS 1.

 

 

Die Spooldatei mit mehreren Dokumenten konnte erfolgreich ausgegeben werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.