Laden...

[Gelöst] Verringerung von PDF-Dateien durch Kompression

Erstellt von emuuu vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.600 Views
emuuu Themenstarter:in
286 Beiträge seit 2011
vor 6 Jahren
[Gelöst] Verringerung von PDF-Dateien durch Kompression

Guten Abend zusammen,

ich habe mir gerade für einen meiner Anwendungsfälle mal ein paar Gedanken gemacht und hätte dazu mal eine Frage ob damit schon jemand Erfahrungen hat:

Ich generiere momentan PDF-Dateien via iTextSharp, wobei diese aus ca 5000 Seiten bestehen, die vom Layout (Spalten, Logos, usw) her alle gleich sind und sich jeweils nur im Text etwas unterscheiden (ca 50% des Textes ist statisch). Nun wird nach meiner aktuellen Methode jede Seite für sich alleine generiert und dann einfach ein (sehr) großes PDF-Dokument erstellt. Wenn eine Seite also 10kB groß ist, ist meine PDF-Datei danach ca 50MB groß.

Mein Gedanke dazu wäre nun: Das müsste doch ein idealer Anwendungsfall für Kompression sein, da ca 70% der gesamten Seite immer identisch ist.

Nun habe ich mit PDF generell und iTextSharp im speziellen nicht so viel Erfahrung. Daher meine Frage: Hat das schonmal jemand gemacht oder sonstige Erfahrungen wie ich meine Dateigrößen effektiv verringern kann.

Schonmal vielen Dank und einen schönen Abend

Edith: Bitte zu Officetechnologien verschieben, hab im falschen Tab auf neues Thema geklickt ^^

2+2=5( (für extrem große Werte von 2)

16.807 Beiträge seit 2008
vor 6 Jahren

Hast Du Dir denn einfach mal die Doku zu iTextSharp und Compression angeschaut?
Viele Methoden nehmen den PdfStream.BEST_COMPRESSION Parameter an, zB. SetPageContent

Kompression geht halt insbesondere bei Bildern immer direkt auf die Qualität.

C
2.121 Beiträge seit 2010
vor 6 Jahren

Meines Wissens unterstützt pdf die mehrmalige Verwendung eines Bilds. Es ist nur einmal in der Datei enthalten und kann beliebig oft vorkommen.
Wenn du wirklich pro Seite 10 kB mehr hast, könnte das das Logo sein das für jede Seite erneut ins pdf aufgenommen wird.
Nimm die Logos auf jeder Seite testweise raus, an der Größe des Ergebnisses siehst du dann ob diese Vermutung stimmt.
Was man dazu tun muss damit das so eingebunden weiß ich leider nicht. An irgendetwas muss iTextSharp wahrscheinlich erkennen dass das Bild jedes mal das selbe Objekt ist, statt immer ein neues.

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 6 Jahren

An dem Punkt, dass die Datei einfache Seitengröße * Seitenzahl groß ist war ich ja schon.

Habe gerade einfach mal eine Seite gebaut (komplett via Code, keine Templates oder so) und eine Datei die diese Seite 100x enthält generieren lassen:
Einzelne Seite: 159kb
Komplette Datei: 15,7Mb (trotz BEST_COMRESSION)
Enthalten sind nur Text und zwei Bilder.

Und ich finde leider nichts was hier irgendwie dokumentiert, wie ich das Ergebnis verbessern kann.

2+2=5( (für extrem große Werte von 2)

W
955 Beiträge seit 2010
vor 6 Jahren

Du kannst mal das PDF mit einem anderen Werkzeug generieren (vllt das PDF in einem PDF-Printer drucken) um zu schauen ob es dann weniger Speicher verbraucht, also iTextSharp ineffizient arbeitet.

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 6 Jahren

Habe gerade bei Stackoverflow was dazu gefunden, dass wohl die Art wie ich die Datei generiere "schlecht" ist (einfach eine Schleife die jeweils eine Seite erzeugt).
Dadurch schaffe ich dann sehr viele Redundanzen die die Datei groß machen und wo auch die eingebaute Kompression nix bringt.

Ich muss also iTextSharp davon überzeugen, dass es die redundanten Objekte nur einmal hinzufügt und dann nur noch Verweise darauf erstellt.

Dazu finde ich aber keine Doku :<

Zum vorherigen Post:
Soweit ich gelesen habe ist iText da relativ effizient, das Problem liegt wohl in meiner Art die Datei zu generieren.

Edit:
Ist gelöst:
iTextSharp ist sehr viel intelligenter als man meinen mag. Wenn ich das Bild vor der Schleife instanziere und dann immer nur die Instanz aufrufe, wird dies auch so in der PDF-Datei umgesetzt.

Ich instanziere jetzt also alle redundanten Objekte zu Beginn und rufe dann immer nur die benötigte Instanz auf. Dadurch konnte ich im aktuellen Beispiel die Dateigröße von 15,7Mb auf 1Mb verringern.

2+2=5( (für extrem große Werte von 2)