Bestes Rust-PDF-Crate 2026
PDF Oxide direkt gegen die bekanntesten Rust-PDF-Crates: lopdf, printpdf, pdf-rs und pdf_extract. Jedes Crate bedient eine andere Abstraktionsebene und andere Anwendungsfälle — diese Seite hilft Ihnen, das richtige für Ihr Projekt zu finden.
Zusammenfassung
| PDF Oxide | lopdf | printpdf | pdf-rs | pdf_extract | |
|---|---|---|---|---|---|
| API-Ebene | High-Level | Low-Level | Mid-Level (Erstellung) | Low-Level (Lesen) | Mid-Level (Lesen) |
| PDFs lesen | Ja | Ja | Nein | Ja | Ja |
| PDFs schreiben | Ja | Ja | Ja | Nein | Nein |
| Textextraktion | Ja (High-Level) | Manuell | Nein | Manuell | Ja (grundlegend) |
| Bildextraktion | Ja (High-Level) | Manuell | Nein | Manuell | Nein |
| Formularfelder | Lesen + Schreiben | Manuell | Nein | Nur Lesen | Nein |
| PDF-Erstellung | Ja | Ja | Ja | Nein | Nein |
| Markdown-/HTML-Eingabe | Ja | Nein | Nein | Nein | Nein |
| Bestehende PDFs bearbeiten | Ja | Ja (Low-Level) | Nein | Nein | Nein |
| Annotationen | Lesen + Schreiben | Manuell | Nein | Nur Lesen | Nein |
| Verschlüsselung | Lesen + Schreiben | Nein | Nein | Nein | Nein |
| PDF/A-Validierung | Ja | Nein | Nein | Nein | Nein |
| Rendering | Ja (tiny-skia) | Nein | Nein | Teilweise | Nein |
| Python-Bindings | Ja | Nein | Nein | Nein | Nein |
| Lizenz | MIT | MIT | MIT | MIT | Apache-2.0 |
Alle Bibliotheken sind permissiv lizenziert. Die Unterschiede liegen im Umfang und der Abstraktionsebene.
Leistungsvergleich
Vollständiger Korpus-Benchmark (3.830 PDFs)
Getestet auf dem vollständigen Korpus von 3.830 PDFs — drei unabhängige, öffentlich verfügbare Testsuiten, die PDF-Spezifikationskonformität (veraPDF, 2.907 Dateien), reale Browser-Rendering-Grenzfälle (Mozilla pdf.js, 897 Dateien) und Sicherheits-/Robustheitsstress-Tests einschließlich fehlerhafter Strukturen und durch Fuzzing generierter Korruption (DARPA SafeDocs, 26 Dateien) abdecken. Siehe vollständige Korpusdetails.
| Bibliothek | Durchschnitt | p99 | Erfolgsrate | Textextraktion | Anmerkungen |
|---|---|---|---|---|---|
| PDF Oxide | 0,8ms | 9ms | 100% | Integriert, produktionsreif | Unicode, CJK, Lesereihenfolge |
| oxidize_pdf | 13,5ms | 11ms | 99,1% | Grundlegend | 48s maximaler Ausreißer |
| unpdf | 2,8ms | 10ms | 95,1% | Grundlegend | 185 Fehler im gesamten Korpus |
| pdf_extract | 4,08ms | 37ms | 91,5% | Grundlegend | Fehlt bei komplexen Layouts |
| lopdf | 0,3ms | 2ms | 80,2% | Keine integrierte Extraktion | Scheitert bei 20% der PDFs |
lopdf ist schneller bei den PDFs, die es parsen kann — aber es scheitert bei 20% des Korpus und bietet keine Textextraktion. Sie müssten Schriftdekodierung, CMap-Auflösung und Abstandsanalyse selbst implementieren.
pdf_extract bietet grundlegende Textextraktion, hat aber eine Erfolgsrate von 91,5% und hat Schwierigkeiten mit komplexen Layouts, CJK-Text und getaggten PDFs. oxidize_pdf hat eine anständige Zuverlässigkeit (99,1%), ist aber 17× langsamer als pdf_oxide bei der durchschnittlichen Extraktionszeit, mit einem 48-Sekunden-Worst-Case-Ausreißer. unpdf verarbeitet den gesamten Korpus, scheitert aber bei 185 PDFs.
PDF Oxide ist das einzige Rust-Crate, das 100% Zuverlässigkeit mit produktionsreifer Textextraktion kombiniert.
API-Design-Vergleich
PDF Oxide: High-Level, aufgabenorientiert
PDF Oxide bietet speziell entwickelte Methoden für häufige Aufgaben. Sie arbeiten mit Text, Bildern und Formularfeldern — nicht mit PDF-Objekten und Wörterbüchern.
use pdf_oxide::PdfDocument;
let mut doc = PdfDocument::open("report.pdf")?;
// Textextraktion -- ein Aufruf
let text = doc.extract_text(0)?;
println!("{}", text);
// Formatierte Spans mit Schrift-Metadaten
let spans = doc.extract_spans(0)?;
for span in &spans {
println!("'{}' font={} size={:.1}pt", span.text, span.font_name, span.font_size);
}
// Bildextraktion
let images = doc.extract_images(0)?;
for img in &images {
println!("{}x{} {:?}", img.width, img.height, img.format);
}
// Formularfelder
let fields = doc.extract_form_fields()?;
for field in &fields {
println!("{}: {:?}", field.name, field.value);
}
Die PDF-Erstellung ist ebenso unkompliziert:
use pdf_oxide::api::Pdf;
// Aus Markdown
let pdf = Pdf::from_markdown("# Report\n\n| A | B |\n|---|---|\n| 1 | 2 |")?;
pdf.save("report.pdf")?;
// Aus HTML
let pdf = Pdf::from_html("<h1>Report</h1><p>Content here.</p>")?;
pdf.save("report.pdf")?;
lopdf: Low-Level-Objektmanipulation
lopdf gibt Ihnen direkten Zugriff auf PDF-Objekte, Streams und die Querverweistabelle. Sie müssen die PDF-Spezifikation verstehen, um es effektiv zu nutzen. Es gibt keine integrierte Textextraktion — Sie navigieren durch Wörterbücher und dekodieren Streams selbst.
use lopdf::Document;
let doc = Document::load("report.pdf")?;
// Seitenwörterbuch abrufen
let page_id = doc.page_iter().next().unwrap();
let page = doc.get_dictionary(page_id)?;
// Content-Stream abrufen -- manuelle Arbeit
let contents = page.get("Contents")?;
let stream = doc.get_object(contents.as_reference()?)?;
// Um Text zu extrahieren, müssen Sie:
// 1. Die Content-Stream-Operatoren parsen
// 2. Schriftreferenzen aus /Resources auflösen
// 3. CMap/ToUnicode-Zuordnungen dekodieren
// 4. Textmatrix-Transformationen anwenden
// 5. Kodierungsunterschiede behandeln
//
// lopdf bietet nichts davon -- es ist reiner Objektzugriff
println!("Page has {} objects", doc.objects.len());
lopdf ist das richtige Werkzeug, wenn Sie PDF-Strukturen direkt manipulieren müssen: Dokumente zusammenführen, Objekt-Streams neu schreiben oder spezialisierte PDF-Prozessoren bauen.
printpdf: Nur PDF-Erstellung
printpdf ist eine Bibliothek ausschließlich für die Erstellung. Sie kann keine bestehenden PDFs lesen oder parsen. Sie bietet eine typisierte API zum Erstellen von PDF-Dokumenten von Grund auf mit Text, Bildern und Vektorgrafiken.
use printpdf::*;
let (doc, page1, layer1) = PdfDocument::new(
"Report", Mm(210.0), Mm(297.0), "Layer 1"
);
let current_layer = doc.get_page(page1).get_layer(layer1);
// Text hinzufügen -- erfordert manuelles Laden der Schrift
let font = doc.add_builtin_font(BuiltinFont::Helvetica)?;
current_layer.use_text("Hello World", 24.0, Mm(10.0), Mm(280.0), &font);
// Speichern
doc.save(&mut std::io::BufWriter::new(
std::fs::File::create("output.pdf")?,
))?;
// Kann keine bestehenden PDFs lesen
// Kann keinen Text, keine Bilder oder Formularfelder extrahieren
printpdf ist das richtige Werkzeug, wenn Sie nur neue PDFs generieren möchten und eine saubere, fokussierte Erstellungs-API wünschen.
pdf-rs: Low-Level-PDF-Lesen
pdf-rs parst die PDF-Struktur in Rust-Typen, bietet aber nur minimale High-Level-Funktionalität. Sie erhalten typisierten Zugriff auf PDF-Objekte, müssen aber Textdekodierung, Schriftauflösung und Content-Stream-Parsing selbst handhaben.
use pdf::file::FileOptions;
let file = FileOptions::cached().open("report.pdf")?;
// Auf Seitenobjekte zugreifen
let page = file.get_page(0)?;
let media_box = page.media_box()?;
println!("Page size: {:?}", media_box);
// Content-Stream-Zugriff -- Low-Level
if let Some(ref contents) = page.contents {
// Gibt rohe Operationen zurück -- Sie müssen sie interpretieren
// Keine integrierte Textassemblierung, Schriftdekodierung oder Layoutanalyse
}
// Kann PDFs nicht schreiben oder modifizieren
pdf-rs ist das richtige Werkzeug, wenn Sie einen typsicheren PDF-Parser für Analyse, Validierung oder den Aufbau einer eigenen Rendering-Pipeline benötigen.
Funktionsvergleich nach Aufgabe
Textextraktion
| Bibliothek | Integriert | Qualität | Erforderlicher Aufwand |
|---|---|---|---|
| PDF Oxide | Ja | Produktionsreif (Unicode, CJK, Lesereihenfolge) | Ein Methodenaufruf |
| pdf_extract | Ja | Grundlegend (fehlt bei komplexen Layouts) | Ein Methodenaufruf |
| lopdf | Nein | N/A | Hunderte Zeilen eigener Code |
| printpdf | Nein | N/A | Nicht möglich (nur Schreiben) |
| pdf-rs | Nein | N/A | Erheblicher eigener Code erforderlich |
PDF Oxide übernimmt CMap/ToUnicode-Dekodierung, schriftmetrikbasierte Abstände, Strukturbaum-Lesereihenfolge und Ligaturrekonstruktion. Die Implementierung gleichwertiger Funktionalität auf Basis von lopdf oder pdf-rs erfordert Tausende Zeilen Code und tiefgreifendes Wissen über die PDF-Spezifikation.
PDF-Erstellung
| Bibliothek | Ansatz | Markdown-/HTML-Eingabe | Tabellen | Barcodes |
|---|---|---|---|---|
| PDF Oxide | High-Level + Low-Level | Ja | Ja | Ja |
| lopdf | Rohe Objektkonstruktion | Nein | Nein | Nein |
| printpdf | Typisierte Layer-API | Nein | Nein | Nein |
| pdf-rs | N/A (nur Lesen) | N/A | N/A | N/A |
Verschlüsselung
| Bibliothek | Verschlüsselte lesen | Verschlüsselte schreiben | Algorithmen |
|---|---|---|---|
| PDF Oxide | Ja | Ja | RC4-40, RC4-128, AES-128, AES-256 |
| lopdf | Nein | Nein | – |
| printpdf | Nein | Nein | – |
| pdf-rs | Teilweise | Nein | Nur RC4 |
Konformität
| Bibliothek | PDF/A | PDF/X | PDF/UA |
|---|---|---|---|
| PDF Oxide | Validieren + Konvertieren | Validieren | Validieren |
| lopdf | Nein | Nein | Nein |
| printpdf | Teilweise (PDF/A-1b-Ausgabe) | Nein | Nein |
| pdf-rs | Nein | Nein | Nein |
Abhängigkeiten
| Bibliothek | Abhängigkeiten | Kompilierzeit | Binärgröße |
|---|---|---|---|
| PDF Oxide | ~40 (Kern) | ~30s | ~4 MB |
| lopdf | ~15 | ~10s | ~1 MB |
| printpdf | ~20 | ~15s | ~2 MB |
| pdf-rs | ~25 | ~20s | ~2 MB |
PDF Oxide hat mehr Abhängigkeiten, da es Schrift-Parsing, Bilddekodierung, Content-Stream-Interpretation und Verschlüsselung enthält — Funktionen, die die anderen Bibliotheken dem Benutzer überlassen oder ganz weglassen. Mit allen optionalen Features (rendering, barcodes, office) steigt die Anzahl auf ~100.
Bibliotheken kombinieren
Da alle permissiv lizenziert sind, können Sie sie in einem einzigen Projekt kombinieren:
[dependencies]
pdf_oxide = "0.3"
lopdf = "0.32" # Optional: Roher Objektzugriff für Sonderfälle
Gängige Muster:
- PDF Oxide + lopdf: Verwenden Sie PDF Oxide für Extraktion und Erstellung, greifen Sie auf lopdf zurück für Sonderfälle, die rohe Objektmanipulation erfordern.
- PDF Oxide + printpdf: Verwenden Sie PDF Oxide zum Lesen und printpdf für spezialisierte Erstellungs-Workflows.
Anwendungsfall-Matrix
„Ich muss Text aus PDFs extrahieren"
| Crate | Geeignet? | Anmerkungen |
|---|---|---|
| PDF Oxide | Ja | Beste Extraktionsqualität, 100% Erfolgsrate, Lesereihenfolge, Schrift-Metadaten |
| pdf_extract | Teilweise | Grundlegende Extraktion, 91,5% Erfolgsrate |
| lopdf | Nein | Keine Textextraktion |
| printpdf | Nein | Kann keine PDFs lesen |
| pdf-rs | Teilweise | Grundlegendes Parsing, keine High-Level-Textextraktion |
„Ich muss PDFs erstellen"
| Crate | Geeignet? | Anmerkungen |
|---|---|---|
| PDF Oxide | Ja | High-Level (Markdown/HTML) und Low-Level-APIs |
| lopdf | Teilweise | Low-Level-Objektkonstruktion |
| printpdf | Ja | Saubere Erstellungs-API, kein Lesen |
| pdf-rs | Nein | Nur Lesen |
„Ich muss bestehende PDFs bearbeiten"
| Crate | Geeignet? | Anmerkungen |
|---|---|---|
| PDF Oxide | Ja | DOM-artige Bearbeitung, Annotationen, Formulare |
| lopdf | Teilweise | Low-Level-Objektmanipulation |
| printpdf | Nein | Kann keine PDFs lesen |
| pdf-rs | Nein | Nur Lesen |
„Ich brauche den vollständigen Lebenszyklus (Extrahieren + Erstellen + Bearbeiten)"
| Crate | Geeignet? | Anmerkungen |
|---|---|---|
| PDF Oxide | Ja | Einziges Crate, das alle drei abdeckt |
| lopdf + printpdf | Teilweise | Zwei Crates, keine Textextraktion |
| pdf-rs + printpdf | Teilweise | Zwei Crates, keine Bearbeitung |
Wann welches verwenden
Wählen Sie PDF Oxide, wenn Sie mehr als eine PDF-Fähigkeit benötigen (Extraktion + Erstellung oder Extraktion + Bearbeitung) und eine einzige, gut getestete Abhängigkeit mit 100% Zuverlässigkeit wünschen.
Wählen Sie lopdf, wenn Sie Low-Level-PDF-Strukturmanipulation benötigen und sich mit der PDF-Spezifikation direkt wohlfühlen. Gut für Zusammenführen, Aufteilen und Batch-PDF-Verarbeitung.
Wählen Sie printpdf, wenn Sie nur PDFs erstellen und nie lesen müssen. Die sauberste API für Bericht- und Dokumentengenerierung.
Wählen Sie pdf-rs, wenn Sie einen spezifikationskonformen Parser für PDF-Analyse benötigen oder Ihre eigene Rendering-Pipeline aufbauen.
Wählen Sie pdf_extract, wenn Sie grundlegende Textextraktion benötigen und keine hohe Zuverlässigkeit oder Unterstützung komplexer Layouts erfordern.
Verwandte Seiten
- Leistungsbenchmarks – vollständige Benchmark-Ergebnisse des Korpus
- Erste Schritte mit Rust – Installation und erste Extraktion
- Rust-API-Referenz – vollständige Rust-API
- vs Python-PDF-Bibliotheken – Vergleich im Python-Ökosystem