.NET – Modale Eingabeaufforderung – Ghostscript Komprimierung von PDF-Dateien

Von | 5. März 2016

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.

NET_1_Auftragsbestätigung

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.

NET_2_PDFGröße

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:

NET_3_GS_2

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.

NET_4_AB_NoOfCopies

Nun erstelle ich eine neue Codeunit und erzeuge eine PDF über alle Aufträge im System mit jeweils 30 Kopien.

NET_5_AB_PDFErstellung

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).

NET_6_AB_Datei

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

NET_7_GS_Komprimierung

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:

NET_8_GS_KomprimierungErgebnis

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!

160305_PDF_Ghostscript_Komprimierung

3 Gedanken zu „.NET – Modale Eingabeaufforderung – Ghostscript Komprimierung von PDF-Dateien

  1. Pingback: Dynamics NAV 2016 – CU9 – Server Konfiguration Word / Excel Layout | Robert's Dynamics NAV Entwickler Blog

  2. Pingback: Dynamics NAV 2016 – CU9 – Server Konfiguration RDLC Bericht – Word / Excel Export - Microsoft Dynamics NAV Community

  3. Pingback: Dynamics NAV 2016 – CU9 – Server Konfiguration RDLC Bericht – Word / Excel Export - Robert's Dynamics NAV Entwickler Blog - Dynamics NAV Users

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert