Skip to content

PDF Oxide vs lopdf

lopdf ist ein Low-Level-Rust-Crate für direkte PDF-Objekt­manipulation — 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:

  1. Content-Stream-Parsing — PostScript-ähnliche Operatoren parsen (Tj, TJ, Tm, Tf usw.)
  2. Schriftauflösung — /Font-Ressourcen nachschlagen, indirekte Referenzen auflösen
  3. CMap/ToUnicode-Dekodierung — Glyphen-IDs in Unicode-Zeichen umwandeln
  4. Schriftmetriken-Abstände — Zeichenbreiten aus Schriftdeskriptoren berechnen
  5. Textmatrix-Transformationen — Tm-, Td-, T*-Operatoren zur Textpositionierung anwenden
  6. Lesereihenfolge — die korrekte Reihenfolge für mehrspaltiges Layout bestimmen
  7. Ligaturrekonstruktion — fi-, fl-, ffi-Ligaturen behandeln
  8. 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