Es kommt immer wieder einmal vor, dass bei der Realisierung eigener Druckprozesse Dokumente von externen Dienstleistern, Lieferanten oder Kunden mit eingebunden werden müssen. In den allermeisten Fällen liegen diese Dateien in einem Format vor, das nicht für die direkte Weiterverarbeitung durch print2forms geeignet ist, wie zum Beispiel PDF-Dokumente oder irgendwelche Office-Dateien.
Um solche Dokumente in den eigenen Druckprozess einschleusen zu können, müssen sie eigentlich nur mit Hilfe der zum Dokument passenden Anwendung gedruckt werden, das bitte aber automatisch.
Genau für solche Anforderungen steht in print2forms ein ganz spezielles Gateway zur Verfügung: der Verzeichnis-Monitor. Eine der Aufgaben dieses Gateways besteht im Prinzip darin, eines oder mehrere Verzeichnisse auf einem Rechner zu überwachen, und, sollten in den überwachten Verzeichnissen Dateien auftauchen, diese Dateien mit Hilfe eines geeigneten Programms zu drucken und damit an print2forms weiterzureichen.
Die zu verarbeitenden Dateien könnten beispielsweise über einen FTP-Server, eine Web-Anwendung oder ein EMail-Programm automatisch in die überwachten Verzeichnisse kopiert werden.
Um beim oben genannten Beispielfall des automatisierten Drucks einer PDF-Datei zu bleiben, muss vom Verzeichnismonitor ein Skript aufgerufen werden, welches die PDF-Datei auf einem print2forms-Drucker oder auf einem Gateway ausgibt.
Das Programm, welches einem dazu als erstes einfällt, der 'Adobe Reader' ist leider für diesen Fall unbrauchbar, weil seit neuestem das Drucken von der Kommandozeile nicht mehr unterstützt wird. Das hier vorgestellte Skript benutzt deshalb das ebenfalls freie Programm 'Foxit Reader' (http://www.foxitsoftware.com/).
Hier das auf das nötigste zusammengekürzte Beispielskript in Perl:
#!/usr/bin/perl # Command line: c:\perl\bin\perl.exe "%1\printpdf.pl" "%1" "%2" "%4" # Tested with: Foxit Reader 6.0.3.0524 #------------------------------------------------------------------------------# my $Script = $ARGV [0]; my $Spool = $ARGV [1]; my $Name = $ARGV [2]; my $Res = 0; my $Cmd; if ($Script eq "" || $Spool eq "" || $Name eq "") { $Res = -11; # at least one of the parameters is missing # } else { if ($Name =~ /.*\.pdf/) # extension of file is '.pdf' # { if ($Name =~ /Mahnung.*/) { $Process = "IM0OEG2"; } # reminder # else { $Process = "IN45FK2"; } # all others # $Cmd = "\"$Script\\p2fSetProcess.exe\" \"-wp2f Printer\" -p$Process"; $Res = system ($Cmd) / 256; # setup printer configuration # if ($Res eq 0) { $Cmd = "\"C:\\Programme\\Foxit Software\\Foxit Reader\\" . "Foxit Reader.exe\" /t \"$Spool\\$Name\" \"p2f Printer\""; $Res = system ($Cmd) / 256; # print pdf file # unlink ("$Spool\\$Name"); # remove file afterwards # } } else { $Res = -12; } # not a pdf document # } exit $Res; #------------------------------------------------------------------------------#
Die für das Skript notwendige Befehlszeile im Verzeichnismonitor ist als Kommentar in der dritten Zeile des Skripts mit angegeben. Als Parameter wird das Skriptverzeichnis, das Spoolverzeichnis und der Name der gefundenen Datei übergeben.
Da das vorgefundene PDF-Dokument nicht statisch immer mit dem gleichen im Druckertreiber voreingestellten print2forms-Prozess bearbeitet werden soll, kommt ein kleines Hilfsprogramm mit dem Namen p2fSetProcess zum Einsatz (siehe Tip p2fSetProcess.exe), welches skriptgesteuerte Änderungen an der Druckerkonfiguration erlaubt. Hier im Beispiel soll ein besonderer Prozess benutzt werden, wenn der Name des PDF-Dokuments mit der Zeichenkette 'Mahnung' anfängt.
Die Namen der zu verwendenden Prozesse - hier 'IM0OEG2' und 'IN45FK2' beziehen sich auf die internen Objektnamen der Prozessobjekte. Diese Namen werden im Administrationsprogramm angezeigt. Der Grund, warum diese unleserlichen internen Namen anstatt der sprechenden externen Namen verwendet werden, ist der, dass auf diese Weise zur Laufzeit des Skriptes keine Verbindung zum print2forms-Server aufgebaut werden muss, um den externen Namen in einen internen zu übersetzen. Dies macht zum einen den Ablauf performanter und entlastet das Netzwerk und den Server.
Nachdem der Druckertreiber richtig konfiguriert wurde, wird dann das Programm Foxit Reader mit dem Namen des auszugebenden PDF-Dokuments und dem Windows-Namen des zu verwendenten Druckers aufgerufen. In diesem Beispiel wird immer der Windows-Drucker mit Namen 'p2f Printer' verwendet, es ist aber klar, dass der Drucker vom Skript auch dynamisch gewählt werden kann.
Der Windows-Drucker 'p2f Printer' ist eine mit dem print2forms-Druckertreiber eingerichtete Druckerwarteschlange, deren Anschluss auf einen print2forms-Client, ein print2forms-Gateway oder auf den print2forms-Router verweist. Durch diesen Mechanismus ist eine zeitliche Entkopplung gewährleistet, weil ja die Windows-Warteschlange die Drucke aufnimmt, egal ob der Ziel-Client gerade frei oder mit einem anderen Ausdruck beschäftigt ist.
Wenn jetzt eine PDF-Datei in das überwachte Spoolverzeichnis kopiert wird, passiert folgendes:
In der Ablaufverfolgung des Monitors sollte irgendetwas ähnlich dem folgenden zu sehen sein (Pfadnamen zwecks besserer Übersicht gekürzt):
6 2013-07-02 16:36:31 10.1.17.27 Console '10.1.17.27:55571' 6 2013-07-02 16:36:31 10.1.17.27 Access <GWY/G2KWMG0.XML> (1085) 0 2013-07-02 16:36:31 10.1.17.27 Reading $$items.xml ... 0 2013-07-02 16:36:31 10.1.17.27 Mode 1312 stored 6 2013-07-02 16:36:31 10.1.17.27 Mode 1 1312 0 2013-07-02 16:36:31 10.1.17.27 p2fMonitor 3.2.0.128 started (134676739) 6 2013-07-02 16:36:31 10.1.17.27 Monitoring spool directory started (1) 0 2013-07-02 16:36:54 10.1.17.27 Processing 'Mahnung_686014177.pdf' [0] 6 2013-07-02 16:36:54 10.1.17.27 Moved to 'C:\...\p2fSpool\Work\Mahnung_686014177.pdf' 6 2013-07-02 16:36:54 10.1.17.27 Call 'c:\perl\bin\perl.exe "C:\...\p2fScript\printpdf.pl" "C:\...\p2fScript" "C:\...\p2fSpool\Work" "Mahnung_686014177.pdf"' 0 2013-07-02 16:37:33 10.1.17.27 Processing '0901c4139ab906a5.pdf' [0] 6 2013-07-02 16:37:33 10.1.17.27 Moved to 'C:\...\p2fSpool\Work\0901c4139ab906a5.pdf' 6 2013-07-02 16:37:33 10.1.17.27 Call 'c:\perl\bin\perl.exe "C:\...\p2fScript\printpdf.pl" "C:\...\p2fScript" "C:\...\p2fSpool\Work" "0901c4139ab906a5.pdf"'