PDF-Inhaltsverzeichnis aus Lesezeichen erstellen
Wandeln Sie die Lesezeichenstruktur einer PDF-Datei in eine einheitliche Inhaltsverzeichnisseite um, ohne Titel und Seitenzahlen von Hand auszurichten.
Im Browser ausführen – kostenlos
Übergeben Sie die Lesezeichen in Dokumentreihenfolge mit Titel, der ab eins gezählten Zielseite und einer optionalen Gliederungsebene. Der Generator erhält die Hierarchie durch Einrückungen, ergänzt gut lesbare Punktlinien und liefert sowohl strukturierte Einträge als auch direkt verwendbaren Seitentext. Eine leere Gliederung wird abgelehnt, damit Fehler in einem vorgelagerten Arbeitsschritt sichtbar werden.
Bereiten Sie die Lesezeichenstruktur vor
Beginnen Sie mit der bereits aus der PDF-Datei extrahierten Gliederung. Jeder Eintrag benötigt einen Titel und eine ab eins gezählte Seitenzahl; die Reihenfolge muss der Lesereihenfolge im Dokument entsprechen. Geben Sie eine Ebene an, wenn ein Lesezeichen einem Kapitel oder einem anderen übergeordneten Eintrag untersteht: Ebene null bezeichnet ein Hauptziel, Ebene eins wird einmal eingerückt und weitere Ebenen vertiefen die Einrückung. Der Generator untersucht oder verändert keine PDF-Daten, leitet keine Lesezeichen aus Seitentext ab und sortiert die Gliederung nicht neu. Diese klare Trennung sorgt für vorhersehbare Ergebnisse und macht Datenfehler sichtbar. Wiederholte Leerzeichen und Zeilenumbrüche innerhalb von Titeln werden automatisch vereinheitlicht. Titel müssen sichtbaren Text enthalten, Seitenzahlen positive Ganzzahlen sein und Ebenen innerhalb des dokumentierten Bereichs liegen. Eine leere Gliederung führt zu einem Eingabefehler und nicht zu einer leeren Seite.
Verstehen Sie die erzeugte Seite
Das Ergebnis enthält eine Überschrift, eine normalisierte Liste der Einträge, deren Anzahl und ein Seitenfeld mit dem formatierten Text. Jede Zeile beginnt mit der aus der Lesezeichenebene abgeleiteten Einrückung, setzt sich mit dem bereinigten Titel fort und endet mit der Seitenzahl. Eine Punktlinie füllt den Zwischenraum und erleichtert das schnelle Erfassen. Der Formatierer arbeitet mit einer stabilen Zielbreite, kürzt einen langen Titel jedoch niemals nur zugunsten der Ausrichtung. Stattdessen bleibt der vollständige Wortlaut erhalten und es werden mindestens wenige Trennpunkte eingefügt. Dadurch bleiben aussagekräftige Kapitelbezeichnungen geschützt und die Ausgabe ist im Browser wie über die API deterministisch. Die strukturierten Einträge enthalten Titel, Seite, Ebene und die fertige Zeile erneut. Sie können daher den bereitgestellten Seitentext direkt verwenden oder später eine eigene Typografie anwenden. Die Standardüberschrift lautet „Inhaltsverzeichnis“ und kann durch eine andere nicht leere, einzeilige Bezeichnung ersetzt werden.
Binden Sie das Ergebnis in Ihren PDF-Ablauf ein
Verwenden Sie den zurückgegebenen Seitentext als Quelle für den Schritt, der eine echte PDF-Seite erzeugt oder einfügt. Diese Funktion konzentriert sich bewusst auf die Darstellung der Gliederung: Sie berechnet Ziele nach dem Einfügen nicht neu, wählt keine Schriftarten, verteilt lange Verzeichnisse nicht auf mehrere Seiten und verändert die Quelldatei nicht. Wenn eine neu eingefügte Seite die Zielseiten verschiebt, passen Sie die übergebenen Werte vor der endgültigen Erzeugung oder während der Zusammenstellung an. Die klare Aufgabentrennung verhindert den typischen Versatz um eine Seite, der entsteht, wenn Vorspannseiten erst nach dem Erfassen der Lesezeichen hinzukommen. Für einen wiederholbaren Veröffentlichungsablauf pflegen oder extrahieren Sie die Gliederung, prüfen die Zielseiten, erzeugen das Verzeichnis und übergeben das Ergebnis an die PDF-Zusammenstellung. Die deterministische Logik benötigt weder Netzwerkzugriff noch gespeicherten Zustand und eignet sich für Browserprüfungen, Build-Pipelines, Dokumentportale und Regressionstests.
Anwendungsfälle
Verzeichnis aus gepflegten Lesezeichen erstellen
Wandeln Sie eine sorgfältig verwaltete Kapitelstruktur vor der PDF-Zusammenstellung in ausgerichteten Text um.
Dokumentveröffentlichung automatisieren
Erzeugen Sie bei jeder Änderung der Zielseiten eine gleichbleibende Darstellung des Inhaltsverzeichnisses.
Extrahierte Gliederungen prüfen
Weisen Sie ein leeres Ergebnis frühzeitig zurück, statt unbemerkt eine leere Inhaltsverzeichnisseite zu veröffentlichen.
Häufige Fragen
Wie hoch sind die Kosten?
Die API kostet $0.002 pro Anfrage; die Browserversion kann lokal auf dieser Seite ausgeführt werden.
Liest diese Funktion die PDF-Datei?
Nein. Sie übernimmt eine bereits vorhandene Lesezeichenstruktur und formatiert deren Daten als Inhaltsverzeichnis.
Was geschieht bei einer leeren Gliederung?
Die Anfrage wird mit einem Eingabefehler abgewiesen, damit fehlende Lesezeichen keine irreführende leere Seite erzeugen.
Wie wird die Hierarchie dargestellt?
Verwenden Sie für jeden Eintrag eine bei null beginnende Ebene. Jede höhere Ebene fügt zwei Leerzeichen Einrückung hinzu.
Werden lange Titel gekürzt?
Nein. Der vollständige normalisierte Titel bleibt erhalten; vor der Seitenzahl stehen mindestens drei Punkte.
Aktualisiert das Einfügen die Seitenzahlen?
Nein. Übergeben Sie die endgültigen Zielseiten oder korrigieren Sie sie bei der späteren PDF-Zusammenstellung.
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/table-of-contents \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"outline":[{"title":"Introduction","page":1,"level":0},{"title":"Installation","page":4,"level":1}]}'const res = await fetch("https://api.kit.forhosting.com/pdf/table-of-contents", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"outline": [
{
"title": "Introduction",
"page": 1,
"level": 0
},
{
"title": "Installation",
"page": 4,
"level": 1
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/pdf/table-of-contents",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"outline": [
{
"title": "Introduction",
"page": 1,
"level": 0
},
{
"title": "Installation",
"page": 4,
"level": 1
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/pdf/table-of-contents", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"outline":[{"title":"Introduction","page":1,"level":0},{"title":"Installation","page":4,"level":1}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"outline":[{"title":"Introduction","page":1,"level":0},{"title":"Installation","page":4,"level":1}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/pdf/table-of-contents", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Beispiel-Anfrage
{
"outline": [
{
"title": "Introduction",
"page": 1,
"level": 0
},
{
"title": "Installation",
"page": 4,
"level": 1
}
]
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.table_of_contents",
"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 | 500 |
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. |