Sie erhalten einen gescannten Vertrags-PDF mit 80 MB. Er wird von E-Mails zurückgewiesen, von Chat-Apps abgelehnt und überschreitet die Upload-Limits jedes Systems, das Sie ausprobieren. Bekannt? PDF-Dateien werden aus einem bestimmten Grund groß, und sie sicher auf ein Zehntel ihrer Größe zu verkleinern ist keine Magie — es geht darum, zu verstehen, was sich im Container befindet, und die richtige Technik auf jeden Inhaltstyp anzuwenden. Dieser Artikel seziert fünf Kernkomprimierungstechniken aus der PDF-Spezifikation und führt dann durch einen realen gescannten Vertrag von 80 MB bis hinunter zu 8,2 MB.
1. Woher die PDF-Größe kommt
Ein PDF ist ein Containerformat. Intern ist es eine Sammlung von Objekten: ein Seitenbaum, Ressourcenwörterbücher, Inhaltsströme, Bild-XObjects, Schriftarten und Metadaten. Größenzuwachs lässt sich fast immer auf drei Kategorien zurückführen.
Eingebettete Bilder. Dies ist der dominierende Kostenfaktor bei gescannten Dokumenten. Ein Scanner, der standardmäßig auf 600 DPI eingestellt ist, erzeugt eine A4-Seitenbitmap mit etwa 4960×7016 Pixeln. Bei 24-Bit-Farbtiefe belaufen sich die Rohdaten einer einzelnen Seite auf rund 100 MB; selbst nach der verlustlosen FlateDecode-Komprimierung (zlib) wiegt jede Seite noch 2 bis 5 MB. Ein 30-seitiger Vertrag landet bei 60 bis 150 MB.
Eingebettete Schriftarten. Um eine identische Darstellung auf allen Geräten zu gewährleisten, betten PDFs vollständige Schriftartdateien ein. Eine vollständige CJK-Schriftart (beispielsweise ein Source-Han-Font) enthält über 20.000 Glyphen, und die TTF-Datei allein ist 10 bis 20 MB groß; OTF kann noch größer sein. Betten Sie mehrere Schnitte oder mehrere Familien ein, und diese Kategorie wächst schnell an.
Vektorgrafiken und redundante Objekte. Vektoren selbst sind klein, aber komplexe CAD-Exporte, verschachtelte Formularfelder, Ressourcen aus gelöschten Revisionen und duplizierte Metadatenströme häufen sich unbemerkt an. Der Mechanismus der inkrementellen Aktualisierung von PDF ist ein notorischer Übeltäter: Jedes Speichern hängt eine neue Revision an, ohne die alten Objekte zu entfernen, sodass die Datei mit jeder Bearbeitung wächst.
Sobald Sie wissen, wo die Bytes stecken, ergibt sich die Lösung von selbst. Die unten beschriebene Fünf-Schritte-Methode deckt die überwiegende Mehrheit realer Komprimierungsszenarien ab.
2. Die Fünf-Schritte-Methode auf einen Blick
Schritt 1: Bild-Resampling
Dies ist der wirksamste einzelne Schritt für gescannte Dokumente. Ein 600-DPI-Scan ist auf jedem normalen Bildschirm nicht von 150 DPI zu unterscheiden, doch die Pixelanzahl unterscheidet sich um den Faktor 16 (DPI ist linear; Pixel sind quadratisch, also (600/150)² ≈ 16).
Die entscheidende Wahl ist das Ziel-DPI. Dokumenteninhalte (Verträge, Berichte, Rechnungen) sehen bei 150 DPI gut aus. Für den Druck erhöhen Sie auf 200–300 DPI. Archivscans mit hoher Wiedergabetreue können 400 DPI und darüber beibehalten. Für den Resampling-Algorithmus ist Lanczos die empfohlene Wahl — es bewahrt die Schärfe der Textkanten beim Verkleinern besser als die bilineare Interpolation und vermeidet die Blockigkeit der nächsten-Nachbar-Methode.
Bei der Implementierung lesen Sie die /Width-, /Height- und DPI-Informationen des Bild-XObjects aus /DecodeParms aus, skalieren proportional und schreiben zurück. Stellen Sie sicher, dass Sie /Width, /Height und /Intent gemeinsam aktualisieren, da sonst die Darstellung fehlausgerichtet wird.
Schritt 2: Bildformatkonvertierung
PDF markiert die Bildcodierung mit dem Feld /Filter. Gescannte Dokumente verwenden typischerweise /FlateDecode (verlustfrei im PNG-Stil), das für realistische Bildinhalte wie Fotos oder gescannte Seiten weitaus weniger effizient ist als /DCTDecode (JPEG).
Derselbe A4-Scan, der unter FlateDecode 4 MB belegt, kann als JPEG der Qualität 72 auf 300–500 KB schrumpfen — eine Reduzierung um 85 % ohne wahrnehmbaren Unterschied auf dem Bildschirm. Zwei Dinge zu beachten: Konvertieren Sie Schwarz-Weiß-Dokumente vor der Codierung in Graustufen (/ColorSpace /DeviceGray), um die Größe erneut zu halbieren, und erhöhen Sie die JPEG-Qualität auf 80+ bei Seiten mit Unterschriften, damit die Federstriche intakt bleiben.
/DCTDecode ist nicht die einzige Option. Für Diagramme mit großen einfarbigen Flächen ist /JPXDecode (JPEG 2000) bei vergleichbarer Qualität kleiner, allerdings ist die Kompatibilität mit älteren Lesegeräten schlechter.
Schritt 3: Font-Subsetting
Das Einbetten einer vollständigen CJK-Schriftart kostet 10 MB oder mehr, aber ein 30-seitiger Vertrag verwendet möglicherweise nur 800 bis 1.500 verschiedene Zeichen. Font-Subsetting behält nur die Glyphen, die im Dokument vorkommen, und verwirft alles andere.
Eine per Subsetting reduzierte Schriftart schrumpft normalerweise auf 100–300 KB — eine Reduzierung von über 95 %. Das Vorgehen: Durchlaufen Sie den Inhaltsstrom jeder Seite, extrahieren Sie die Zeichen aus den Operatoren Tj und TJ, lösen Sie sie über die /ToUnicode-Tabelle auf, um die Menge der verwendeten Codepunkte zu erhalten, und verwenden Sie dann ein Schriftart-Werkzeug (wie fontTools), um eine neue Schriftartdatei zu erstellen, die nur diese Glyphen enthält.
Zwei Vorbehalte: CID-Schriftarten erfordern die Behandlung von /CIDToGIDMap, um eine Fehlausrichtung der Glyphen zu vermeiden, und per Subsetting reduzierte Schriftarten werden konventionsgemäß mit einem Präfix (wie ABCDEF+) umbenannt, um sie als Teilmengen zu markieren, was die Anzeige nicht beeinträchtigt.
Schritt 4: Redundante Objekte entfernen
Nach wiederholtem Bearbeiten, Zusammenführen und inkrementellem Speichern häufen PDFs „verwaiste" Objekte an — Ressourcen, die von neueren Revisionen überschrieben, aber nie aus der Querverweistabelle entfernt wurden. Typische Übeltäter: alte Bilder, die von keiner Seite mehr referenziert werden, ersetzte Schriftartenkopien, leere Ressourcenwörterbücher und duplizierte Metadatenströme.
Die Bereinigungslogik: Starten Sie beim Dokumentkatalog (/Root), durchlaufen Sie den Seitenbaum und die Ressourcen-Referenzkette in einer Tiefensuche, markieren Sie jedes erreichbare Objekt, bauen Sie dann die Querverweistabelle neu auf und verwerfen Sie die nicht erreichbaren. Dieser Schritt ist besonders wirksam bei Dokumenten, die oft bearbeitet wurden: Ein einzelner Durchlauf entfernt typischerweise 5 %–15 % der Größe, und in extremen Fällen angesammelter inkrementeller Aktualisierungen über 30 %.
Schritt 5: Linearisierung
Linearisierung reduziert nicht die Gesamtzahl der Bytes, reorganisiert aber die Dateistruktur, um die schnelle Web-Ansicht (Fast Web View) zu ermöglichen. Ein linearisiertes PDF platziert die für die erste Seite benötigten Objekte am Dateianfang und fügt Hinweistabellen ein, sodass ein Reader die erste Seite rendern kann, bevor der Download abgeschlossen ist.
Obwohl die Linearisierung die Datei nicht direkt verkleinert, ist sie der natürliche Abschlussschritt einer Komprimierungspipeline. In Kombination mit Objektstrom-Komprimierung und Querverweisströmen bringt die Gesamtumstrukturierung dennoch einen kleinen Größenrückgang (1 %–3 %). Noch wichtiger: Linearisierte PDFs schneiden in Web-Einbettungs- und Cloud-Vorschauszenarien spürbar besser ab.
3. Vorher-Nachher-Vergleich
So verändert sich der 80-MB-Vertrag nach jedem Schritt:
Schritt 1 (Resampling) bringt den größten Rückgang, von 80 MB direkt auf 15,2 MB. Schritt 2 (Formatkonvertierung) entfernt weitere 4 MB. Die verbleibenden drei Schritten zusammen kürzen etwa 7 MB. Das gesamte Komprimierungsverhältnis liegt bei etwa 9,8:1.
4. Python-Pseudocode
Der folgende Pseudocode zeigt die vollständige Fünf-Schritte-Logik. In der Produktion würden Sie Bibliotheken wie pikepdf, PyMuPDF und reportlab kombinieren.
import io
from PIL import Image
def compress_pdf(input_path, output_path,
target_dpi=150, jpeg_quality=72, grayscale=True):
"""
Einstiegspunkt der Fünf-Schritte-PDF-Komprimierung.
:param input_path: Eingabe-PDF-Pfad
:param output_path: Ausgabe-PDF-Pfad
:param target_dpi: Ziel-DPI (Standard 150, gut für Bildschirm)
:param jpeg_quality: JPEG-Qualität (Standard 72)
:param grayscale: in Graustufen konvertieren (empfohlen für S/W-Dokumente)
:return: (originalgröße, komprimierte_größe)
"""
pdf = open_pdf(input_path)
original_size = file_size(input_path)
# Schritt 1: Bild-Resampling (600 DPI -> Ziel-DPI)
for page in pdf.pages:
for image in page.images:
resampled = resample_image(image, target_dpi)
image.replace(resampled)
# Schritt 2: Formatkonvertierung (FlateDecode -> DCTDecode/JPEG)
for page in pdf.pages:
for image in page.images:
if image.filter == "FlateDecode":
jpeg_data = encode_jpeg(image, jpeg_quality, grayscale)
image.replace(jpeg_data, filter="DCTDecode")
# Schritt 3: Font-Subsetting (nur verwendete Glyphen behalten)
used_chars = collect_used_chars(pdf)
for font in pdf.fonts:
subset = build_subset(font, used_chars)
font.replace(subset)
# Schritt 4: redundante Objekte entfernen
pdf.remove_unreferenced_resources()
pdf.compact_xref() # Querverweistabelle neu aufbauen
# Schritt 5: Linearisierung (Fast Web View)
pdf.save(output_path, linearize=True,
object_streams=True, compress_streams=True)
pdf.close()
compressed_size = file_size(output_path)
return original_size, compressed_size
def resample_image(image, target_dpi):
"""Ein Bild auf das Ziel-DPI resamplen."""
src_dpi = image.dpi
if src_dpi <= target_dpi:
return image # niemals hochskalieren, überspringen
scale = target_dpi / src_dpi
new_w = int(image.width * scale)
new_h = int(image.height * scale)
pil_img = Image.open(io.BytesIO(image.data))
return pil_img.resize((new_w, new_h), Image.LANCZOS)
def encode_jpeg(image, quality, grayscale):
"""In Graustufen konvertieren und als JPEG codieren."""
pil_img = Image.open(io.BytesIO(image.data))
if grayscale and pil_img.mode != "L":
pil_img = pil_img.convert("L") # zu Graustufen
buf = io.BytesIO()
pil_img.save(buf, format="JPEG", quality=quality, optimize=True)
return buf.getvalue()
def collect_used_chars(pdf):
"""Inhaltsströme durchlaufen, um jeden tatsächlich verwendeten Codepunkt zu sammeln."""
used = set()
for page in pdf.pages:
for text_op in page.content_stream.text_ops:
used.update(extract_codepoints(text_op))
return used
def build_subset(font, used_chars):
"""Eine Subset-Schriftart erstellen, die nur die verwendeten Glyphen enthält."""
subset = font.subset(glyphs=used_chars)
subset.name = prefix + "+" + font.name # Namenskonvention für Subsets
return subset
Dies ist Pseudocode — Fehlerbehandlung, CID-Schriftart-Mapping und ToUnicode-Rekonstruktion werden weggelassen — aber das Gerüst ist klar: Resamplen, Konvertieren, Subset erstellen, Bereinigen, Linearisieren, in dieser Reihenfolge.
5. Fallstudie: Gescannter Vertrag von 80 MB auf 8,2 MB
Das Quelldokument ist ein realer chinesischer Vertrag mit 32 Seiten, gescannt bei 600 DPI, Originalgröße 80,4 MB.
Dokumentprofil:
- 32 Seiten, A4, 600-DPI-Schwarz-Weiß-Scan
- 32 eingebettete Bilder, alle FlateDecode, durchschnittlich 2,4 MB pro Seite
- 2 eingebettete Schriftarten (Source Han Serif Regular + Bold), zusammen 28 MB
- 3-mal inkrementell gespeichert, mit vorhandenen redundanten Objekten
Schritte und Parameter:
| Schritt | Operation | Schlüsselparameter | Größe |
|---|---|---|---|
| 1 | Bild-Resampling | 600 DPI → 150 DPI, Lanczos | 80,4 → 15,2 MB |
| 2 | Formatkonvertierung | FlateDecode → JPEG, Qualität 72, Graustufen | 15,2 → 11,0 MB |
| 3 | Font-Subsetting | 1.287 verwendete Glyphen behalten | 11,0 → 10,5 MB |
| 4 | Redundanz entfernen | Querverweistabelle neu aufbauen | 10,5 → 9,8 MB |
| 5 | Linearisierung | Object Stream + Fast Web View | 9,8 → 8,2 MB |
Ergebnis: 8,2 MB, ein Verhältnis von 9,8:1. Der Text ist scharf und lesbar, Unterschriften sind intakt, Tabellenrahmen zeigen keine Brüche, und die Datei druckt sauber.
6. DPI-Empfehlungen nach Szenario
Das Ziel-DPI ist der wichtigste Hebel, um Komprimierung und Lesbarkeit auszubalancieren. Die folgende Tabelle listet empfohlene Werte für gängige Anwendungsfälle.
| Anwendungsfall | Empfohlenes DPI | Bildgröße pro Seite | Hinweise |
|---|---|---|---|
| Bildschirmlese / Web-Vorschau | 150 | 150–300 KB | Scharfer Text, schnelles Laden, gut für E-Mail |
| Standarddruck (A4 Laser/Tinte) | 200–300 | 400–800 KB | Druckscharf; 300 für Verträge |
| Archivsicherung (hohe Wiedergabetreue) | 400–600 | 1–3 MB | Bewahrt Scandetails für langfristige Speicherung |
| Schwarz-Weiß nur Text | 150–200 | 80–200 KB | Extrem klein nach Graustufen, gut für Stapelarchivierung |
| Farbdokument mit Fotos | 200–300 | 500 KB–1,2 MB | JPEG-Qualität 75–85, balanciert Farbe und Größe |
Eine praktische Regel: Standardmäßig 150 DPI für den Bildschirm, 300 DPI nur beim Drucken und eine separate hochauflösende Masterdatei für die Archivierung aufbewahren. Versuchen Sie nicht, eine einzige 600-DPI-Datei für alle Zwecke zu verwenden.
7. FAQ
F1: Die komprimierte Datei wurde größer als das Original. Warum?
Dies geschieht normalerweise, wenn Sie ein PDF erneut komprimieren, das bereits kleine JPEG-codierte Bilder enthält. Resampling und Neucodierung haben einen Overhead: Wenn ein Bild bereits 150-DPI-JPEG ist, „resamplen" auf 150 DPI es nicht kleiner, und der neue JPEG-Encoder könnte weniger effizient sein als der ursprüngliche. Addieren Sie den Metadaten-Overhead durch die Umstrukturierung der Objektströme, und die Datei kann leicht anwachsen. Die Lösung: Untersuchen Sie vor der Komprimierung die aktuelle DPI und Codierung jedes Bildes und überspringen Sie Bilder, die das Ziel bereits erfüllen (≤150 DPI und JPEG). Verarbeiten Sie nur die Objekte, die den Schwellenwert tatsächlich überschreiten.
F2: Verschlechtert die Komprimierung die Bildqualität?
Ja, aber sie kann visuell unmerklich gehalten werden. Die verlustbehaftete Komprimierung stammt hauptsächlich aus Schritt 2 (JPEG-Codierung). Bei Qualität 72 ist der Unterschied auf dem Bildschirm unsichtbar; im Druck können Sie leichtes Ringing bei hochfrequenten Details wie dünnen Linien oder kleinen Schriftarten sehen. Wenn Qualität wichtiger ist, erhöhen Sie die JPEG-Qualität auf 85 oder wechseln Sie in den verlustfreien JPEG-2000-Modus (/JPXDecode mit reversibler Transformation). Font-Subsetting, Redundanzentfernung und Linearisierung sind alle verlustfrei und haben keinerlei Auswirkung auf die Anzeige.
F3: Kann ein bereits komprimiertes PDF erneut komprimiert werden?
Ja, aber mit abnehmendem Ertrag. Der erste Durchlauf erntet die niedrig hängenden Früchte (hohes DPI, FlateDecode-Codierung, vollständige Schriftarten). Der zweite Durchlauf hat wenig zu optimieren. Zur Beurteilung: Prüfen Sie, ob Bilder noch das Ziel-DPI überschreiten, ob noch eine Nicht-JPEG-Codierung vorhanden ist und ob Schriftarten noch vollständige Sätze sind. Wenn alle drei bereits optimal sind, beruht eine weitere Komprimierung hauptsächlich auf Redundanzentfernung und Linearisierung und spart typischerweise nur 5 %–10 %. Komprimieren Sie ein bereits optimiertes PDF nicht wiederholt — jede verlustbehaftete Codierung häuft Qualitätsverlust an.
8. Schnellreferenz der Parameter
| Parameter | Empfohlener Wert | Hinweise |
|---|---|---|
| Ziel-DPI (Bildschirm) | 150 | Standard für Dokumenteninhalt |
| Ziel-DPI (Druck) | 300 | Hält A4-Druck scharf |
| JPEG-Qualität (Bildschirm) | 70–75 | Größe zuerst, Lesbarkeit ausreichend |
| JPEG-Qualität (Druck) | 80–90 | Qualität zuerst, Größe zweitrangig |
| Farbmodus (S/W-Dokument) | DeviceGray | Halbiert die Größe gegenüber Farbe |
| Font-Subsetting | Aktiviert | Obligatorisch für CJK-Schriftarten, 95 %+ Reduzierung |
| Linearisierung | Aktiviert | Verbessert die Web-Vorschau-Erfahrung |
| Object Stream | Aktiviert | Komprimiert Objektmetadaten |
| Redundanzbereinigung | Aktiviert | Besonders wirksam bei wiederholt bearbeiteten Dateien |
Fazit
PDF-Komprimierung ist keine schwarze Kunst — sie ist eine gezielte Behandlung für jeden Objekttyp innerhalb der Datei. Die Fünf-Schritte-Methode folgt einer klaren Logik: Behandeln Sie zuerst den größten Beitragszahler (Bilder, durch Resampling und Formatkonvertierung), dann die Schriftarten (Subsetting), dann die Struktur (Redundanzentfernung und Linearisierung). Wenden Sie diese Pipeline auf einen typischen gescannten 80-MB-Vertrag an, und Sie landen zuverlässig bei 8–10 MB mit voller Lesbarkeit und Druckbarkeit.
Drei Prüfungen, an die Sie sich erinnern sollten: Bei Scans zuerst auf das DPI schauen; bei Dokumenten prüfen, ob Schriftarten vollständige Sätze sind; bei alten Dateien auf redundante Objekte untersuchen. Finden Sie den dominierenden Kostenfaktor, und das Komprimierungsverhältnis ergibt sich von selbst.
Weiterführende Lektüre:
- PDF-Komprimierungsprinzipien und -methoden: Wie Sie die PDF-Größe effektiv reduzieren
- Vollständiger Leitfaden zur Dateikomprimierung: Prinzipien und Methoden der PDF/Bild/Video/Dokument-Komprimierung
Dateien komprimieren? Probieren Sie SmartSlim
Basierend auf einer selbstentwickelten Rust-Kompressions-Engine, unterstützt über 40 Formate in 10 Kategorien wie PDF, Bilder, Video, Office und OFD. Die Komprimierung erfolgt lokal, ohne dass Daten Ihre Umgebung verlassen.