PDF komprimieren mit PyPDF2

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pflaf
User
Beiträge: 10
Registriert: Samstag 20. November 2021, 21:02

Hallo zusammen, in Ermangelung einer schnellen Internetverbindung habe ich mich gerade daran gesetzt ein Skript zu schreiben mit dem ich pdfs konvertieren kann. Ich habe dazu die library PyPDF2 verwendet das die compress_content_streams() Funktion besitzt. Wenn ich den Code wie unten aufgeführt ausführe, wird das pdf aber nur minimal komprimiert.

Code: Alles auswählen

import PyPDF2

reader = PyPDF2.PdfReader("ABC.pdf")
writer = PyPDF2.PdfWriter()

for page in reader.pages:
    page.compress_content_streams()
    writer.add_page(page)

with open("out2.pdf", "wb") as f:
    writer.write(f)
Ich habe es mit einem pdf mit 64 KB versucht, das auf 63 KB komprimiert wird und ein großes mit 57600 KB hat, das auf 57516 KB reduziert wurde.

Ich habe bisher erfolglos versucht die for Schleife in eine weitere for Schleife zu packen, aber das hat nur dazu geführt, dass das ausgegebene pdf jede Seite mehrfach hat. Für die compress_content_streams() Funktion gibt es laut Dokumentation keine Parameter die ich einsetzen könnte.

Habe ich etwas übersehen oder ist die library einfach ungeeignet?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Es gibt keine Magische Funktion, die beliebige Dateien beliebig klein macht. PDFs sind im Normalfall bereits komprimiert, so dass so ein Aufruf nichts bewirkt.
Das "Große" bei PDF-Dateien sind oft Bilder, und da kann man entweder das Format ändern, Farben oder Auflösung reduzieren oder die Qualität verringern, um die Datei kleiner zu machen.
Ob man mit den Qualitätseinbußen leben kann, mag vom Einzelfall abhängen.
Dafür gibt es bestimmt schon einige Tools in den weiten des Internets, so dass man dafür nichts selbst programmieren muß.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pflaf: Geeignet für was? Es gibt nichts was Dir PDFs auf magische Weise verlustfrei kleiner machen kann. Komprimieren bringt nur wirklich etwas wenn die Daten vorher unkomprimiert waren, sonst kommt man da logischerweise bei ±0 bei raus. Das ist als wenn Du ein ZIP-Archiv nimmst, alles entpackst und in ein neues ZIP-Archiv packst. Unter der Annahme das die gleiche Kompressionsart verwendet wird, kann sich das auch kaum in der Grösse unterscheiden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
pflaf
User
Beiträge: 10
Registriert: Samstag 20. November 2021, 21:02

__blackjack__ hat geschrieben: Donnerstag 23. Juni 2022, 10:21 Komprimieren bringt nur wirklich etwas wenn die Daten vorher unkomprimiert waren
Sind pdfs denn prinzipiell schon komprimiert?

Ich denke dabei an onlinetools wie smallpdf.com oder online2pdf.com, also Tools die die Qualität des pdfs verringern, so dass ich sie per Mail verschicken kann. Dabei wird die Qualität der Bilder, aber auch die Qualität der Buchstaben deutlich sichtbar reduziert.

Wofür ist die Funktion die ich in meinem Code verwendet habe denn sonst überhaupt gut?

Edit: Jetzt verstehe ich: Ich habe komprimieren als Synonym für die Verkleinerung der Dateigröße verwendet, das war natürlich falsch. Die Qualität darf (soll) dabei natürlich abnehmen.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
aber auch die Qualität der Buchstaben deutlich sichtbar reduziert.
Aber nur, wenn der Text nicht als Text vorliegt, sondern als Bild (z.B. wenn du ein gescanntes Dokument hast). PDF ist ein vektorbasiertes Format, d.h. es skaliert grundsätzlich beliebig _ohne_ Qualtitätseinbuße. Das gilt natürlich nicht für pixelbasierte Bilder, die ggf. eingebaut sind. Da kannst du die Auflösung, Farbetiefe etc runter schrauben.

Wenn du ein richtig generiertes PDF nur mit Text hast (z.B. auf LibreOffice oder Word heraus generiert) sind in dem PDF "nur" Zeichen, Informatonen zur Farbe und Positionsangaben drin. Da ist hat nicht viel zu komprieren.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pflaf: In der Regel sind PDFs heute schon komprimiert. Das war früher mal anders als komprimieren mit dem Deflate-Algorithmus noch spürbar Rechenzeit gebraucht hat und man sich beim erstellen von PDFs zwischen höherer Geschwindigkeit und kleinerer Dateigrösse entscheiden musste. Und es gab/gibt Programme die PDFs erzeugen und dabei auf Komprimierung verzichten, weil sie keine externe Bibliothek dafür einbinden wollen. Unkomprimiert sind PDF-Dateien im Grunde Textdateien. Es ist schwierig die von Hand in einem Texteditor zu schreiben, weil einige Angaben exakte Bytepositionen innerhalb der Datei sein müssen, das will man nicht selbst verwalten und anpassen. Aber programmatisch kann man PDFs in nahezu jeder Programmiersprache erstellen, die Textdateien schreiben kann.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
pflaf
User
Beiträge: 10
Registriert: Samstag 20. November 2021, 21:02

Ich vermute, dass auf diesen Seiten die Vektorgrafik in eine Pixelgrafik umgewandelt wird. Ist dadurch also keine Reduktion des benötigten Speichers möglich?
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was heißt denn "diesen Seiten"?
Ist dadurch also keine Reduktion des benötigten Speichers möglich?
Das kommt drauf an, wie komplex und bunt die Grafik ist und welches Zielformat mit welcher Qualitätsstufe man für die Pixel-basierte Grafik nimmt. Sprich: kann größer, kann kleiner werden - oder so gut wie keinen Einfluss haben.

Gruß, noisefloor
MartinThoma
User
Beiträge: 4
Registriert: Samstag 25. Juni 2022, 11:30

Hiho,

Ich bin Martin, der maintainer von PyPDF2. Falls du Englisch sprichst würde ich dir raten eine Diskussion auf https://github.com/py-pdf/PyPDF2/discussions
Zu öffnen.

Ich hab mir nicht alles durchgelesen, aber ein paar Punkte sind hier wichtig:

1. Es gibt verlustfreie und verlustbehaftete Kompression. PyPDF2 kann (und wird auch in Zukunft) nur verlustfrei komprimieren. In pdf Dateien sind ggf Bilder. Diese können ggf verlustbehaftete komprimiert werden.
2. PDFs können beliebig viele ungenutzte Objekte beinhalten. Aktuell prüft PyPDF2 das noch nicht. Es gibt aber einen pr dazu den ich vermutlich in den nächsten 3 Wochen prüfe / ggf aufnehme
3.Du kannst immer container Formate wie zip nehmen
MartinThoma
User
Beiträge: 4
Registriert: Samstag 25. Juni 2022, 11:30

https://github.com/py-pdf/PyPDF2/pull/207 ist ein verlustfreier Weg um das PDF kleiner zu schreiben: Objekte nicht mehrfach in die PDF schreiben.

Wenn also ein Bild 10x genutzt wird, dann kann man es entweder nur ein mal in die PDF schreiben und dann referenzieren. Oder man kann es halt 10x direkt in die PD schreiben. Mit diesem PR werden Objekte hoffentlich nur noch ein mal geschrieben.
MartinThoma
User
Beiträge: 4
Registriert: Samstag 25. Juni 2022, 11:30

Ich habe gerade den PR 207 gemerged und die docs erweitert: https://pypdf2.readthedocs.io/en/latest ... -size.html

Vorraussichtlich werde ich am 4. Juli das Release mit PR 207 machen.
pflaf
User
Beiträge: 10
Registriert: Samstag 20. November 2021, 21:02

Okay ich die Diskussion hat meinen Kompetenzbereich verlassen ich versteh nur noch Bahnhof :D
was heißt denn "diesen Seiten"?
Ich meine websites die die Dateigröße von pdfs verkleinern. smallpdf.com zum Beispiel. Da kann ich ein pdf hochladen und auswählen wie stark die Dateigröße reduziert werden soll. So wie ich das sehe werden die pdfs in pixelgrafiken konvertiert, zumindest ist die qualität deutlich niedriger, auch bei reinem Text.
Das kommt drauf an, wie komplex und bunt die Grafik ist und welches Zielformat mit welcher Qualitätsstufe man für die Pixel-basierte Grafik nimmt. Sprich: kann größer, kann kleiner werden - oder so gut wie keinen Einfluss haben.
Heißt diese Seiten wandeln die Vektorgrafik in eine Pixelgrafik um und je nach dem welche Auflösung diese Pixelgrafik hat, wird die resultierende Datei größer oder kleiner?
Ich bin Martin, der maintainer von PyPDF2. Falls du Englisch sprichst würde ich dir raten eine Diskussion auf https://github.com/py-pdf/PyPDF2/discussions
Zu öffnen.
Danke für deine Antwort! Ich glaube so einer Diskussion könnte ich nicht folgen, dafür habe ich zu wenig Hintergrundwissen zu pdfs...
PyPDF2 kann (und wird auch in Zukunft) nur verlustfrei komprimieren. In pdf Dateien sind ggf Bilder. Diese können ggf verlustbehaftete komprimiert werden.
Aber für was genau ist die Komprimierungsfunktion denn dann da? Das verstehe ich nicht so richtig. Und was genau bedeutet verlustfrei an dieser Stelle? Wenn ich ein pdf reingebe und es nach der Komprimierung noch die gleiche Größe hat, was genau hat die Funktion dann für einen Nutzen? Ich habe das Gefühl, dass die Funktion gar nicht für das gedacht ist, wofür ich sie nutzen will, aber ich verstehe nicht, wofür sie tatsächlich gedacht ist.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du verstehst verlustfrei falsch. Ein 1000*1000 Pixel RGB Bild hat per Definition 3MB Daten. Die heute ueblichen 12MPixel also entsprechend 36MB. Sowas schickst du aber nicht durch die Gegend. Sondern benutzt verschiedene Formate. Und da gibt es welche, die komprimieren so,
dass immer noch die *exakt gleichen* Pixel wieder hergestellt werden. Also verlustfrei. ZB PNG. Und dann gibt es welche, die lassen Informationen weg, die auch nicht wieder rekonstruierbar sind. Die verkleinern deutlich mehr, aber es sind eben Verluste entstanden. Anders als du glaubst hat eine Kompression ohne Verlust also durchaus einen Nutzen. Aber nur so weit. Verlustbehaftet geht *viel* weiter.

Und das kannst du auch machen: deine eingebetteten Bilder von zB PNGs auf JPEGs wandeln. Ob das wirklich geht, haengt davon ab, ob die Bildinhalte dazu geeignet sind. Fotorealistische Materialien ueblicherweise sehr gut, Liniengrafiken nicht so.
pflaf
User
Beiträge: 10
Registriert: Samstag 20. November 2021, 21:02

Anders als du glaubst hat eine Kompression ohne Verlust also durchaus einen Nutzen.
Der Nutzen ist doch auch bei verlustfreier Komprimierung der kleinere benötigte Speicherplatz, richtig? Genau das ist ja, was ich erreichen wollte aber nicht konnte. Wenn der Speicher aber nur um ca 2% reduziert wird bringt das ja im Alltag keinen Vorteil. Deswegen die frage nach dem Alltagsnutzen dieses Tools.

Oder stehe ich gerade total auf dem Schlauch? :?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast behauptet, das verlustfrei frei von Kompression waere. Diesem Missverstaendnis habe ich abhelfen wollen. Jedes Kompressionsverfahren hat notwendigerweise ein unteres Limit, unterhalb dessen keine Kompression mehr erreicht wird, sondern sogar im Gegenteil eine Vergroesserung der Datenmenge. Alles andere waere unlogisch: man koennte so lange kompriemieren, bis die gesamten Daten der Welt in 1 Bit passen. Was recht offensichtlich nicht geht. Daher kann auch sowas wie nur 2% kommen, aber das ist wahlweise eben ein Randfall (weil die Daten nicht weiter komprimierbar sind), *oder* es ist eine Fehlbedienung. Das es da draussen ein Kompressionsverfahren gibt, dass grundsaetzlich nur 2% Kompression erlaubt, halte ich fuer eher ausgeschlossen. Es ist also eines dieser beiden Moeglichkeiten.
pflaf
User
Beiträge: 10
Registriert: Samstag 20. November 2021, 21:02

Ich werde bei Gelegenheit noch ein paar mehr PDFs probieren. Dass eine Fehlbedienung vorliegt kann ich nicht ausschließen, aber dann wäre ich etwas verwundert über die sehr knapp formulierte Dokumentation. Ich finde keine Angaben dazu, wie ich einen Befehl für eine größere Kompression an das Programm übergeben kann und habe auch keine Möglichkeit gefunden die Kompression mit einer Schleife mehrfach auszuführen.

Edit: Danke für deine geduldigen Erklärungen!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@pflaf: Du hast immer noch nicht verstanden, wie Kompression funktioniert. Mehrfach Komprimieren funktioniert nicht, denn könnte man Daten immer kleiner machen, dann könnte man ja beliebige Information in ein Byte packen.
PDF-Dateien sind normalerweise immer schon komprimiert, die Funktion kann da also wirklich die Dateigröße nicht wesentlich reduzieren.
pflaf
User
Beiträge: 10
Registriert: Samstag 20. November 2021, 21:02

Sirius3 hat geschrieben: Dienstag 26. Juli 2022, 18:31 @pflaf: Du hast immer noch nicht verstanden, wie Kompression funktioniert. Mehrfach Komprimieren funktioniert nicht, denn könnte man Daten immer kleiner machen, dann könnte man ja beliebige Information in ein Byte packen.
PDF-Dateien sind normalerweise immer schon komprimiert, die Funktion kann da also wirklich die Dateigröße nicht wesentlich reduzieren.
Bei der verlustfreien Komprimierung verstehe ich dass das nicht weiter geht. Aber gilt das auch für die verlustbehaftete Komprimierung? Wenn ich die Verluste immer stärker rechne müsste das doch (zumindest rein technisch) möglich sein.
(Ich weiß nicht welche Art dieses Package verwendet)
Bei dem Onlinetools die ich bisher immer verwendet habe, war es tatsächlich möglich das komprimierte PDF wieder rein zu geben und weiter zu komprimieren.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei verlustbehafteter Kompression ist es sogar schädlich, das mehrfach zu machen. Einmal auf die gewünschte Qualität reduzieren, und man erhält das bestmögliche Ergebnis.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Natuerlich geht das nicht, die gleiche Ueberlegung greift auch da. Ein Bild kannst du natuerlich auf rein schwarz/weiss komprimieren, und das dann nur mit einem Bit darstellen. Aber wie sinnvoll ist denn das?

Wenn es Services gibt, die das weiter machen, dann haben die sich Stellschrauben geschafft, die eben weitergehen. ZB Bildaufloesungen so radikal zu verringern, dass man dann auch immer weniger erkennt. Wenn dann das Resultat nicht mehr mit dem Original wenigstens grob vergleichbar ist, dann ist das auch keine sinnvolle Kompression mehr.
Antworten