web
You’re offline. This is a read only version of the page.
close
Skip to main content
Community site session details

Community site session details

Session Id :

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

HILBE Profile Picture HILBE 300

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:

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

The post .NET – Modale Eingabeaufforderung – Ghostscript Komprimierung von PDF-Dateien first appeared on Robert's Dynamics NAV/BC Entwickler Blog.

This was originally posted here.

Comments

*This post is locked for comments