Hallo Leute,
in einem meiner letzten Projekte habe ich mit dem NAS automatisiert Lieferscheine gedruckt. Diese werden im Stapel gedruckt und hatten riesige Größen von größer als 30 MB. Diese Lieferscheine sollten dann anschließend per Mail verschickt werden. Wie man sicherlich weiß, gibt es je nach Exchangeserver Limits, die ich mit diesen Dateianhängen überschritten hätte.
Ich möchte daher heute auf eine Möglichkeit eingehen, die wir seit der Einführung von .NET haben (seit NAV 2009). Wir können externe Programme beispielsweise per Eingabeaufforderung aufrufen und das System zwingen zu warten bis auch die externe Verarbeitung, aufgerufen durch die Eingabeaufforderung, fertig ist. Dies möchte ich heute etwas näher am Beispiel von Ghostscript und den dort integrierten Komprimierungsmöglichkeiten erläutern.
Zu aller erst drucke ich dafür in einer NAV 2016 eine Auftragsbestätigung ohne Filtereingaben mit 30 Kopien und speichere diese als PDF. Das soll in diesem Fall mein Kundenbeispiel simulieren und eine große PDF erzeugen. In der “Debitoren & Verkauf Einrichtung” habe ich die Logoposition auf rechts gesetzt, damit die Datei größer wird.
Meine PDF hat jetzt eine Größe von 21,6 MB mit 1302 Seiten und wir sprechen von einem Standardbeleg. Das zeigt schon wohin die Reise gehen kann, wenn die PDF-Logik aus Dynamics NAV verwendet wird.
Ich kann natürlich jetzt versuchen, das Druckbild oder die angedruckten Bilder zu verkleinern. Ich kann auch die Berichtseigenschaft bzw. Servertiereigenschaft: PDFFontEmbedding auf Yes setzen. Aber nehmen wir mal das Worst-Case Szenario an. Ich habe einen integrierten Barcode, belegabhängige Bilder und eine kundenindividuelle Schriftart in meinem Kundenbeleg. In diesem Fall kann ich meine Tricks nicht anwenden und muss also einen anderen Weg finden.
In meinem Fall werde ich nun ein paar kleine Zeilen Code schreiben und das Ganze mit Ghostscript erheblich verkleinern ohne die Qualität groß zu verändern. Zu aller erst installiere ich dafür Ghostscript. Ich verwende die Version gs9.18 – 64 Bit, da ich dies auf der Service Tier (läuft auch mit 64 Bit) ausführen möchte. Nach der Intsallation steht mir hier Ghostscript zur Verfügung:
Ich passe jetzt den Bericht 205 kurz an und setze die Kopienanzahl immer auf 30, damit ich mein Beispiel auch automatisiert nachstellen kann. Dafür füge ich eine neue Funktion ein, damit ich die Anzahl der Kopien von “Außen” setzen kann.
Nun erstelle ich eine neue Codeunit und erzeuge eine PDF über alle Aufträge im System mit jeweils 30 Kopien.
Mit einem RUN auf die Codeunit erzeugt der Server die AB.PDF im Ordner C:\TEMP\ (Bei mir läuft Server und Client auf einer Maschine, daher berücksichtige ich kein 3-Tier File Management).
Nun werde ich die PDF mit Ghostscript und der Eingabeaufforderung extrem verkleinern. Das Ganze berücksichtigt folgende Dinge:
- Diverse Parameter aus der Ghostscript Online Hilfe.
- CMD läuft im Hintergrund
- CMD läuft Modal
- CMD wartet bis Ghostscript fertig ist.
Folgende Variablen benutze ich:
Name DataType Subtype Length
SystemDiagnosticsProcess DotNet System.Diagnostics.Process.’System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′
SystemDiagnosticsProcessStartInfo DotNet System.Diagnostics.ProcessStartInfo.’System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′
SystemDiagnosticsProcessWindowsStyle DotNet System.Diagnostics.ProcessWindowStyle.’System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089′
CommandParameter Text
Den Wert “-dNumRenderingThreads=X” sollte man so verändern, wie man es für richtig hält. Dieser gibt an, wie viele CPU-Kerne verwendet werden dürfen.
Die Message zum Schluss gibt das System erst aus, wenn die Komprimierung abgeschlossen ist. Jetzt führen wir das Ganze aus und schauen uns das Ergebnis an:
Wenn das mal nicht ein gutes Ergebnis ist? Dann weiß ich auch nicht mehr weiter! 🙂 Der Vorgang läuft komplett modal und komprimiert mit einem Faktor von 10 zu 1 bzw. 9 zu 1. Bei Fragen schreibt mir einen Kommentar!
Hier sind die beiden Objekte, falls ihr es selber ausprobieren wollt!
Pingback: Dynamics NAV 2016 – CU9 – Server Konfiguration Word / Excel Layout | Robert's Dynamics NAV Entwickler Blog
Pingback: Dynamics NAV 2016 – CU9 – Server Konfiguration RDLC Bericht – Word / Excel Export - Microsoft Dynamics NAV Community
Pingback: Dynamics NAV 2016 – CU9 – Server Konfiguration RDLC Bericht – Word / Excel Export - Robert's Dynamics NAV Entwickler Blog - Dynamics NAV Users