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 VoreinstellungCONSERVATIVE; 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
- Textextraktion — vollständige Extraktions-API
- Leseordnung (XY-Cut) — spaltenbewusste Leseordnung
- Gescannte PDFs per OCR — wenn ein Profil nicht ausreicht
- Python-API-Referenz