PDF-Dateien drucken

Anforderung

Es kommt immer wieder einmal vor, dass während eines Druckvorgangs 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 convert4print geeignet ist, wie zum Beispiel PDF-Dokumente oder irgendwelche Office-Dateien.

Um ein solches Dokument in einen Druckvorgang einschleusen zu können, muss dies eigentlich nur mit Hilfe der zum Dokument passenden Anwendung gedruckt werden, das bitte aber automatisch.

Realisierung

Genau für solche Anforderungen steht in convert4print 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 convert4print 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 convert4print-Drucker oder auf einem convert4print-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:

pdfprint.pl
#!/usr/bin/perl
 
# Command line:    c:\perl\bin\perl.exe "%1\pdfprint.pl" "%2" "%4"
# Tested with:     Foxit Reader 6.0.3.0524
 
#------------------------------------------------------------------------------#
 
my $Spool  = $ARGV [0];
my $Name   = $ARGV [1];
my $Res    = 0;
my $WrkName;
my $Cmd;
my $Log = "$Spool\\perldbg.log";
 
open (LOG, '>>', $Log);
printf LOG "\nStart processing of script pdfprint.pl\n";
 
if ($Spool eq "" || $Name eq "")
  {
    $Res = -11;                    # at least one of the parameters is missing #
    printf LOG "One of the parameters is missing, error = %d\n", $Res;
  }
else
  {
    if ($Name =~ /.*\.pdf/)                      # extension of file is '.pdf' #
      {
        if ($Name =~ /:/)
          {                                              # file name with path #
            $WrkName = $Name;
          }
        else
          {                                           # file name without path #
            $WrkName = "$Spool\\$Name";                             # add path #
          }
 
        $Cmd = "\"C:\\Programme\\Foxit Software\\Foxit Reader\\" .
               "Foxit Reader.exe\" /t \"$WrkName\" \"c4p Converter\"";
 
        printf LOG "Run command: %s\n", $Cmd;
 
        $Res = system ($Cmd) / 256;                           # print pdf file #
 
        printf LOG "system () returns %d\n", $Res;
 
        unlink ($WrkName);                            # remove file afterwards #
      }
    else
      {
        $Res = -12;                                       # not a pdf document #
        printf LOG "Not a PDF Document, error = %d\n", $Res;
      }
  }
 
printf LOG "Script processing done\n";
close LOG;
 
exit $Res;
 
#------------------------------------------------------------------------------#

Die für das Skript notwendige Befehlszeile im Verzeichnismonitor ist als Kommentar in der dritten Zeile des Skripts mit angegeben. Als Parameter werden das Skriptverzeichnis, das Spoolverzeichnis und der Name der gefundenen Datei übergeben.

Das Programm Foxit Reader wird 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 'c4p Converter' verwendet, es ist aber klar, dass der Drucker vom Skript auch dynamisch gewählt werden kann.

Der Windows-Drucker 'c4p Converter' ist eine mit einem PCL-Druckertreiber eingerichtete Druckerwarteschlange, deren Anschluss auf einen convert4print-Drucker oder auf ein convert4print-Gateway 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:

  1. 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.
  2. Der Monitor führt die Befehlszeile aus und startet damit Perl und das Skript 'pdfprint.pl'.
  3. 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'.
  4. Das Skript ruft das Programm Foxit Reader auf und druckt das PDF-Dokument auf dem Drucker 'c4p Converter'.
  5. Nachdem das PDF-Dokument gedruckt worden ist, wird es vom Skript gelöscht.
  6. Das Skript terminiert, und der Monitor kann sich um die nächste Datei, so vorhanden, kümmern.
  7. In der Warteschlange des Druckers 'c4p Converter' wartet die Druckdatei des PDF-Dokuments darauf, zum convert4print-Client (Drucker oder Gateway) gesendet zu werden.
  8. Läuft der convert4print-Client und ist gerade frei, wird die Druckdatei vom Windows-System zum Client gesendet.
  9. Der Client bearbeitet den Druckauftrag 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):

0 2014-10-17 15:28:08  127.0.0.1        151524097 / Directory Monitor / 3.1.0.16
0 2014-10-17 15:28:08  127.0.0.1        Monitor started [940061B48C7B772DD5B3556C19679867]
...
6 2014-10-17 15:28:08  127.0.0.1        Monitoring 'PrtLoc1' started (9)
...
0 2014-10-17 16:12:03  127.0.0.1        'PrtLoc1' processing 'Datei_40.pdf' [0]
6 2014-10-17 16:12:03  127.0.0.1        Moved to 'C:\...\c4pSpool\PrtLoc1\Work\Datei_40.pdf' (0)
6 2014-10-17 16:12:03  127.0.0.1        Call '"c:\perl\bin\perl.exe" "C:\...\c4pScript\pdfprint.pl" "C:\...\c4pSpool\PrtLoc1\Work" "C:\...\c4pSpool\PrtLoc1\Work\Datei_40.pdf"' (0)
0 2014-10-17 16:13:17  127.0.0.1        'PrtLoc1' processing 'Datei_41.pdf' [0]
6 2014-10-17 16:13:17  127.0.0.1        Moved to 'C:\...\c4pSpool\PrtLoc1\Work\Datei_41.pdf' (0)
6 2014-10-17 16:13:17  127.0.0.1        Call '"c:\perl\bin\perl.exe" "C:\...\c4pScript\pdfprint.pl" "C:\...\c4pSpool\PrtLoc1\Work" "C:\...\c4pSpool\PrtLoc1\Work\Datei_41.pdf"' (0)



Bemerkungen