Sie sind auf Seite 1von 10

1

PDF-Merging
Voraussetzung, Implementierung und
Anwendungsbeispiele

28. September 2017 M.Sc. Torsten Gollhardt


2

Inhaltsverzeichnis:

1 AUSGANGSLAGE .................................................................................................................................... 3
2 ABGRENZUNG ......................................................................................................................................... 4
2.1 ABGRENZUNG ZU ZUGFERD .................................................................................................................................... 4
2.2 ABGRENZUNG ZU BUNDLING & STITCHING .................................................................................................................. 4
3 VORAUSSETZUNG .................................................................................................................................. 4
4 IMPLEMENTIERUNG................................................................................................................................ 4
5 NACHVERARBEITUNG ............................................................................................................................ 5
5.1 DRUCK (SPOOL) ..................................................................................................................................................... 5
5.2 MAIL ................................................................................................................................................................... 5
5.3 ARCHIVIERUNG ...................................................................................................................................................... 6
6 ANWENDUNGSSZENARIEN ................................................................................................................... 6
6.1 PARALLELISIERUNG ................................................................................................................................................. 6
6.2 GROßE DOKUMENTE............................................................................................................................................... 6
7 FAZIT ......................................................................................................................................................... 6
8 CODE-BEISPIELE .................................................................................................................................... 7
8.1 DRUCKEN (SPOOL) ................................................................................................................................................. 7
8.2 ERMITTLUNG DER GESAMTSEITENZAHL ....................................................................................................................... 9
9 ANSPRECHPARTNER ........................................................................................................................... 10
3

1 Ausgangslage
Die PDF-Ausgabe ist zugegebenermaßen in den seltensten Fällen die zentrale Aufgabe
einer Software bzw. eines Softwaremoduls, dennoch ist diese Funktionalität zumindest in
der betriebswirtschaftlichen Anwendungsentwicklung unabdingbar. Am Ende eines
Geschäftsprozesses muss eben doch irgendwas gedruckt, gemailt oder archiviert werden.
PDF-Merging ist keine primäre Funktion. Allerdings kann diese Funktionalität beim
Software-Feinentwurf vergessen oder unterschätzt werden. Im worst case kann es aber
auch vorkommen, dass erst bei der Implementierung oder ganz und gar nach Go-Live
deutlich wird, dass PDF-Merging benötigt wird. Dies kann u. a. der Fall sein, wenn die zu
verarbeitende Datenmenge ungeplant wächst.
Für die Umsetzung stehen mehrere Möglichkeiten zur Verfügung. Eine Möglichkeit ist die
Verwendung von Fremdsoftware wie bspw. PDFtk von PDF Labs. Eine weitere Möglichkeit
ist die von SAP bereitgestellte native Technologie, um PDF zusammenzufügen. Hierzu hat
SAP bereits 2016 einen entsprechenden Hinweis veröffentlicht.
Im Folgenden soll das native PDF-Merging mit SAP genauer erklärt werden. Abgesehen
von den technologischen Voraussetzungen und der Implementierung per se werden auch
Möglichkeiten zur Nachverarbeitung und denkbare Anwendungsszenarien erläutert.
Abschließend sind zwei Code-Beispiele zu finden. Im ersten Beispiel wird erläutert, wie eine
zusammengefügte PDF in den Spool gedruckt werden kann. Das zweite Beispiel zeigt, wie
aus einer zusammengefügten PDF die Gesamtseitenzahl ausgelesen werden kann.
4

2 Abgrenzung

2.1 Abgrenzung zu ZUGFeRD


Zunächst sollte eines klar sein: Beim PDF-Merging geht es nicht vordergründig um
ZUGFeRD. Die Themen schließen sich nicht gegenseitig aus, aber das eine Thema bedingt
nicht unmittelbar das andere. Bei einer ZUGFeRD-Rechnung wird eine ZUGFeRD-
konforme XML an eine visuelle Rechnung in Form einer PDF gehangen. Die fertige
Rechnung enthält folglich ein visuelles Layout und ein maschinenlesbares Pendant. Die
Verheiratung der beiden Teile wird über die Klasse CL_FP_CONV_PDFA ausgelöst und
findet auf dem ADS (Adobe Document Service) statt. Für weitere Informationen zum Thema
ZUGFeRD soll an dieser Stelle auf unsere entsprechende Technologie-Übersicht verwiesen
werden.

2.2 Abgrenzung zu Bundling & Stitching


Ein weiterer verwandter Aspekt ist die PDF-Bündelung. Diese wird relevant, wenn sehr
große Dokumente mit mehr als 1000 Seiten erzeugt werden sollen. SAP gibt für Adobe
Interactive Forms eine Limitierung von 1000 bzw. 2000 Seiten an. Über diese Limitierung
hinaus ist es möglich, Dokumente mit einer Bundling & Stitching-Logik zu prozessieren. Die
einzelnen Pakete werden dabei über den ADS verarbeitet und beim FP_JOB_CLOSE
ebenfalls auf dem ADS zusammengefügt. Jedoch hat auch diese Technologie eine Grenze,
die irgendwo zwischen 2000 und 3000 Seiten liegen muss. Sollen Dokumente jenseits
dieser Grenze prozessiert werden, kann PDF-Merging verwendet werden.

3 Voraussetzung
Weil das Merging im Gegensatz zu ZUGFeRD und PDF-Bündelung nicht auf ADS (Java-
Stack) sondern auf dem ABAP-Stack im SAP Kernel durchgeführt wird, ist es in
Abhängigkeit vom Patchstand möglich, dass ein Kernel-Patch notwendig ist. Ferner muss
der o. g. Hinweis 2264208 eingespielt werden, der die Klasse CL_RSPO_PDF_MERGE und
den dazugehörigen Test-Report RSPO_TEST_MERGE_PDF_FILES bereitstellt.
Problematisch ist in der Regel der Kernel-Patch, da ein solches Upgrade je nach Release-
Strategie nicht ohne Weiteres und vor allem nicht spontan durchgeführt werden kann. Wenn
diese beiden Voraussetzungen erfüllt sind, kann das PDF-Merging implementiert werden.

4 Implementierung
Wichtig ist, dass die Adobe Forms Formulare so verarbeitet werden, dass diese nicht direkt
ausgegeben, sondern lediglich als xstring zurückgegeben werden. Dieses Verhalten kann
5

beim Starten des Spooljobs über den Parameter getpdf erzwungen werden. Die einzelnen
Pakete können in einer internen Tabelle (im Folgenden beispielhaft xstring_tab genannt)
gesammelt werden.
Zu Beginn muss das Objekt der Merger-Klasse instanziiert werden:
TRY.
DATA(lo_pdf_merger) = NEW cl_rspo_pdf_merge( ).
CATCH cx_rpso_pdf_merge.
ENDTRY.

Dann können die einzelnen xstrings an das Objekt übergeben werden:


LOOP AT xstring_tab ASSIGNING FIELD-SYMBOL(<lfs_xstring>).
lo_pdf_merger->add_document( <lfs_xstring> ).
ENDLOOP.

Danach werden die angefügten xstrings zu einem xstring gemergt:


lo_pdf_merger->merge_documents( IMPORTING merged_document = DATA(lw_merged) ).

5 Nachverarbeitung

5.1 Druck (Spool)


Um den xstring an den SAP-Spool zu übertragen, sind die folgenden vier Funktions-
bausteine notwendig:
ADS_SR_OPEN
ADS_WRITE_TO_FILE
ADS_SR_CONFIRM
ADS_SR_CLOSE
Das Ergebnis ist ein SAP-Spool inkl. Vorschau. Wie bei einem normalen Spool-Prozess
können Drucker, Spoolname, Sofortdruck-Flag etc. über die Spool-Parameter mitgegeben
werden.

5.2 Mail
Für den Mailversand kann die Klasse CL_BCS verwendet werden. Die gemergte PDF in
Form eines xstring kann nach Umwandlung in den Datentyp SOLIX_TAB an die Mail
angefügt werden. Die PDF erscheint nach Versenden wie gewohnt als Mail-Anhang.
6

5.3 Archivierung
Für die Archivierung des zusammengefügten Dokuments kann der Funktionsbaustein
ARCHIV_CREATE_OUTGOINGDOC_MULT verwendet werden, der auch beim normalen
Spool-Prozess verwendet wird. Wichtig hierbei ist nur, dass die Archivierungsparameter
(TOA_DARA) entsprechend gefüllt werden.

6 Anwendungsszenarien

6.1 Parallelisierung
Ein möglicher Anwendungsfall ist das Zusammenfügen einzelner Dokumente, die in
asynchron aufgerufenen Funktionsbausteinen erstellt werden. Insbesondere wird das PDF-
Merging interessant, wenn garantiert werden muss, dass die Dokumente in der richtigen
Reihenfolge gedruckt werden, auch wenn die Prozesse in unbestimmter Reihenfolge
ablaufen und enden. In diesem Fall können die Dokumente in einer internen Tabelle
zusammen mit einer Tasknummer gesammelt, entsprechend sortiert, zusammengefügt und
abschließend ausgegeben werden.

6.2 Große Dokumente


Ein weiterer Anwendungsfall ist die Prozessierung extrem großer Dokumente. PDF-Merging
wird hierbei ab einem Umfang von ca. 1000 Seiten, neben der Alternative Bundling &
Stitching, interessant sowie in Abhängigkeit der Formular-Komplexität ab 2000 bis 3000
Seiten zwingend notwendig. Das Formular bzw. seine Bestandteile (Kopfbereich,
Summenzeilen etc.) müssen für die paketweise Verarbeitung angepasst werden. Weil es
nun nicht mehr ausreicht, Informationen wie "erste/letzte Seite" abzufragen, müssen weitere
Kontrollflags wie "erstes/letztes Paket" übergeben und per Scripting passend darauf reagiert
werden.

7 Fazit
Wenn alle Voraussetzungen für das native PDF-Merging erfüllt sind, ist die Implementierung
relativ einfach. Herausforderungen können danach nur noch je nach Anwendungsfall bei
der Nachverarbeitung auftreten. Besonders hinter vermeintlich einfachen Anforderungen,
wie der Ermittlung der Gesamtseitenzahl, verstecken sich zusätzliche Aufwände und deren
Umsetzung ist keinesfalls trivial. Dennoch ist das PDF-Merging eine bequeme Alternative
zu Bundling & Stitching, welches letzten Endes auch nur als technologischer Workaround
zu betrachten war. Abgesehen davon lassen sich mit PDF-Merging bisherige techno-
logische Hürden überwinden und interessante Anwendungsszenarien umsetzen.
7

8 Code-Beispiele

8.1 Drucken (Spool)


DATA: lw_handle TYPE syst_tabix,
lw_partname TYPE adspart,
lw_filename TYPE char256,
lw_spoolid TYPE rspoid,
lw_pages TYPE i,
lw_size TYPE i.

CALL FUNCTION 'ADS_SR_OPEN'


EXPORTING
dest = p_ldest
doctype = 'ADSP'
IMPORTING
handle = lw_handle
spoolid = lw_spoolid
partname = lw_partname
EXCEPTIONS
device_missing = 1
no_such_device = 2
operation_failed = 3
wrong_doctype = 4
wrong_devicetype = 5
OTHERS = 6.

IF SY-SUBRC <> 0.
“error handling
ENDIF.

CONCATENATE lw_partname '.pdf' INTO lw_filename.

CALL FUNCTION 'ADS_WRITE_TO_FILE'


EXPORTING
filename = lw_filename
buffer = lw_merged
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 <> 0.
“error handling
ENDIF.
8

CALL FUNCTION 'ADS_SR_CONFIRM'


EXPORTING
handle = lw_handle
partname = lw_partname
size = lw_size
pages = lw_pages
EXCEPTIONS
handle_not_valid = 1
operation_failed = 2
OTHERS = 3.

IF SY-SUBRC <> 0.
“error handling
ENDIF.

CALL FUNCTION 'ADS_SR_CLOSE'


EXPORTING
handle = lw_handle
final = abap_true
EXCEPTIONS
handle_not_valid = 1
operation_failed = 2
OTHERS = 3.

IF SY-SUBRC <> 0.
“error handling
ENDIF.

ENDIF.
9

8.2 Ermittlung der Gesamtseitenzahl


DATA: lw_cont TYPE string,
lw_lines TYPE i,
lw_pages TYPE numc5,
lw_temp TYPE string,
lw_filesize TYPE i,

li_result TYPE match_result_tab,


li_bin TYPE TABLE OF x.

CLEAR li_bin.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = iw_xstring
IMPORTING
output_length = lw_filesize
TABLES
binary_tab = li_bin.
CALL FUNCTION 'SCMS_BINARY_TO_STRING'
EXPORTING
input_length = lw_filesize
IMPORTING
text_buffer = lw_cont
TABLES
binary_tab = li_bin
EXCEPTIONS
failed = 1
OTHERS = 2.

FIND ALL OCCURRENCES OF REGEX '/count ([1234567890]{1,4})'


IN lw_cont IGNORING CASE RESULTS li_result.
IF sy-subrc <> 0.
FIND REGEX '/N ([1234567890]{1,5})'
IN lw_cont IGNORING CASE RESULTS li_result.
ENDIF.
lw_lines = lines( li_result ).
IF lw_lines IS NOT INITIAL.
READ TABLE li_result ASSIGNING FIELD-SYMBOL(<lfs_result>) INDEX lw_lines.
IF sy-subrc = 0.
READ TABLE <lfs_result>-submatches
ASSIGNING FIELD- SYMBOL(<lfs_subm>) INDEX 1.
IF sy-subrc = 0.
lw_temp = lw_cont+<lfs_subm>-offset(<lfs_subm>-length).
CONDENSE lw_temp NO-GAPS.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lw_temp
IMPORTING
output = lw_pages.
rw_pages = lw_pages.
ENDIF.
ENDIF.
ENDIF.
10

9 Ansprechpartner
Jeremia Girke
Haben Sie Anregungen oder Rückfragen, freue ich mich auf
Ihre Anfrage.
Sie erreichen mich im Büro unter 0521 560645 115 oder
mobil
unter der Nummer 0160- 96387177 sowie per Mail:
girke@mind-forms.de

Leiter MINDFORMS Jeremia Girke


mindsquare - we love IT

http://mind-forms.de
Auf unserer Website finden Sie unser Angebot, Know How und
interessante Artikel unseres Teams rund um das Thema
Formulare.