===== PCL-Testausdrucke anzeigen =====
==== Anforderung ====
Beim Entwurf neuer Prozesse und Formulare mit (p2f) werden oft viele Testausdrucke benötigt, insbe(-)sondere, wenn die Formulare dynamische Inhalte enthalten. Dann muss mit verschiedenen Testdaten geprüft werden, inwieweit sich das Formular an die geänderten Druckdaten anpasst.
Dabei geht einige Zeit für die Erstellung der Ausdrucke ins Land und es entstehen Kosten für Papier und Toner/Tinte.
Ein Fortschritt wäre, wenn man sich die Ausdrucke stattdessen direkt am Rechner ansehen könnte, ohne dass tatsächlich Papier bedruckt werden müsste. ((In der Version 4 von (p2f) ist der hier beschriebene Mechanismus in einer etwas abgewandelten Form auch Teil des Administrationsprogramms. Somit können [[https://wiki.print2forms.de/doku.php?id=print2forms:admin:view|Formulare, Ressourcen]] und auch [[https://wiki.print2forms.de/doku.php?id=print2forms:admin:test|Testausdrucke]] direkt im Admini(-)strations(-)programm angesehen werden. Das neue Administrationsprogramm simuliert auch einen [[https://wiki.print2forms.de/doku.php?id=print2forms:admin:print|PCL-Drucker]], der analog zur hier vorgestellten Lösung genutzt werden kann, allerdings nur maximal zehn Seiten darstellt.\\ \\ ))
\\
\\
Zu diesem Zweck wurde bereits vor einiger Zeit ein spezielles Hilfsprogramm [[print2forms:tips:tip53|p2fViewer.exe]] geschrieben, welches einen Netzwerkdrucker simuliert und die empfangenen Daten als %%PCL%%-Datei ablegt. Um dann diese %%PCL%%-Datei in ein Druckbild zu ver(-)wandeln, wurde in der Vergangenheit ein Programm der Firma Lincoln & Co ([[http://www.lincolnco.com/]]) verwendet (siehe auch Tip [[print2forms:tips:tip30|PDF- und TIFF-Datei erzeugen]]).
Leider hat es den Anschein, dass dieses Programm nicht mehr weiterentwickelt wird. Jedenfalls nutzt (p2f) inzwischen eine ganze Reihe von %%PCL%%-Sequenzen, die nicht oder nicht korrekt dargestellt werden können. Das betrifft vor allem die neuen Schriften aus der [[print2forms:schriften:schriften|Schriftenbibliothek]], wenn es um die Kodierung **UTF-8** geht, die Grundlage der Nutzung von vielen multinationalen Zeichensätzen ist.
Es musste also eine Alternative gesucht werden, damit auch die neuen Features von (p2f) uneingeschränkt genutzt werden können.
\\
\\
==== Realisierung ====
Als Alternative bietet sich das Programm [[https://www.ghostscript.com/GhostPCL.html|GhostPCL]] der Firma Artifex an, das für die Nutzung durch Endanwender unter der //GNU Affero GPL Lizenz// kostenfrei eingesetzt werden kann. ((GhostPCL ist ein Teil des grossen Projekts **[[https://www.ghostscript.com/|GhostScript]]** als Interpreter für PostScipt und %%PDF%%. \\ \\ )) Bei diesem Programm handelt es sich aber lediglich um einen reinen Konverter, der aus dem %%PCL%%-Datenstrom andere Datenströme, Bilder oder PDF-Dateien erzeugt.
Man benötigt also noch irgendein anderes Programm zum Anzeigen des Druckergebnisses.
Schaut man sich die möglichen Ausgabeformate von GhostPCL an, bieten sich zwei Lösungsmöglichkeiten an:
\\
\\
==== Lösung mit PDF ====
Das naheliegendste scheint zu sein, GhostPCL aus den Druckdaten eine %%PDF%%-Datei machen zu lassen, und dann ein beliebiges auf dem Rechner bereits installiertes Programm zur Anzeige der %%PDF%%-Datei aufzurufen.
Das kann sowohl der **Adobe-Reader**, der **Foxit-Reader** oder etwa **SumatraPDF** sein.
Die Programme unterscheiden sich in ihrem Leistungsumfang erheblich, aber das ist im hier vorliegenden Fall nur insofern von Interesse, als es die Startzeit des Programms beeinflusst. Viel wesentlicher ist, ob die Einstellungen zur Anzeige von einem externen Skript her gesetzt werden können. Da das nur sehr eingeschränkt möglich ist, gilt eigentlich die Empfehlung, nicht den Standard-%%PDF%%-Betrachter zu wählen, sondern einen, der ausschliesslich für die Anzeige von (p2f)-Ausgaben eingestellt werden kann.
Aus diesem Grund nutzt das nachfolgende Beispiel [[https://www.sumatrapdfreader.org/free-pdf-reader.html|SumatraPDF]], welches in der portablen Version über eine lokale Konfigurationsdatei (editierbarer Text) verfügt. SumatraPDF ist frei und kann für diesen Zweck genutzt werden.
Der Einfachheit halber gehen wir davon aus, dass alle notwendigen Dateien in einem Verzeichnis ''C:\View'' installiert sind. Das reduziert die Pfadlänge entsprechend ((Natürlich darf auch jedes andere Verzeichnis gewählt werden, in dem Rechte zum Ausführen von Programmen zur Verfügung stehen. \\ \\ )) und vermeidet eine ganze Reihe sonst notwendiger Hochkommata. Dort soll GhostPCL liegen (die //gpcl6win64.exe// und die //gpcl6win64.dll// für 64-Bit Systeme, ansonsten //gpcl6win32.exe// und die //gpcl6win32.dll// für 32-Bit Systeme). Ausserdem die Batch-Dateien mit den Kommandos, wie unten beschrieben. Für die Lösung mit %%PDF%% muss in diesem Verzeichnis auch die Datei //SumatraPDF.exe// liegen.
{{print2forms:tips:0074-1.png}}
In der Kommandozeile des Programms **p2fViewer.exe** wird jetzt statt wie bisher kein Programm, sondern eine Batch-Datei mit Befehlen für die Windows-Commandshell aufgerufen (die Hochkommata sind wichtig!): ((Bitte mindestens den Build 149 von p2fViewer.exe einsetzen, um zu vermeiden, dass ein zusätzliches Fenster für die Commandshell aufgeht.\\ \\ ))
''(sp)%%cmd /s /c ""C:\View\makepdf.bat" "%1""%%(sp)''
Das Spool-Verzeichnis des p2fViewers muss auf ''C:\View'' gesetzt werden. Diese Batch-Datei selbst enthält folgende Befehle:
\\
C:\View\gpcl6win64.exe -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="C:\View\View.pdf" %1
C:\View\SumatraPDF.exe -view "single page" "C:\View\View.pdf"
del C:\View\View.*
Als erstes wird GhostPCL aufgerufen, um eine PDF-Datei aus der angelieferten %%PCL%%-Datei zu erzeugen. Die %%PDF%%-Datei erhält dabei der Einfachheit halber immer den Namen //View.pdf//. Diese %%PDF%%-Datei wird dann an das Programm %%SummatraPDF%% zur Anzeige übergeben. Nachdem die Anzeige in SumatraPDF beendet ist, werden die %%PDF%%- und die %%PCL%%-Datei gelöscht.
\\
\\
==== Lösung mit Bildern ====
Eine zweite Lösung, die keine weiteren Programme benötigt, nutzt die Erzeugung von Bildern durch GhostPCL. Das ist nicht wirklich langsamer, ermöglicht aber, den mit Windows mitgelieferten Bildbetrachter einzusetzen.
Die Grundidee beruht darauf, für jede Seite des gedruckten Dokuments eine PNG-Datei zu erzeugen, die dann vom Bildbetrachter nacheinander zur Anzeige gebracht werden können. Dazu wird die Kommandozeile des Programms p2fViewer.exe wie folgt konfiguriert:
''(sp)%%cmd /s /c ""C:\View\makepng.bat" "%1""%%(sp)''
Die ausgeführte Batch-Datei hat folgenden Inhalt:
\\
C:\View\gpcl6win64.exe -dNOPAUSE -sDEVICE=png16m -r600 -dDownScaleFactor=2 -sOutputFile=c:\View\Seite-%%d.png %1
%SystemRoot%\System32\rundll32.exe "%ProgramFiles(x86)%\Windows Photo Viewer\PhotoViewer.dll", ImageView_Fullscreen c:\View\Seite-1.png
del c:\View\Seite-*.png
del %1
Als erstes wird GhostPCL aufgerufen, um PNG-Dateien mit einer Farbtiefe von 16-Millionen Farben (24-Bit) zu erzeugen. Die Dateien erhalten im Namen einen Seitenzähler und heissen dann Seite-1.png, Seite-2.png, usw. Das Prozentzeichen muss in der Batch-Datei verdoppelt werden, um es von Environment-Variablen unterscheiden zu können.
Anschliessend wird der Bildbetrachter aus dem Windows-Verzeichnis (nur eine DLL) aufgerufen und gewartet, bis der Benutzer den Bildbetrachter schliesst. Sobald das der Fall ist, werden die erzeugten %%PNG%%-Dateien und die %%PCL%%-Datei gelöscht.
{{print2forms:tips:0074-2.png}}
\\
\\
==== Hinweise ====
* Es soll nicht verschwiegen werden, dass es auch mit GhostPCL hin und wieder zu **Darstellungsfehlern** innerhalb von %%PDF%%-Dateien kommt, insbesondere dann, wenn Farbe mit Transparenz genutzt wird und diese gegen bereits gefüllte Hintergründe gemischt werden muss (wie in dem Screenshot hier). Bei der Bilderzeugung gibt es diese Fehler nicht - deshalb ist die **Erzeugung von %%PNG%%-Dateien im Moment zu bevorzugen**. Es mag sein, dass GhostPCL das in einer neueren Version demnächst besser macht.
* Es wird die schon etwas ältere Version 9.21 von GhostPCL eingesetzt, weil diese noch permanent gemachte Schriften im Speicher behält, wenn innerhalb der %%PCL%%-Daten %%PJL%%-Befehle kommen (geschieht meistens im Zusammenhang mit Dokumentprozessen). Die neueren Versionen von GhostPCL löschen die Schriften. Manche Drucker tun diese ebenfalls, wenn einer der %%PJL%%-Befehle die Speicheraufteilung im Drucker verändert. In solchen Fällen muss in der Druckeranpassung in der **PO-Ressource** dafür gesorgt werden, dass die Schriften für jeden vom Dokumentenprozess erzeugten Teilauftrag neu geladen werden (Beispiel in der Anpassung //Hewlett Packard OfficeJet//).
* Auf nicht ganz so leistungsstarken Rechnern kann bei der Erzeugung der %%PNG%%-Dateien statt der beiden Parameter ''-r600 -dDownScaleFactor=2'' nur der Parameter ''-r300'' angegeben werden. Dadurch werden die Bilder direkt in 300 dpi erzeugt. Das ist deutlich weniger Aufwand als die Bilder zunächst mit 600 dpi zu erzeugen und sie dann auf 300 dpi herunterzurechnen. Motivation für letzteres ist, dass dadurch mittels Anti-Aliasing das Bild sehr viel angenehmer anzuschauen ist, weil die Kanten weicher und runder werden.
* Für ein Temporär-Verzeichnis die Environment-Variable **%Temp%** zu verwenden, funktioniert mit dem Bildanzeigeprogramm von Microsoft leider nicht. Die einzelnen Seiten lassen sich nicht weiterschalten.
* Die naheliegende Idee, das Programm **p2fViewer.exe** mit der **DLL von GhostPCL** zu koppeln, und eine direkte Anzeige zu programmieren, ist aus lizenzrechtlichen Problemen nicht möglich. Aus dem gleichen Grund ist GhostPCL auch nicht direkter Bestandteil des (p2f)-Installers.
* Möchte man mit einem ganz normalen Gateway testen und sich die erzeugten Daten direkt anzeigen lassen, kann ebenfalls wie hier beschrieben vorgegangen werden. Allerdings wird eine leicht modifizierte Batch-Datei benötigt:\\ \\
C:\View\gpcl6win64.exe -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="%~1.pdf" "%~1.pcl"
C:\View\SumatraPDF.exe -view "single page" "%~1.pdf"
del "%~1.*"
\\ Die zugehörige Kommandozeile für das Gateway ist ''(sp)%%cmd /s /c ""%1\makepdf.bat" "%2\%4""%%(sp)''.
\\
\\
==== Extra Tip ====
Wenn man auch auf dem Rechner gespeicherte **%%PCL%%-Dateien anzeigen** möchte, kann man die beiden BAT-Dateien ebenfalls einsetzen. ((Das funktioniert nur mit von externen Programmen erzeugten %%PCL%%-Dateien oder solchen, die durch Umwandlung von Aufzeichnungen entstanden sind. Es **funktioniert nicht (!)** mit %%PCL%%-Dateien, die sich innerhalb des p2fRoot-Verzeichnisses befinden, weil diese beim Importieren zerlegt und umkodiert werden.\\ \\ ))
Vorausgesetzt, %%PCL%%-Dateien haben eine einheitliche Endung wie etwa '.pcl', kann man über die rechte Maustaste aus dem Kontextmenü einfach den Eigenschaftendialog für diese Datei öffnen.
Ein Klick auf die Schaltfläche ''Ändern'' rechts neben ''Öffnen mit:'' erlaubt die Auswahl eines Programms, das zum Anzeigen der Datei verwendet werden soll.
Wenn man dort zu einer der beiden BAT-Dateien im Verzeichnis ''C:\View'' navigiert und diese auswählt, genügt zukünftig ein Doppelkllck auf die %%PCL%%-Datei oder auch nur die Taste ''Enter'', um die Datei anzuzeigen. Das funktioniert auch mit mehrseitigen %%PCL%%-Datenströmen.
In jedem Fall öffnet sich zunächst einmal ein **Kommando(-)fenster** zur Ausführung der BATCH-Datei. Erst anschliessend öffnet sich der **%%PDF%%-Viewer** oder die Windows **Bildanzeige**. Das kann bei %%PCL%%-Dateien mit vielen Seiten durchaus seine Zeit dauern.
Wird der %%PDF%%-Viewer oder der Bildbetrachter geschlossen, beendet sich auch das Kommandofenster.
{{ print2forms:tips:0074-3.png}}
\\