===== Drucken einer Unterschrift ===== ==== Anforderung ==== In einem Dokument soll an einer von der Nutzung des Blattes abhängigen Stelle die elektronische Unterschrift des jeweiligen Sachbearbeiters plaziert werden. Grundlage für dieses Beispiel sind die Formulare 'Angebot einzelne Seite mit Bildern' und 'Angebot einzelne Seite variable Tabelle' aus der Beispielinstallation. Das gewünschte Ergebnis soll in etwa wie folgt aussehen (Ausschnitt): {{print2forms:tips:0003-3.GIF}} ==== Realisierung ==== Grundvoraussetzung für das Drucken der Unterschriften ist, daß sich die Bilder der Unterschriften im Zugriff des (p2f)-Systems befinden. Im hier vorliegenden Beispiel sind die Unterschriften als Ressourcen in einem speziellen Subcontainer mit dem Namen '**Unterschriften**' hinterlegt. Die Unterschriften liegen aber nicht direkt in diesem Subcontainer, sondern sind erst in einem weiteren Subcontainer abgelegt. Der Name dieses Subcontainers entspricht dem Namen des Benutzers, der die Ausdrucke erzeugen soll (nicht mit dem Benutzer im (p2f)-System zu verwechseln!). Auf diese Weise kann ein Zugriffskonzept realisiert werden, das den einzelnen Benutzern des Formulars nur Zugriff auf die Unterschriften in ihrem Subcontainer erlaubt. {{print2forms:tips:0003-4.GIF}} Zur Realisation der Anforderung wird im hier verwendeten Formular '**Angebot einzelne Seite mit Bildern**' ein **Textfeld** und ein **Ressourcenfeld** benötigt (existente Felder 'Sachbearbeiter' und '**Unterschrift**'). Die Aufgabe des Textfeldes ist es, den Namen des Sachbearbeiters aus den Nutzdaten zu ermitteln. Das Ressourcenfeld druckt dann eine Ressource, die das Bild der Unterschrift des gefundenen Sachbearbeiters enthält. Die beiden Felder sind wie folgt definiert: {{print2forms:tips:0003-1.GIF}} Das Textfeld ermittelt mit dem Feldindex '**0104290000**' und dem Vergleichsmuster '**.{59}@r. (.*)**' den Namen des Sachbearbeiters. Um das Muster besser zu verstehen hier ein Ausschnitt der Indexdatei des Beispieldatenstroms: [p2f] [Param]1.0;10.1.17.7;03.00.08 15:26:50 [Computer]thinkcentre.spe-gmbh.de [User]Meier [Model]P2F LaserJet 5 [Job]Sample 10 [JobNo] ... [0102C10000] 00018/4 [0103390000] 1704 [0103750000] Kunde AG [0103B10000] z. Hd. Hr. X. Kunde 346-57897 [0104290000] Kundengasse 19 Hr. G. Muster [0104650000] D-48535 Kundendorf [0104A10000] 01.01.2007 [0105190000] 31.01.2007 [0105CD0000] [0106090000] [0106450000] 1 SK20F1 Scart Kabel, high quality 9.99€ 8.88€ 7.77€ [0106810000] 1 x Scartstecker auf 1 x Scartstecker (21 pin), [0106AE0000] transparentes Kabel mit vergoldeten Kontakten, [0106DB0000] 4 x 0.14 mm² abgeschirmt (Audio), 6 x 75 Ohm [0107080000] RG59 (Video), Länge 2 m, VPE 10 Kabel ... Der Teilausdruck '**.{59}[HF]r\.** ' überspringt zunächst den Anfang der Zeile - 59 beliebige Zeichen, bis eine Zeichenfolge aus einem großen 'H' oder 'F', einem kleinen 'R', einem Punkt gefolgt von einem weiteren Leerstellen vorkommt. Die Zeichenketten 'Hr. ' und 'Fr. ' werden so alternativ erkannt. Damit ist das Muster jetzt auf den Anfang des Namens justiert, unabhängig davon, aus wievielen Namensbestandteilen der Name besteht. Jetzt kann mit dem Teilausdruck '**(.*)**' einfach der Rest der Zeile (der Name) in den Zeichenkettenpuffer übernommen werden. Die Auswahl '**Nein**' bei 'Feld entfernen' läßt die Textpassage so wie sie ist auf dem Blatt, sie soll ja schliesslich weiter hier stehen bleiben. Die Position, an die die Unterschrift gedruckt werden soll, ist in diesem Beispiel durch das verwendete Formular fest vorgegeben. Die der Unterschrift vorangehende Grußformel ist der Einfachheit halber in das Formular mit aufgenommen worden, könnte aber auch mit zwei weiteren Textfeldern direkt erzeugt werden. Hier der Ausschnitt aus der Ressource '**Angebot einzelne Seite**': {{print2forms:tips:0003-2.GIF}} Mit der Schablone '**\Sachbearbeiter:1**' wird der gefundene Name nun in Klarschrift unterhalb der Grußformel im Formular positioniert und gedruckt. Die Schrift wurde der Schrift aus der Grußformel angepasst. Das Ressourcenfeld erzeugt mit der Schablone '**\u/\Sachbearbeiter:1**' den Zugriffspfad für die Ressource mit der Unterschrift. Der Teil '**\u**' dient dazu, den Namen des Benutzers des Formulars mit in den Zugriffspfad aufzunehmen. Dies ist der Name, der auch in der Indexdatei unter '**[User]**' angeführt ist. Der anschließende Schrägstrich ist notwendig, um die verschiedenen Pfadbestandteile voneinander zu trennen. In diesem Beispiel würde also insgesamt der Zugriffspfad '**Unterschriften/Meier/G. Muster**' erzeugt. Das Druckergebnis ist dann so wie oben in der Anforderung zu sehen. Soll die Unterschrift nicht an einer festen Position gedruckt werden, sondern abhängig von den Nutzdaten positioniert werden, ist zunächst der Teil der Nutzdaten zu identifizieren, an dem die Position der Unterschrift festgemacht werden soll. In unserem Beispiel hier wäre das die letzte Zeile mit einer Positionsnummer für einen Artikel. In einem konstanten Abstand zu dieser Zeile müßten dann die Grußformel mit den Belehrungen, die Unterschrift und der Name des Sachbearbeiters gedruckt werden. Diese Anforderung ist im folgenden Formular '**Angebot einzelne Seite variable Tabelle**' realisiert: {{print2forms:tips:0003-5.GIF}} Das Wesentliche dieses Formulars sind die Felder **Name Sachbearbeiter**, **Unterschrift Sachbearbeiter** und **Belehrungen**. Alle diese Felder suchen mit dem Muster ' **.# @.***' die Zeilen, in denen die Positionsnummer eines Artikels auftaucht. Das Teilmuster ' **.#**' findet die ein- oder zweistellige Positionsnumer. Zusammen mit dem Feldindex '**01????0000**' werden aber alle Artikel innerhalb der Tabelle gefunden. Uns interessiert für die Platzierung der Unterschrift aber nur die letzte gefundene Position. Deshalb wird mit der Angabe '**Relativ zum letzten Feld**' dafür gesorgt, daß unabhängig von der Anzahl der gefundenen Texte nur das letzte Vorkommen ausgewertet wird (damit wird auch die automatische mehrfache Auswertung des Feldes unterbunden!). Da jetzt wegen der variablen Positionierung im Textfeld **Name Sachbearbeiter** die letzte Zeile mit einer Positionsnummer gesucht werden muß, muß der eigentliche Name des Sachbearbeiters mit Hilfe des Suchfeldes **Sachbearbeiter** separat ermittelt werden. Damit die Grußformel zusammen mit den Belehrungen variabel positioniert werden kann, muß sie jetzt natürlich von der Tabelle getrennt und in einer eigenen Ressource abgelegt werden. Dies ist die Ressource **Belehrungen** im Subcontainer **Angebot mit variabler Tabelle**, die hier abgebildet ist: {{print2forms:tips:0003-6.GIF}} \\ \\ ==== Bemerkungen ==== * Um das Beispiel nachvollziehen zu können, muß natürlich der Name des Subcontainers im Subcontainer '**Unterschriften**' so umbenannt werden, daß er dem Anmeldenamen (unter Windows) des Testenden entspricht. Ansonsten wird die Unterschrift nicht gedruckt und es erscheint eine entsprechende Fehlermeldung in der Ablaufverfolgung des zum Testen verwendenten Clients. * Durch die Positionierung '**Relativ zum Feld**' beziehungsweise '**Relativ zum letzten Feld**' wird gewährleistet, daß sich die Position der Unterschrift mit verschiebt, wenn das Formular verschoben wird. Die Positionierung der Nutzdaten hat keinen Einfluss. * Die oben vorgestellte Methode, Unterschriften anzudrucken hat ihre Grenzen, wenn sich die Anzahl der gespeicherten Unterschriften der 10.000 nähert oder sie gar übersteigt. In diesen Fällen ist es sinnvoller, die Unterschriften auf einen externen Web-Server auszulagern und sie im Bedarfsfall über HTTP zu holen. Dieses Vorgehen ist in einem eigenen Kapitel beschrieben. * Größere Mengen von Unterschriften mit Hilfe des Administrationsprogramms manuell ins (p2f)-System zu importieren ist sehr mühselig. In solchen Fällen kann das **Import-Gateway** Anwendung finden, das eine automatische Übernahme ins (p2f)-System direkt aus der die Unterschriften erzeugenden Anwendung heraus ermöglicht. Dies kann dann auch durch die zuständigen Sachbearbeiter direkt geschehen, ohne daß diese Zugriff auf das Administrationsprogramm haben müßten. Auch hierzu gibt es ein gesondertes Kapitel. * Wenn eine Zugriffskontrolle auf die Unterschriften über den Namen des Benutzers realisiert wird, kann es vorkommen, daß mehrere Benutzer Zugriff auf die gleiche Unterschrift haben sollen. In solchen Fällen sollte die Resource mit der Unterschrift nicht kopiert werden, sondern es sollte lediglich ein Verweis in die entsprechenden Subcontainer gelegt werden. Damit wird der Änderungsaufwand und auch der benötigte Speicherplatz im System reduziert. * Bleibt der Name des Sachbearbeiters leer, wird das Feld '**Sachbearbeiter**' natürlich den zugehörigen Zeichenkettenpuffer nicht füllen. Bei der Auswertung der Schablonen, die '**\Sachbearbeiter:1**' enthalten, wird dann folgerichtig ein Fehler gemeldet. Der Name des Sachbearbeiters und seine Unterschrift werden nicht gedruckt. Liegt lediglich für einen Sachbearbeiter keine Unterschrift im Ressourcen-Container, wird der Name in Klarschrift selbstverständlich gedruckt. Wegen der fehlenden Ressource wird aber ein Fehler gemeldet. * Die Ausdrucke zum Austesten dieses Beispiels wurden mit Hilfe des beim (p2f) mitgelieferten Programms 'Beispielprogramm' erstellt. Dazu wurde für die Unterschrift an einer fixen Position das Beispiel '**Angebot mit Bildern und Unterschrift**' ausgewählt. Für die variable Positionierung der Unterschrift diente das Beispiel '**Angebot mit variablen Tabellen**'.