PDF Oxide vs lopdf
lopdf ist ein Low-Level-Rust-Crate für direkte PDF-Objektmanipulation — ohne integrierte Textextraktion oder Rendering. PDF Oxide ist die High-Level-Bibliothek mit Extraktion, Erstellung und Bearbeitung out-of-the-box. Die beiden Crates zielen auf grundverschiedene Anwendungsfälle.
Wesentliche Unterschiede
Abstraktionsebene. lopdf gibt Ihnen rohe PDF-Objekte — Wörterbücher, Streams und Querverweistabellen. Es gibt keine Textextraktion, keine Schriftdekodierung, keinen Bildexport. PDF Oxide bietet zweckgebundene Methoden: extract_text(), extract_images(), to_markdown().
Zuverlässigkeit. lopdf scheitert beim Parsen von 20% des Test-Korpus von 3.830 PDFs. Von den PDFs, die es parsen kann, erzeugen 57% eine leere Ausgabe, weil lopdf keine Textextraktion hat — Sie erhalten die Objekte, aber keinen Text. PDF Oxide besteht 100%.
Geschwindigkeit bei parsbaren PDFs. lopdf ist beim rohen Objekt-Parsing schneller: 0,3ms Durchschnitt gegenüber 0,8ms bei PDF Oxide. Aber lopdf führt keine Textextraktionsarbeit durch — Sie müssten Schriftdekodierung, CMap-Auflösung, Abstandsanalyse und Lesereihenfolge selbst implementieren.
Schnellvergleich
| PDF Oxide | lopdf | |
|---|---|---|
| API-Ebene | High-Level | Low-Level |
| Textextraktion | Integriert (produktionsreif) | Keine |
| Erfolgsrate (3.830 PDFs) | 100% | 80,2% |
| Durchschn. Parse-Zeit | 0,8ms | 0,3ms |
| Bildextraktion | Integriert | Manuell (rohe Streams) |
| Formularfelder | Lesen + Schreiben | Manuell (rohe Wörterbücher) |
| PDF-Erstellung | Ja (Markdown/HTML) | Ja (rohe Objekte) |
| Markdown-/HTML-Ausgabe | Ja | Nein |
| Verschlüsselung | Lesen + Schreiben | Nein |
| Rendering | Ja | Nein |
| PDF/A-Validierung | Ja | Nein |
| Lizenz | MIT | MIT |
Was lopdf nicht kann
lopdf bietet Zugriff auf PDF-Objekte, aber Textextraktion erfordert die Interpretation dieser Objekte gemäß der PDF-Spezifikation. Folgendes müssten Sie selbst implementieren:
- Content-Stream-Parsing — PostScript-ähnliche Operatoren parsen (Tj, TJ, Tm, Tf usw.)
- Schriftauflösung — /Font-Ressourcen nachschlagen, indirekte Referenzen auflösen
- CMap/ToUnicode-Dekodierung — Glyphen-IDs in Unicode-Zeichen umwandeln
- Schriftmetriken-Abstände — Zeichenbreiten aus Schriftdeskriptoren berechnen
- Textmatrix-Transformationen — Tm-, Td-, T*-Operatoren zur Textpositionierung anwenden
- Lesereihenfolge — die korrekte Reihenfolge für mehrspaltiges Layout bestimmen
- Ligaturrekonstruktion — fi-, fl-, ffi-Ligaturen behandeln
- CJK-Kodierung — Chinesische, Japanische, Koreanische Textkodierungen dekodieren
Das sind Tausende Zeilen Code und tiefgreifendes Wissen über ISO 32000. PDF Oxide übernimmt all dies intern.
Code-Vergleich
Textextraktion
PDF Oxide:
use pdf_oxide::PdfDocument;
let mut doc = PdfDocument::open("report.pdf")?;
let text = doc.extract_text(0)?;
println!("{}", text);
lopdf:
use lopdf::Document;
let doc = Document::load("report.pdf")?;
// lopdf bietet keine Textextraktion.
// Sie erhalten nur Zugriff auf PDF-Objekte:
let page_id = doc.page_iter().next().unwrap();
let page = doc.get_dictionary(page_id)?;
let contents = page.get("Contents")?;
let stream = doc.get_object(contents.as_reference()?)?;
// Um tatsächlichen Text zu erhalten, müssen Sie:
// 1. Content-Stream-Operatoren parsen
// 2. Schriftreferenzen aus /Resources auflösen
// 3. CMap/ToUnicode-Zuordnungen dekodieren
// 4. Textmatrix-Transformationen anwenden
// 5. Kodierungsunterschiede behandeln
// ... (Hunderte bis Tausende Zeilen Code)
PDF-Erstellung
PDF Oxide:
use pdf_oxide::api::Pdf;
let pdf = Pdf::from_markdown("# Report\n\n| Q1 | Q2 |\n|---|---|\n| $1M | $2M |")?;
pdf.save("report.pdf")?;
lopdf:
use lopdf::{Document, Object, Stream, dictionary};
let mut doc = Document::with_version("1.5");
// Schrift-Wörterbuch erstellen
let font_id = doc.add_object(dictionary! {
"Type" => "Font",
"Subtype" => "Type1",
"BaseFont" => "Helvetica",
});
// Ressourcen erstellen
let resources_id = doc.add_object(dictionary! {
"Font" => dictionary! { "F1" => font_id },
});
// Content-Stream erstellen (rohe PostScript-Operatoren)
let content = Stream::new(
dictionary! {},
b"BT /F1 12 Tf 72 720 Td (Hello World) Tj ET".to_vec(),
);
let content_id = doc.add_object(content);
// Seite erstellen
let page_id = doc.add_object(dictionary! {
"Type" => "Page",
"MediaBox" => vec![0.into(), 0.into(), 612.into(), 792.into()],
"Contents" => content_id,
"Resources" => resources_id,
});
// Seitenbaum verknüpfen
let pages_id = doc.add_object(dictionary! {
"Type" => "Pages",
"Kids" => vec![page_id.into()],
"Count" => 1,
});
doc.add_object(dictionary! {
"Type" => "Catalog",
"Pages" => pages_id,
});
doc.save("report.pdf")?;
Verschlüsselte PDFs
PDF Oxide:
use pdf_oxide::PdfDocument;
let doc = PdfDocument::open_with_password("encrypted.pdf", "secret")?;
let text = doc.extract_text(0)?;
println!("{}", text);
lopdf:
// lopdf unterstützt keine verschlüsselten PDFs.
// Das Laden einer verschlüsselten PDF wird fehlschlagen oder unentschlüsselte Streams liefern.
Zuverlässigkeitsvergleich
| Metrik | PDF Oxide | lopdf |
|---|---|---|
| Erfolgreich geparste PDFs | 3.823 / 3.823 (100%) | 3.071 / 3.823 (80,2%) |
| PDFs mit Textausgabe | 3.823 / 3.823 | ~1.320 / 3.823 (geschätzt) |
| Verschlüsselte PDFs unterstützt | Ja | Nein |
| Wiederherstellung fehlerhafter PDFs | Ja | Nein |
Die 80,2% Erfolgsrate von lopdf bedeutet, dass es bei ungefähr 1 von 5 PDFs scheitert. Die Fehler treten bei verschlüsselten Dokumenten, PDFs mit nicht-standardmäßigen Xref-Tabellen und Dokumenten mit Querverweis-Streams auf. PDF Oxide bewältigt all diese mit nachsichtigem Parsing und Fallback-Strategien.
Wann welches verwenden
Wählen Sie PDF Oxide, wenn:
- Sie Textextraktion, Bildextraktion oder jede inhaltsbezogene Operation benötigen
- Sie ein einzelnes Crate für Lesen + Schreiben + Erstellen wünschen
- Sie alle PDFs zuverlässig verarbeiten müssen (verschlüsselt, fehlerhaft, komplex)
- Sie Markdown-/HTML-Ausgabe, Rendering oder OCR benötigen
- Sie Konformitätsvalidierung wünschen (PDF/A, PDF/X, PDF/UA)
Wählen Sie lopdf, wenn:
- Sie direkten Zugriff auf PDF-Objekte für benutzerdefinierte Verarbeitung benötigen
- Sie ein spezialisiertes PDF-Tool bauen, das auf Objektebene arbeitet
- Sie Dokumente durch direkte Manipulation von Objektbäumen zusammenführen müssen
- Ihre PDFs einfach und wohlgeformt sind (nicht verschlüsselt, Standard-Xref-Tabellen)
Beides kombinieren:
Verwenden Sie PDF Oxide für High-Level-Operationen und lopdf für Sonderfälle, die rohen Objektzugriff erfordern:
[dependencies]
pdf_oxide = "0.3"
lopdf = "0.32"
Verwandte Seiten
- Leistungsbenchmarks — vollständige Korpus-Ergebnisse
- vs Rust-PDF-Bibliotheken — alle Rust-Crates im Vergleich
- Erste Schritte mit Rust — Installation und erste Extraktion