===== PDF-Dateien drucken ===== ==== Anforderung ==== 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 (p2f) 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. \\ \\ ==== Realisierung ==== Genau für solche Anforderungen steht in (p2f) 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 (p2f) 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 (p2f)-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 (p2f)-Prozess bearbeitet werden soll, kommt ein kleines Hilfsprogramm mit dem Namen **p2fSetProcess** zum Einsatz (siehe Tip [[print2forms:tips:tip41|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 (p2f)-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. {{print2forms:tips:0029-1.PNG}} 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 (p2f)-Druckertreiber eingerichtete Druckerwarteschlange, deren Anschluss auf einen (p2f)-Client, ein (p2f)-Gateway oder auf den (p2f)-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: - Der Monitor erkennt die Datei und verschiebt sie ins Unterverzeichnis 'Work', welches der Monitor bei seinem Start automatisch angelegt hat. Dies ist notwendig, damit weitere Dateioperationen durch das Skript nicht wieder den Monitor auslösen. - Der Monitor führt die Befehlszeile aus und startet damit Perl und das Skript 'pdfprint.pl'. - Wenn es sich nicht um eine Datei mit der Endung '.pdf' handelt, terminiert das Skript und die vom Monitor gefundene Datei verbleibt im Unterverzeichnis 'Work'. - Das Skript ruft das Programm **p2fSetProcess** auf und wählt den gewünschten (p2f)-Prozess auf dem Drucker 'p2f Printer'. - Das Skript ruft das Programm **Foxit Reader** auf und druckt das PDF-Dokument auf dem Drucker 'p2f Printer'. - Nachdem das PDF-Dokument gedruckt worden ist, wird es vom Skript gelöscht. - Das Skript terminiert, und der Monitor kann sich um die nächste Datei, so vorhanden, kümmern. - In der Warteschlange des Druckers 'p2f Printer' wartet die Druckdatei des PDF-Dokuments darauf, zum (p2f)-Client gesendet zu werden. - Läuft der (p2f)-Client und ist gerade frei, wird die Druckdatei vom Windows-System zum Client gesendet. - Der Client bearbeitet den Druckauftrag mit dem vom Skript ausgewählten Prozess und der gewünschte Ausdruck erscheint auf dem zugehörigen Drucker. 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 (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"' \\ \\ ==== Bemerkungen ==== * Richtig performant ist diese Lösung natürlich nicht, weil für jedes Dokument erst das Programm **p2fSetProcess** und dann der **Foxit Reader** gestartet werden müssen. Sind Realzeitbedingungen einzuhalten, muss im Einzelfall getestet werden, ob diese Vorgehensweise eingesetzt werden kann. Auf aktuellen 'normalen' Rechnern kann mit 20 bis 30 ein- oder zweiseitigen Dokumenten pro Minute gerechnet werden. * Was nicht geht, ist, dass dieser Windows-Drucker von anderen Anwendungen auf diesem Rechner mitbenutzt wird. Weil das Skript zu nicht vorhersagbaren Zeitpunkten die Druckerkonfiguration ändert, wären die Druckergebnisse anderer Anwendungen auf diesem Rechner eher 'zufällig'. Diese Einschränkung gilt natürlich nur für Anwendungen, die unter dem gleichen Benutzerkonto laufen, wie der (p2f) Client/Gateway-Service.