Skip to content

Extraktionsprofile — Leerzeichen-Erkennung pro Dokumenttyp anpassen

Jedes PDF versteckt seine Leerzeichen anders. Eine arXiv-Arbeit setzt auf eng gesetzte, im Blocksatz formatierte Spalten. Ein IRS-Formular baut auf starre Zellausrichtung. Eine DSGVO-Richtlinie läuft als dichter, im Blocksatz gehaltener Fließtext mit minimalem Kerning. Ein einziger tj_offset_threshold, der für das eine Format passt, streut im anderen unsinnige Leerzeichen ein.

ExtractionProfile liefert neun vorkonfigurierte Parametersätze, die sich sauber realen Dokumentklassen zuordnen lassen. Übergeben Sie das Profil an extract_text() oder extract_words(), und PDF Oxide wendet für diesen Dokumentstil die passende Wort-Margin-Ratio, den passenden TJ-Offset-Schwellenwert und den passenden Schalter für die adaptive Schwellenwertbestimmung an.

Verfügbarkeit in Bindings. Extraktionsprofile werden derzeit in Python (pdf_oxide.ExtractionProfile) und Rust (pdf_oxide::config::ExtractionProfile) bereitgestellt. Die Bindings für Node, WASM, Go und C# nutzen intern die Voreinstellung CONSERVATIVE; um aus diesen Laufzeiten ein anderes Profil anzuwenden, rufen Sie die Rust-CLI auf (pdf-oxide extract --profile academic doc.pdf) oder leiten Sie den Aufruf über einen Python- bzw. Rust-Zwischenschritt.

Kurzes Beispiel

Python

from pdf_oxide import PdfDocument, ExtractionProfile

doc = PdfDocument("paper.pdf")

# Wissenschaftliche Arbeiten: enger Zeichenabstand, Zitat-Erkennung aktiv
text = doc.extract_text(0, profile=ExtractionProfile.academic())
print(text)

Rust

use pdf_oxide::PdfDocument;
use pdf_oxide::config::ExtractionProfile;

let mut doc = PdfDocument::open("paper.pdf")?;
let text = doc.extract_text_with_profile(0, ExtractionProfile::ACADEMIC)?;
println!("{}", text);

Verfügbare Profile

Profil Geeignet für TJ-Schwellenwert Wort-Margin-Ratio Adaptiv
conservative() Voreinstellung — allgemeiner Text, minimale Fehlspationen −120 0,10 aus
aggressive() PDFs, die Leerzeichen unterdrücken; behebt verschmolzene Wörter −80 0,20 aus
balanced() Gemischte Inhalte −100 0,15 aus
academic() arXiv-Arbeiten, Konferenzbeiträge, technische Berichte −105 0,12 an + Zitat- / E-Mail-Erkennung
policy() Recht, DSGVO, behördliche Regelwerke −110 0,18 an
form() IRS-Formulare, Anträge, Fragebögen −120 0,08 aus
government() Gemischte Behördenberichte mit Tabellen −105 0,14 aus
scanned_ocr() OCR-Ausgabe mit verrauschten Koordinaten abhängig abhängig an
adaptive() Extraktor justiert sich anhand der Schriftstatistiken selbst abhängig abhängig an

Wann welches Profil hilft

Wissenschaftliche Arbeiten / Konferenzbeiträge — academic()

Enger Satzspiegel, zweispaltige Layouts, eingebettete Zitate. Die Voreinstellungen fügen oft zu viele Leerzeichen innerhalb von Ligaturen (fi, ff) ein oder zu wenige zwischen Wörtern, deren Kerning stark ist.

doc = PdfDocument("neurips-paper.pdf")
text = doc.extract_text(0, profile=ExtractionProfile.academic())

Das Academic-Profil aktiviert adaptive Schwellenwerte sowie die Erkennung von Zitaten und E-Mail-Adressen, sodass Inline-Verweise wie [1,2,3] und E-Mails wie author@lab.edu sauber erhalten bleiben.

IRS-Formulare, Anträge — form()

Formular-PDFs achten mehr auf Spaltenausrichtung als auf Wortgrenzen. Das Profil form() verwendet eine sehr enge Wort-Margin-Ratio (0,08), damit starr ausgerichtete Feldbeschriftungen nicht mit ihren Werten zusammenfallen.

doc = PdfDocument("w2.pdf")
text = doc.extract_text(0, profile=ExtractionProfile.form())

DSGVO / Richtlinien / Regulierung — policy()

Im Blocksatz eingefügte variable Abstände sprengen den Standardschwellenwert. policy() nutzt eine großzügigere Wort-Margin (0,18) plus adaptive Schwellenwerte, um dichten juristischen Fließtext korrekt zu lesen.

doc = PdfDocument("gdpr.pdf")
text = doc.extract_text(0, profile=ExtractionProfile.policy())

Gescannte OCR-Ausgabe — scanned_ocr()

Wenn die Seite per OCR (Tesseract, PaddleOCR, Azure) erfasst wurde, sind Zeichenpositionen verrauscht und Kerning-Hinweise fehlen. scanned_ocr() gleicht das mit adaptiven Schwellenwerten aus, die die Schriftstatistiken pro Seite neu einlesen.

doc = PdfDocument("scanned.pdf")
text = doc.extract_text(0, profile=ExtractionProfile.scanned_ocr())

Die Bibliothek entscheiden lassen — adaptive()

Wenn die Dokumentklasse im Voraus unklar ist, tastet adaptive() im ersten Durchlauf die Schriftstatistiken ab und wählt die Schwellenwerte vor der Extraktion. Etwas langsamer als ein festes Profil, dafür robust bei gemischten Korpora.

for pdf_path in Path("mixed_corpus/").glob("*.pdf"):
    doc = PdfDocument(str(pdf_path))
    text = doc.extract_text(0, profile=ExtractionProfile.adaptive())

Profilfelder

Jedes Profil legt seine Stellschrauben offen, sodass Sie sie lesen oder klonen können:

Python

from pdf_oxide import ExtractionProfile

p = ExtractionProfile.academic()
print(p.name)                # "Academic"
print(p.word_margin_ratio)   # 0.12
print(p.tj_offset_threshold) # -105.0

# Alle Presets durchgehen
for profile in ExtractionProfile.all_profiles():
    print(profile.name, profile.word_margin_ratio)

Rust

use pdf_oxide::config::ExtractionProfile;

let p = ExtractionProfile::ACADEMIC;
println!("{} margin={} tj={}",
    p.name, p.word_margin_ratio, p.tj_offset_threshold);

Profilwahl in produktiven Pipelines

Wenn Sie ein gemischtes Korpus verarbeiten — wissenschaftliche Arbeiten neben IRS-Formularen neben HTML-exportierten Webinhalten — wählen Sie adaptive() als Standard. Das kostet ein paar Prozent pro Seite mehr, vermeidet aber die schlimmsten Ausfälle (verschmolzene Wörter, fehlende Leerzeichen zwischen Spalten).

Ist Ihr Korpus homogen — etwa eine Title-IX-Aufnahme-Pipeline, ein Tool zur Vertragsprüfung oder ein arXiv-Crawler — wählen Sie das passende Profil explizit: Sie erzielen die beste Extraktionsqualität und sparen sich die seitenweise Abtastung durch adaptive().

Verwandte Seiten