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:


Hinweise