# Belegnummerierungsstempel mit JavaScript erstellen



## Martob282 (22. Jan 2021)

Hallo zusammen

Vorab: Ich kenne mich mit programmieren nicht sonderlich gut aus und bin neu in diesem Forum. Sollte ich die Frage am falschen Ort erstellt haben, bitte ich um Verschiebung an den richtigen Ort. 

Zur Sache: Ich arbeite als Rechtsanwalt und bisher haben wir, wenn wir eine elektronische Eingaben gemacht haben, alle Beweisurkunden ausgedruckt und jeweils auf der ersten Seite mit einem physischen Stempel versehen, welcher die Belege für jede Eingabe fortlaufen von 1 aus nummeriert (Beleg 1, Beleg 2, Beleg 3 etc.). Anschliessend haben wir die durchnummerierte Belegsammlung als PDF eingescannt und elektronisch versendet. 

Ich möchte nun das ganze aber effizienter gestalten und mit JavaScript einen dynamischen PDF-Stempel erstellen, welcher jedesmal wenn gestempelt wird, eine höheren Wert ausgibt (d.h. Beleg 1, Beleg 2, Beleg 3 etc.), so dass ich, wenn ich ein PDF habe, in welchem sämtliche Belege zusammengefasst sind, jeweils auf der ersten Seite eines jeden Belegs einen Stempel anbringen kann und diese dann entsprechend als Beleg 1, Beleg 2, Beleg 3 etc. gekennzeichnet sind. Im Idealfall würde der Stempel auch seine Nummerierung ändern, wenn die bereits gestempelten Belege in der Reihenfolge vertauscht würden. Der Stempel müsste also zählen können, wie viele Stempel auf den Seiten vor ihm liegen, sodass sich die Nummerierung automatisch ändert, wenn die Reihenfolge der Belege ändert.

Meine Frage ist nun, ist sowas überhaupt möglich und kann mir jemand hier allenfalls weiterhelfen? 
Nach mehrstündiger Suche im Internet bin ich leider nicht fündig geworden und langsam am verzweifeln...


----------



## mihe7 (22. Jan 2021)

Grundsätzlich sollte das kein Problem darstellen, die Frage ist allerdings, wie genau der Ablauf ist/sein soll. Wenn Du von JavaScript schreibst (hat übrigens außer dem Namen nichts mit Java zu tun), kann das serverseitig gemeint sein, im Browser oder innerhalb einer PDF. Jedenfalls ließe sich da was bauen.


----------



## M.L. (22. Jan 2021)

Auch hallo,

für Manipulationen an pdf-Dateien kann man sich z.B. PHP anschauen: https://kiosk.entwickler.de/php-magazin/php-magazin-6-2020/pdfrepro-fuer-php-als-pdf-saas/  (dort wird u.a auf https://www.pdfrepro.de/ hingewiesen)


----------



## httpdigest (22. Jan 2021)

Oder (für Java) Apache PDFBox: https://www.tutorialspoint.com/pdfbox/pdfbox_inserting_image.htm

Was allerdings aktuell in der Anfrage noch nicht rüberkam: Sind die Quelldokumente (die, in welche Stempel/Bilder eingefügt werden sollen) auch im PDF Format (also, ohne sie vorher auszudrucken und als PDF einzuscanne, versteht sich)?


----------



## mrBrown (22. Jan 2021)

M.L. hat gesagt.:


> für Manipulationen an pdf-Dateien kann man sich z.B. PHP anschauen: https://kiosk.entwickler.de/php-magazin/php-magazin-6-2020/pdfrepro-fuer-php-als-pdf-saas/ (dort wird u.a auf https://www.pdfrepro.de/ hingewiesen)


Wie kommt man denn, wenn jemand eine Frage zu JavaScript in einem Java-Forum postet, auf PHP?


----------



## mihe7 (22. Jan 2021)

mrBrown hat gesagt.:


> Wie kommt man denn, wenn jemand eine Frage zu JavaScript in einem Java-Forum postet, auf PHP?


LOL, wobei es ja gefühlt 3 Mrd. Möglichkeiten gibt. Neben praktisch allen Programmiersprachen, gibt es ja auch fertige Programme oder auch Utilities für die Befehlszeile usw. Das ist nicht m. E. auch nicht das Problem, vielmehr stellt sich mir die Frage, warum ausgerechnet nach JavaScript gefragt wurde und wie der Workflow aussehen soll. Evtl. läuft da auch irgendeine scriptfähige Software von Adobe. Man weiß es nicht


----------



## M.L. (23. Jan 2021)

mrBrown hat gesagt.:


> Wie kommt man denn, ..., auf PHP?


Durch Lektüre (bzw. Überfliegen) des genannten Artikels im Entwickler Magazin (EM 01/2021). Aufgrund des Zielpublikums (Jurist) kann man wohl abschätzen das schlüsselfertige Lösungen aufgeführt werden wollen, die auf Knopfdruck einsatzbereit sind.


----------



## Martob282 (25. Jan 2021)

Hallo Zusammen
Besten Dank für eure überraschend schnellen Antworten. Wie gesagt meine Kenntnis in dem Bereich sind äusserst bescheiden. Meine Idee wäre, dass ich sämtliche PDF-Belege (z.B. eingescannter Arbeitsvertrag, Vollmacht, Kündigungsschreiben, Arbeitszeugnis etc.) in einem PDF zusammenfasse und danach mit dem Programm PDF-XChange Editor die Belegsammlung durchgehe und jeweils die erste Seite eines jeden Belegs stemple. Dabei sollte eine fortlaufende Nummerierung, beginnend bei 1, entstehen. Der Grund, weswegen ich spezifisch nach JavaScript gefragt habe, ist, dass sich beim PDF Programm XChange Editor mit JavaScript dynamische Stempel "programmieren" lassen.

Die Quelldokumente sind meist physische Belege, welche eingescannt wurden. Mit der zunehmenden Digitalisierung im Rechtswesen kann es aber vorkommen, dass auch künftig vermehrt beispielsweise elektronisch signierte PDF's gestempelt werden müssten.  

Ich hoffe, es ist damit etwas verständlicher, was ich so umständlich zu beschreiben versuche! Sorry...


----------



## mihe7 (25. Jan 2021)

Martob282 hat gesagt.:


> Meine Idee wäre, dass ich sämtliche PDF-Belege (z.B. eingescannter Arbeitsvertrag, Vollmacht, Kündigungsschreiben, Arbeitszeugnis etc.) in einem PDF zusammenfasse und danach mit dem Programm PDF-XChange Editor die Belegsammlung durchgehe und jeweils die erste Seite eines jeden Belegs stemple.


Keine gute Idee, in dem Fall müsste die Anwendung mühselig und fehleranfällig herausfinden, wo ein neuer Beleg beginnt. Gegenvorschlag: je Beleg ein Scan, den in ein Verzeichnis legen und das Programm stempelt die erste Seite einer jeden PDF-Datei im Verzeichnis. 



Martob282 hat gesagt.:


> Mit der zunehmenden Digitalisierung im Rechtswesen kann es aber vorkommen, dass auch künftig vermehrt beispielsweise elektronisch signierte PDF's gestempelt werden müssten.


Eine signierte PDF zu verändern dürfte nicht möglich sein. Hier könnte man sich überlegen, das PDF zu rendern, dieses zu stempeln und das Original ins PDF als Anhang einzubinden und ggf. selbst zu signieren (eine Art digitale, beglaubigte Kopie). Für einen echten Lösungsvorschlag müsste ich mich aber erst im Detail damit beschäftigen.


----------



## Martob282 (26. Jan 2021)

Wow, tausend Dank für deine wiederum äusserst prompte Rückmeldung. 



mihe7 hat gesagt.:


> Keine gute Idee, in dem Fall müsste die Anwendung mühselig und fehleranfällig herausfinden, wo ein neuer Beleg beginnt. Gegenvorschlag: je Beleg ein Scan, den in ein Verzeichnis legen und das Programm stempelt die erste Seite einer jeden PDF-Datei im Verzeichnis.


Leider müssen sämtliche Belege als *ein* PDF eingereicht werden. Der Stempel soll auch nicht automatisch angebracht werden. Vielmehr wähle ich den Standort bei jedem Stempelvorgang einzeln aus. Dies ist deshalb erforderlich, weil jeder Beleg verschieden ist und keine wichtigen Informationen mit dem Stempel abgedeckt  werden dürfen. Der Vorgang muss also nicht vollständig automatisiert werden, vielmehr wähle ich den Standort manuell (wie bis anhin bei den physischen Beilagen) aus, an welchem der Stempel angebracht werden soll.



mihe7 hat gesagt.:


> Eine signierte PDF zu verändern dürfte nicht möglich sein. Hier könnte man sich überlegen, das PDF zu rendern, dieses zu stempeln und das Original ins PDF als Anhang einzubinden und ggf. selbst zu signieren (eine Art digitale, beglaubigte Kopie). Für einen echten Lösungsvorschlag müsste ich mich aber erst im Detail damit beschäftigen.



Mir geht es nicht darum, das PDF inhaltlich zu verändern, sondern vielmehr wie bei einem physischen Beleg, einen Nummerierungsstempel "draufzuhauen". Viele PDF-Programme bieten dazu die Funktion "Anmerkungen". Damit kann man auf die PDF's draufschreiben ohne deren Inhalt zu verändern (analog wie beim Papierausdruck, welcher mit handschriftlichen Notizen versehen wird). Darin enthalten ist auch eine Stempelpalette, welche einen dynamische Stempel, basieren auf JavaScript zulässt. 

Diese Möglichkeit würde ich gerne verwenden, um auf diese Art einen elektronischen Belegstempel zu erhalten, der in der Anwendung gleich funktioniert wie ein Papierstempel, d.h. jeweils Seite und Standort auswählen, auf welcher bzw. an welchem gestempelt werden soll und stempeln bzw. klicken. Das einzige was automatisch passieren soll, ist die Erhöhung der Nummer, welche gestempelt wird.

Im Internet finden sich zahlreiche Anleitungen (vgl. z.B. https://www.pdf-xchange.de/ekurseditor6/dynamische-stempel.php), wie man auf diese Art und Weise einen Datumsstempel erstellt. Den Quelltext für einen Nummerierungsstempel habe ich bis jetzt nirgends finden können, weswegen ich mich in meiner Unkenntnis an euch Spezialisten gewendet habe. 

Könnt ihr mir da weiterhelfen?


----------



## mihe7 (26. Jan 2021)

Martob282 hat gesagt.:


> Leider müssen sämtliche Belege als *ein* PDF eingereicht werden.


Das wäre nicht das Problem, da man die PDFs im Nachhinein zusammenführen kann, allerdings hat sich die Sache mit


Martob282 hat gesagt.:


> Der Stempel soll auch nicht automatisch angebracht werden.


auch schon wieder erledigt 



Martob282 hat gesagt.:


> Mir geht es nicht darum, das PDF inhaltlich zu verändern, sondern vielmehr wie bei einem physischen Beleg, einen Nummerierungsstempel "draufzuhauen".


Wenn man Annotations an signierten PDFs anbringen kann, wie Du schreibst, ist das natürlich eine Lösung. Wie gesagt, das sind Details, die ich mir erst ansehen müsste, da ich auch in der Arbeit mit signierten PDFs nichts zu tun habe.



Martob282 hat gesagt.:


> Den Quelltext für einen Nummerierungsstempel habe ich bis jetzt nirgends finden können


Wenn ich Dich richtig verstanden habe, soll in jeder PDF die Nummerierung von vorne beginnen. Du kannst mal folgendes probieren:

```
event.value = "" + (doc.getAnnots() != null ? doc.getAnnots().length+1 : 1)
```


----------



## Martob282 (26. Jan 2021)

Vielen Dank für deine Unterstützung.



mihe7 hat gesagt.:


> Wenn man Annotations an signierten PDFs anbringen kann, wie Du schreibst, ist das natürlich eine Lösung. Wie gesagt, das sind Details, die ich mir erst ansehen müsste, da ich auch in der Arbeit mit signierten PDFs nichts zu tun habe.


Das funktioniert. Habe es mit anderen (nicht dynamischen) Stempel bereits versucht.



mihe7 hat gesagt.:


> Wenn ich Dich richtig verstanden habe, soll in jeder PDF die Nummerierung von vorne beginnen.


Ja, das ist richtig.



mihe7 hat gesagt.:


> ```
> event.value = "" + (doc.getAnnots() != null ? doc.getAnnots().length+1 : 1)
> ```


Der Code funktioniert leider nicht bzw. gibt kein Ergebnis im Textfeld aus. Muss ich noch zusätzlich etwas eingeben - wie bereits erwähnt: Ich bin eigentlich in einem anderen Fachgebiet zu Hause. 🙃

Eine kleine Ergänzung noch: Es wäre schön, wenn nicht einfach die Zahl ausgegeben würde, sondern mit "Beleg" und dann die Zahl, d.h. Beleg 1, Beleg 2 usw.


----------



## mihe7 (26. Jan 2021)

Das war auch nur mal ins Blaue hinein. Probier einfach mal

```
event.value = "Beleg";
```
Das sollte zumindest "Beleg" ausgeben.


----------



## Martob282 (26. Jan 2021)

mihe7 hat gesagt.:


> Das war auch nur mal ins Blaue hinein. Probier einfach mal
> 
> ```
> event.value = "Beleg";
> ...


Das funktioniert schon mal


----------



## mihe7 (26. Jan 2021)

OK, dann probieren wir mal was anderes 


```
event.value = "Beleg " + event.source.source.documentFileName;
```


----------



## Martob282 (26. Jan 2021)

Das scheint wieder nicht zu funktionieren. Es wird nur "Beleg" ausgegeben... :-/


----------



## mihe7 (26. Jan 2021)

OK, probier mal event.source.documentFileName und event.source.source.source.documentFileName. Irgendwo sollte mal was rauskommen.


----------



## Martob282 (26. Jan 2021)

Klappt leider nicht. Es kommt stets nur "Beleg" raus.


----------



## mihe7 (26. Jan 2021)

OK, dann schau ich später mal, ob es noch andere Möglichkeiten gibt. Hintergrund ist: wir brauchen einen globalen Speicherplatz, um die Nummer zwischen dem Stempeln zwischenzuspeichern und hochzählen zu können.


----------



## Martob282 (26. Jan 2021)

Okay, tausend Dank schon mal für deine Unterstützung!


----------



## mihe7 (27. Jan 2021)

OK, nach einiger Recherche, bin ich auf https://answers.acrobatusers.com/Dynamica-Counting-Stamps-q134170.aspx gestoßen, versuch mal folgendes:

```
if (event.source.forReal) {
    var d = event.source.source;
    if(typeof(d.belegNr) == "undefined") {
        d.belegNr = 0;
    }

    d.belegNr++;
    event.value = "Beleg " + d.belegNr;
}
```


----------



## Martob282 (27. Jan 2021)

Wow, es funktioniert...  Tausend Dank für deine tolle Unterstützung. 👏🙌😊


----------



## mihe7 (27. Jan 2021)

Das ist ggf. noch nicht ganz optimal, weil der Name des Stempels nicht überprüft wird. Aber, so lange es funktioniert


----------



## Martob282 (28. Jan 2021)

mihe7 hat gesagt.:


> Das ist ggf. noch nicht ganz optimal, weil der Name des Stempels nicht überprüft wird. Aber, so lange es funktioniert


Das verstehe ich leider nicht ganz. Wie meinst du das?


----------



## mihe7 (28. Jan 2021)

Martob282 hat gesagt.:


> Das verstehe ich leider nicht ganz. Wie meinst du das?


Ich zitiere:


			
				https://acrobatusers.com/tutorials/print/dynamic_stamp_secrets/ hat gesagt.:
			
		

> The forReal property is true when any stamp in the Stamp File is being placed on the document and false at all other times. This property narrows things down, but we need one more property to uniquely identify the situation when our particular stamp is being placed. The stampName property identifies the stamp in current use. Both of these properties must be used together to qualify stamp code that performs any kind of blocking operation, such as displaying a popup dialog.


----------



## Martob282 (28. Jan 2021)

Verstehe ich das richtig, dass das Problem darin besteht, dass der Zähler des Stempels auch mitzählt, wenn ein anderer Stempel zwischendurch verwendet wird?

Dies wäre nämlich nur halb so schlimm, da ich nicht vorhabe, auf den Belegen noch weitere Stempel anzubringen.


----------



## mihe7 (29. Jan 2021)

Martob282 hat gesagt.:


> Verstehe ich das richtig, dass das Problem darin besteht, dass der Zähler des Stempels auch mitzählt, wenn ein anderer Stempel zwischendurch verwendet wird?


Soweit ich das sehe: immer, wenn die Formularfelder des PDFs neu berechnet werden. Das wäre z. B. auch der Fall, wenn das PDF ein Formular enthält und sich dort ein Wert z. B. per Benutzereingabe ändert.


----------

