Webseiten-Werkzeuge

Benutzer-Werkzeuge


Skript Phase 2

Das Skript wird vom Gateway Phase 2 genutzt. Seine Aufgabe besteht darin, die vom Web-Server empfangenen und im überwachten Ordner des Monitor-Gateways abgelegten Fotos der Unterschriften zu verarbeiten.

Das Skript erhält als ersten Parameter den Pfad, in dem sich das Skript selbst befindet. Als zweiter Parameter wird der Pfad zum Arbeitsverzeichnis des Monitor-Gateways sowie der Name des hochgeladenen Fotos übergeben. Der vierte und letzte Parameter ist ein kodierter Lizenzschlüssel für das vom Skript aufgerufene Hilfsprogramm zum Filtern und Konvertieren der Fotos.

Die Namen der hochgeladenen Fotos bestehen aus mehreren, durch Unterstriche getrennten Teilen. Der erste Teil ist die eigentliche Dokumentkennung, so wie sie aus dem QR-Code ermittelt wurde. Es folgt der Wert, der in der App als Farbfilter konfiguriert wurde, gefolgt vom Winkel, um den das Foto von der Horizontalen abweicht. Am Ende des Namens steht als Kennung ein kleines 't' oder ein 'c', je nachdem, ob sich um die Unterschrift des Technikers (linke Seite) oder die des Kunden handelt (rechte Seite). Diese beiden Buchstaben werden ebenfalls aus dem QR-Code entnommen, und sind dadurch fest vorgegeben. Die hochgeladenen Fotos sind JPEG-Dateien. Ein gültiger Name könnte demzufolge so aussehen:  00043805_30_-0.4021_t.jpg  oder  00043805_30_-0.6437_c.jpg .

sign_2.php
<?php
// Gateway command line:    php %1/sign_2.php %1 %2 %4 %K
 
// (c) 2018 by SPE Systemhaus GmbH
 
$Script = $argv[1];                                         /* path to script */
$Upload = $argv[2];                                 /* path to uploaded image */
$Image  = $argv[3];                                 /* name of uploaded image */
$Key    = $argv[4];                        /* license key for image converter */
 
if ($Script == "" || $Upload == "" || $Image == "" || $Key == "") { exit (-1); }
 
chdir ($Upload);          /* make it current directory to shorten some pathes */
 
$Target = "C:\\sign2forms\\Archiv";         /* target directory for pdf files */
 
$RightMacro = 32000;
$LeftMacro = 32001;
 
$NamePattern = "/(?<name>[^_]+)_" .
                "(?<color>[^_]+)_" .
                "(?<angle>\-?[0-9]{1,3}(\.[0-9]{1,4})?)_" .
                "(?<type>[ct])\.jpg/i";
 
if (preg_match ($NamePattern, $Image, $Matches)) {
    $Name  = $Matches ["name"];
} else {
    rename ($Image, $Upload . "\\Error\\" . $Image);
    exit (-2);
}
 
/* Check whether the corresponding document is already present */
 
if (! file_exists ($Name . ".pcl")) {
    rename ($Image, $Upload . "\\NoDocument\\" . $Image);
    exit (-6);
}
 
if ($Matches ["type"] == "c") { $Macro = $RightMacro; }
                         else { $Macro = $LeftMacro; }
 
/* Filter and convert the just received image, result is a pcl-macro */
 
$cmdSign = "\"" . $Script . "\\p2fSign.exe\"" .
           " -i" . $Image . 
           " -g" . $Matches ["color"] .              /* color filter treshold */
           " -m" . $Macro .                               /* macro identifier */
           " -c294" .                /* barcode size is 14 pixel x 21 modules */
           " -r" . $Matches ["angle"] .
           " -k" . $Key;
 
system ($cmdSign, $Result);    /* image filtering and conversion to pcl macro */
 
if ($Result != 0) {             /* p2fSign.exe failed, save file for analysis */
    rename ($Image, $Upload . "\\Error\\" . $Image);
    exit (-3);                                    /* image can't be converted */
}
 
unlink ($Image);                               /* image file no longer needed */
 
/* Check whether the corresponding signature was already received */
 
if ($Matches ["type"] == "c") {        /* right (customer) signature received */
    if (! file_exists ($Name . "_" . $LeftMacro . ".pcl"))
        { exit (0); }                             /* left macro still missing */
} else {                              /* left (technician) signature received */
    if (! file_exists ($Name . "_" . $RightMacro . ".pcl"))
        { exit (0); }                            /* right macro still missing */
}
 
/* Combine the document pcl-file with the two signature macros */
 
$Combine = fopen("Combine.txt", "w");
fwrite ($Combine, "UEL\n" . 
                  "PJL = ENTER LANGUAGE = PCL\n" . 
                  "PAS = " . $Name . "_" . $LeftMacro . ".pcl\n" .
                  "PAS = " . $Name . "_" . $RightMacro . ".pcl\n" .
                  "INC = " . $Name . ".pcl\n" .
                  "UEL\n");
fclose ($Combine);
 
$cmdCombine = "\"" . $Script . "\\p2fCombine.exe\"" . 
              " -fCombine.txt " .
              " -o" . $Name . "_tmp.pcl" .
              " -k" . $Key;
system ($cmdCombine, $Result);
 
if ($Result != 0) { exit (-4); }
 
/* Convert the pcl-file with the signatures to a pdf-file */
 
$cmdGhostPCL = "\"" . $Script . "\\gpcl6win32.exe\"" .
                  " -dNOPAUSE" .
                  " -sDEVICE=pdfwrite" .
                  " -dPDFA=1" .
                  " \"-sOutputFile=" . $Name . ".pdf\"" .
                  " \"" . $Name . "_tmp.pcl\"";
system ($cmdGhostPCL, $Result);
 
if ($Result != 0) { exit (-5); }
 
/* Move just generated pdf-file to it's target directory */
 
rename ($Name . ".pdf", $Target . "\\" . $Name . ".pdf");
 
unlink ($Name . "_" . $RightMacro . ".pcl");
unlink ($Name . "_" . $LeftMacro . ".pcl");
unlink ($Name . "_tmp.pcl");
unlink ($Name . ".pcl");
 
exit (0);
?>


Der Aufbau und Ablauf des Skripts ist folgender:

  • Zunächst wird überprüft, ob alle vier benötigten Parameter vorliegen.
  • Der Name des Fotos wird in seine unterschiedlichen Bestandteile zerlegt, was in diesem Fall ein regulärer Ausdruck mit benannten Puffern erledigt.
  • Für das Hilfsprogramm p2fSign.exe wird eine entsprechende Kommandozeile zusammengebaut, und das Programm wird aufgerufen. Ergebnis ist eine Datei mit dem Bild der Unterschrift als PCL-Makro 32000 oder 32001.
  • Ist das zweite für das Dokument benötigte Foto noch nicht hochgeladen worden, wird die Ausführung des Skriptes an dieser Stelle beendet.
  • Für das Hilfsprogramm p2fCombine.exe wird eine Steuerdatei und eine entsprechende Kommandozeile zusammengebaut, und das Programm dann aufgerufen. Ergebnis ist eine temporäre PCL-Datei mit den beiden Unterschriften in Form der PCL-Makros gefolgt vom eigentlichen PCL-Dokument.
  • Im nächsten Schritt wird diese temporäre PCL-Datei mit Hilfe des Programms GhostPCL in eine PDF/A-Datei mit dem Namen des Ausgangsdokuments konvertiert. Wird statt GhostPCL ein anderer Konverter verwendet, ist dieser Teil des Skripts entsprechend anzupassen.
  • Zum Abschluss wird die PDF/A-Datei in das vorgegebene Zielverzeichnis verschoben.
  • Die erzeugten Zwischendateien werden gelöscht. Die Aufgabe des Skripts ist erledigt und es terminiert ohne Fehler.


Hinweise

  • Am Anfang des Skript gibt es eine Zuweisung an die Variable $Target. Hier ist das gewünschte Zielverzeichnis zur Ablage der PDF/A-Dateien anzugeben.
  • Wird das Skript aufgrund von aufgetretenen Fehlern vorzeitig verlassen, werden entsprechende negative Werte an den Aufrufer des Skripts zurückgegeben. Demzufolge wird in der Ablaufverfolgung des Monitor-Gateways Phase 2 diese Situation aufgezeichnet und kann entsprechend ausgewertet und abgestellt werden.
  • Stimmt irgendetwas mit dem Foto nicht (falscher Name, falscher Inhalt), wird das Foto zur späteren Analyse in ein Unterverzeichnis des Arbeitsverzeichnisses des Monitor-Gateways mit dem Namen Error verschoben.
  • Zum Testen des Skripts sollten erst einmal die Aufrufe der Funktion unlink auskommentiert werden. Es lassen sich dann alle Zwischendateien leichter inspizieren.
print2forms/sign2forms/skript2.txt · Zuletzt geändert: 2018-02-21 15:10 (Externe Bearbeitung)