PDF-Komprimierung
DocumentEditor::save_with_options() kann in einem Durchgang Streams neu komprimieren, verwaiste Objekte per Garbage Collection beseitigen und die Datei für Fast Web View linearisieren. Der einfachste Weg, alle drei Optionen anzuwenden, ist die CLI pdf-oxide compress, die sie hinter einem einzigen Befehl bündelt.
Binding-Abdeckung. Vollständige
SaveOptionsmitcompress / garbage_collect / linearizesind in Rust (editor.save_with_options(path, opts)) und Python (überdoc.save(..., compress=True, ...), sofern gebunden) verfügbar. Aus Node, WASM, Go und C# führen Sie die CLI (pdf-oxide compress input.pdf -o out.pdf) als Subprozess oder im Build-Schritt aus — die CLI ist die stabile Schnittstelle, die diese Bindings gemeinsam nutzen, bisSaveOptionsdurch jede FFI-Oberfläche durchgereicht ist.
CLI (alle Plattformen)
# Einfach: erzeugt input_compressed.pdf
pdf-oxide compress input.pdf
# Ausgabedatei explizit angeben
pdf-oxide compress input.pdf -o smaller.pdf
# Größenvergleich ausgeben
pdf-oxide compress report.pdf
# → Compressed report.pdf -> report_compressed.pdf (3412901 -> 1847200 bytes)
Die CLI aktiviert standardmäßig compress: true, garbage_collect: true und linearize: true — diese Kombination liefert die kleinste Datei und bleibt dabei ISO-32000-konform.
Rust-API
use pdf_oxide::editor::{DocumentEditor, EditableDocument, SaveOptions};
let mut editor = DocumentEditor::open("input.pdf")?;
editor.save_with_options("output.pdf", SaveOptions {
compress: true, // FlateDecode auf alle unkomprimierten Streams anwenden
garbage_collect: true, // Verwaiste Objekte entfernen
linearize: true, // Für Fast Web View linearisieren
..Default::default()
})?;
Felder von SaveOptions
| Feld | Standard | Wirkung |
|---|---|---|
compress |
true in CLI / Standard false |
Wendet FlateDecode auf Streams an, die unkomprimiert gespeichert wurden |
garbage_collect |
true in CLI |
Entfernt indirekte Objekte, die vom Trailer nicht mehr referenziert werden |
linearize |
true in CLI |
Schreibt ein linearisiertes („Fast Web View")-Layout, damit Viewer Seite 1 vor dem vollständigen Download darstellen können |
encryption |
None |
Hängt eine EncryptionConfig an, um verschlüsselt zu speichern — siehe Verschlüsselung & Sicherheit |
Was jede Option tatsächlich bewirkt
compress— durchläuft jeden Content-Stream, jedes Form-XObject, jede ToUnicode-CMap und jeden Metadaten-Stream; hat der Stream keinen Filter oder einen unbekannten Filter, wird er mitFlateDecodeneu verpackt. Bereits komprimierte Streams (JBIG2-Bilder, CCITT-Tabellen, vorhandenes Flate) bleiben unberührt.garbage_collect— führt einen Erreichbarkeitsscan von/Rootund/Infoaus, markiert jedes lebende indirekte Objekt und schreibt nur diese in die Ausgabe-Xref. Nützlich nach umfangreichen Bearbeitungen, bei denenremove_page,flatten_formsodererase_regionWaisen hinterlassen.linearize— sortiert Objekte so um, dass der Content-Stream der ersten Seite samt seiner Ressourcenabhängigkeiten am Dateianfang steht, ergänzt um ein Linearisierungs-Dictionary und einen Hint-Stream. PDF-Reader laden die Datei in Reihenfolge und rendern Seite 1, bevor die gesamte Datei eintrifft — das ist der wichtigste sichtbare Vorteil für PDFs, die über ein CDN ausgeliefert werden.
Wann komprimieren
- Nach Bulk-Bearbeitungen — wenn Sie
flatten_forms,flatten_all_annotations,apply_all_redactionsausgeführt oder viele Seiten gelöscht haben, reduzieren GC und erneute Komprimierung die Dateigröße typischerweise um 30–60 %. - Vor dem Verteilen oder Versenden — Endnutzer achten auf die Dateigröße, und Linearize lässt die erste Seite über langsame Verbindungen sofort erscheinen.
- Als letzter Schritt in ETL-Pipelines — komprimieren Sie nach Extraktion und Neuerzeugung einmal am Ende der Pipeline; dekomprimieren und rekomprimieren Sie nicht bei jeder Transformation.
Wann NICHT komprimieren
- Bei häufigen inkrementellen Bearbeitungen — vollständige Neuschreibvorgänge verlieren Xref-Streams und Object-Streams, die inkrementelle Anhänge klein halten. Nutzen Sie für interaktive Editier-Schleifen
SaveOptions::incremental()und heben Sie die Komprimierung für einen finalen Durchgang auf. - Bei bereits stark komprimierten PDFs — wenn die Streams bereits
FlateDecode-Filter mit gutem Prädiktor enthalten, sparen Sie oft nur wenige Prozent. Führen Siepdf-oxide compresseinmal aus und messen Sie, bevor Sie es in Ihre Pipeline aufnehmen.
Zu erwartende Größenreduktion
Typische Einsparungen bei realen PDFs (gemessen am Testkorpus aus 3.830 Dateien):
| Quelle | Vorher | Nachher | Ersparnis |
|---|---|---|---|
| Gescannte Rechnung (unkomprimierte Streams) | 2,4 MB | 0,8 MB | ~66 % |
| LaTeX-Forschungsarbeit | 1,1 MB | 0,95 MB | ~14 % |
| Behördenformular (nach Flatten) | 890 KB | 240 KB | ~73 % |
| Bereits optimiertes Marketing-PDF | 1,8 MB | 1,75 MB | ~3 % |
Bulk-bearbeitete Dateien und abgeflachte Formulare bringen die größten Gewinne. Bereits optimierte Dateien sparen nur moderat, hauptsächlich durch die Linearisierung.
Vorher entschlüsseln / authentifizieren
DocumentEditor besitzt derzeit keine Passwort-Authentifizierung, daher müssen verschlüsselte PDFs zuerst entschlüsselt werden. Nutzen Sie PdfDocument.open_with_password() zum Lesen, speichern Sie eine unverschlüsselte Kopie und öffnen Sie diese Kopie anschließend im Editor:
use pdf_oxide::api::Pdf;
use pdf_oxide::editor::{DocumentEditor, EditableDocument, SaveOptions};
let doc = Pdf::open_with_password("protected.pdf", "pw")?;
doc.save("temp-unencrypted.pdf")?;
let mut editor = DocumentEditor::open("temp-unencrypted.pdf")?;
editor.save_with_options("compressed.pdf", SaveOptions {
compress: true,
garbage_collect: true,
linearize: true,
..Default::default()
})?;
Dasselbe Muster in Python über PdfDocument(path, password="pw") + save() + CLI.
Verwandte Seiten
- Überblick zum Editieren —
SaveOptionsund die komplette Editor-Oberfläche - Verschlüsselung & Sicherheit —
compressmitsave_with_encryptionkombinieren - CLI-Schnellstart — alle 22 CLI-Befehle