Mehrspaltigen PDF-Text in Lesereihenfolge extrahieren
Vier vertauschte Blöcke einer zweispaltigen Seite kommen als links erstens, links zweitens, rechts erstens und rechts zweitens zurück. Spalten werden an ähnlichen linken Kanten erkannt und von links nach rechts, von oben nach unten gelesen. Kostenlos in Ihrem Browser.
- Kostenlos
- Läuft in Ihrem Browser
- Ohne Anmeldung
- Ihre Daten bleiben auf Ihrem Gerät
Im Browser ausführen – kostenlos
Eine PDF-Textextraktion kann jedes Wort richtig erkennen und dennoch eine unbrauchbare Reihenfolge liefern. Bei Seiten mit mehreren Spalten vermischt eine rein vertikale Sortierung unabhängige Absätze. Diese Funktion übernimmt Textblöcke samt Begrenzungsrahmen, erkennt zusammengehörige Spalten, ordnet diese von links nach rechts und ihre Blöcke von oben nach unten. Das Ergebnis enthält den rekonstruierten Text sowie die vollständig geordnete Geometrie, damit Sie die Zuordnung prüfen oder weiterverarbeiten können.
Warum die Lesereihenfolge bei PDFs verloren geht
Ein PDF beschreibt meist, wo Glyphen gezeichnet werden, nicht in welcher semantischen Reihenfolge Menschen sie lesen sollen. Extraktionsbibliotheken können Blöcke daher in Objektstrom-, Zeichen- oder globaler vertikaler Reihenfolge zurückgeben und dabei zwischen Spalten springen. Ein zweispaltiger Artikel erscheint dann etwa als erster linker, erster rechter und anschließend zweiter linker Absatz.
Übergeben Sie jeden Block mit Text, linker und oberer Koordinate, Breite und Höhe. Aus dieser Geometrie werden Gruppen mit ähnlichen linken Kanten abgeleitet. So können Sie jede Platzierung nachvollziehen, statt einer undurchsichtigen Textumwandlung zu vertrauen.
Alle Koordinaten müssen dasselbe Seitensystem verwenden; `y` bezeichnet die Oberkante eines Blocks.
Deterministische Erkennung der Spalten
Die Spaltenzugehörigkeit richtet sich nach dem Abstand zwischen den linken Blockkoordinaten. Standardmäßig beträgt die Toleranz ein Viertel der positiven medianen Blockbreite. Dadurch passt sie sich üblichen Seitengrößen an und gleicht kleine Einzüge oder Extraktionsungenauigkeiten aus.
Ein kleiner Wert trennt bereits leicht versetzte Kanten, ein größerer ordnet eingerückte Absätze oder Überschriften ihrer Umgebung zu. Nach der Gruppierung werden Spalten nach ihrer mittleren linken Position sortiert. Innerhalb einer Spalte entscheiden obere Position, linke Position und ursprünglicher Array-Index.
Diese Regeln liefern auch bei identischen Koordinaten stabile Ergebnisse. Der Algorithmus verwendet weder Netzwerk noch Zufall, aktuelle Uhrzeit, OCR oder Sprachmodelle.
Anwendungsfälle
Artikel für die Suche vorbereiten
Wandeln Sie zweispaltige Zeitschriften- oder Newsletterblöcke vor der Indexierung in zusammenhängenden Text um.
Barrierefreie Exporte erstellen
Erzeugen Sie eine verlässliche Reihenfolge für Bildschirmleser oder barrierefreie Dokumentkonvertierungen.
Extraktionsabläufe prüfen
Behalten Sie geordnete Rahmen und Quellindizes, um die Position jedes Absatzes erklären zu können.
Häufige Fragen
Kann diese Funktion eine PDF-Datei einlesen?
Nein. Sie erwartet bereits extrahierte Textblöcke einer PDF-Seite einschließlich ihrer Begrenzungsrahmen.
Wie werden Spalten erkannt?
Blöcke mit hinreichend ähnlichen linken Koordinaten werden gruppiert.
Wie hoch sind die Kosten?
Dieselbe deterministische Logik lässt sich als Funktion der Stufe A auch im Browser ausführen.
Kann ich mehrere Seiten auf einmal senden?
Senden Sie jeweils eine Seite. Positionen verschiedener Seiten lassen sich nur vergleichen, wenn Sie sie vorher selbst auf einen gemeinsamen Maßstab bringen, sonst geraten die Spalten durcheinander.
Erkennt das Werkzeug Tabellen, Randkästen oder Fußnoten?
Nein. Es ordnet den Text nur nach Spalte und Höhe auf der Seite. Tabellen, Randkästen, spaltenübergreifende Überschriften und Fußnoten werden nicht erraten, also markieren Sie sie vorher oder passen Sie die Spaltentoleranz an und prüfen Sie das Ergebnis.
Verwandte Tools
Für Entwickler — API-Zugang
Alles auf dieser Seite ist auch per API verfügbar. Dieser Abschnitt richtet sich an Teams, die es in ihre eigenen Systeme einbinden möchten; alle anderen nutzen einfach das Tool oben.
Endpunkt
Authentifizierung per Bearer-Token. Ein einziger POST stellt die Aufgabe in die Warteschlange; das Ergebnis erhalten Sie per Webhook oder über einen signierten Link.
Aufruf aus Ihrem Stack
curl -X POST https://api.kit.forhosting.com/pdf/text-extract-column-order \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"blocks":[{"text":"Left heading","x":40,"y":40,"width":210,"height":20},{"text":"Right heading","x":320,"y":42,"width":210,"height":20},{"text":"Right body","x":322,"y":90,"width":208,"height":60},{"text":"Left body","x":42,"y":92,"width":208,"height":60}]}'const res = await fetch("https://api.kit.forhosting.com/pdf/text-extract-column-order", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"blocks": [
{
"text": "Left heading",
"x": 40,
"y": 40,
"width": 210,
"height": 20
},
{
"text": "Right heading",
"x": 320,
"y": 42,
"width": 210,
"height": 20
},
{
"text": "Right body",
"x": 322,
"y": 90,
"width": 208,
"height": 60
},
{
"text": "Left body",
"x": 42,
"y": 92,
"width": 208,
"height": 60
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/pdf/text-extract-column-order",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"blocks": [
{
"text": "Left heading",
"x": 40,
"y": 40,
"width": 210,
"height": 20
},
{
"text": "Right heading",
"x": 320,
"y": 42,
"width": 210,
"height": 20
},
{
"text": "Right body",
"x": 322,
"y": 90,
"width": 208,
"height": 60
},
{
"text": "Left body",
"x": 42,
"y": 92,
"width": 208,
"height": 60
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/pdf/text-extract-column-order", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"blocks":[{"text":"Left heading","x":40,"y":40,"width":210,"height":20},{"text":"Right heading","x":320,"y":42,"width":210,"height":20},{"text":"Right body","x":322,"y":90,"width":208,"height":60},{"text":"Left body","x":42,"y":92,"width":208,"height":60}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"blocks":[{"text":"Left heading","x":40,"y":40,"width":210,"height":20},{"text":"Right heading","x":320,"y":42,"width":210,"height":20},{"text":"Right body","x":322,"y":90,"width":208,"height":60},{"text":"Left body","x":42,"y":92,"width":208,"height":60}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/pdf/text-extract-column-order", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Beispiel-Anfrage
{
"blocks": [
{
"text": "Left heading",
"x": 40,
"y": 40,
"width": 210,
"height": 20
},
{
"text": "Right heading",
"x": 320,
"y": 42,
"width": 210,
"height": 20
},
{
"text": "Right body",
"x": 322,
"y": 90,
"width": 208,
"height": 60
},
{
"text": "Left body",
"x": 42,
"y": 92,
"width": 208,
"height": 60
}
]
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.text_extract_column_order",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}Die API arbeitet asynchron: Sie erhalten sofort eine task_id. Polling ist mit 1 Anfrage pro Sekunde erlaubt.
Preis
Der Preis steht auf der Seite – keine Tokens, keine Credits. Fehlgeschlagene Aufgaben werden nicht berechnet.
Limits
max_items | 10000 |
Fehler
| HTTP | Code | Bedeutung |
|---|---|---|
401 | unauthorized | Der API-Schlüssel fehlt oder ist ungültig – prüfen Sie den Authorization-Header (Bearer). |
402 | insufficient_balance | Ihr Guthaben reicht für diese Aufgabe nicht aus – Aufladungen verfallen nicht. |
404 | unknown_type | Unbekannter Aufgabentyp – prüfen Sie das Feld „type“ gegen den Katalog. |
429 | rate_limited | Zu viele Anfragen – warten Sie kurz; Polling ist mit 1 Anfrage pro Sekunde erlaubt. |
Technische Hinweise
Warum die Lesereihenfolge bei PDFs verloren geht
Danach werden die Spalten von links nach rechts und die Blöcke darin von oben nach unten angeordnet. `reading_order` behält die ursprüngliche Geometrie und den Quellindex bei.
Deterministische Erkennung der Spalten
Für ungewöhnliche Geometrien können Sie `column_tolerance` festlegen.
Das geordnete Ergebnis weiterverwenden
Bewahren Sie die strukturierten Arrays für Herkunftsnachweise, Markierungen, Seitenüberlagerungen oder Fehlersuche auf. Nutzen Sie den verbundenen Text für Suche, Zusammenfassungen, Barrierefreiheit oder Export. Tabellen, Randspalten, spaltenübergreifende Titel, Fußnoten und Seitenfortsetzungen werden ebenfalls nicht erkannt. Die Antwort stellt dieselbe Entscheidung in mehreren Formen bereit. `columns` zeigt jede erkannte Spalte mit geordneten Blöcken. `reading_order` führt diese Spalten zu genau der Sequenz zusammen, die der nächste Verarbeitungsschritt benötigt. `text` verbindet die Inhalte mit einem konfigurierbaren Trennzeichen; standardmäßig bleibt durch eine Leerzeile die Absatzstruktur sichtbar. Verarbeiten Sie pro Anfrage eine PDF-Seite, da Koordinaten verschiedener Seiten ohne Normalisierung nicht vergleichbar sind. Diese Funktion liest keine PDF-Dateien und führt keine OCR aus; sie erwartet Blöcke Ihres Extraktors. Klassifizieren Sie solche Strukturen vorab oder passen Sie `column_tolerance` an und prüfen Sie die zurückgegebenen Zuordnungen.
Technische Fragen
Was geschieht ohne übergebene Blöcke?
Die Anfrage endet mit `invalid_input`, weil sich ohne Textblöcke keine Lesereihenfolge ableiten lässt.
Welches Koordinatensystem soll ich verwenden?
Jedes einheitliche Seitensystem ist geeignet, sofern `x` die linke und `y` die obere Blockkoordinate bezeichnet.