Générez une table des matières PDF depuis les signets
Transformez le plan des signets d’un PDF en une page de table des matières homogène, sans aligner manuellement les titres et les numéros.
Lancer gratuitement
Fournissez les signets dans l’ordre du document, avec leur titre, leur page de destination comptée à partir de un et, si nécessaire, leur niveau hiérarchique. Le générateur conserve cette hiérarchie par des retraits, ajoute des pointillés lisibles et renvoie les entrées structurées ainsi que le texte prêt à l’emploi. Un plan vide est refusé afin de révéler toute étape antérieure défaillante.
Préparez le plan des signets
Commencez par le plan déjà extrait du PDF. Chaque entrée doit comporter un titre et un numéro de page compté à partir de un, et respecter l’ordre de lecture du document. Ajoutez un niveau lorsque le signet dépend d’un chapitre ou d’une autre entrée parente : le niveau zéro correspond à une destination principale, le niveau un ajoute un retrait et les niveaux supérieurs approfondissent ce retrait. Le générateur n’analyse ni ne modifie les octets du PDF, ne déduit pas les signets depuis le texte et ne réorganise pas le plan. Cette séparation garantit un résultat prévisible et rend les problèmes de données visibles. Les espaces répétés et les sauts de ligne dans les titres sont normalisés automatiquement. Les titres doivent contenir du texte visible, les pages être des entiers positifs et les niveaux rester dans la plage documentée. Un plan vide déclenche une erreur de saisie plutôt qu’une page blanche.
Comprenez la page produite
Le résultat comprend un en-tête, un tableau normalisé d’entrées, leur nombre et un champ de page contenant le texte mis en forme. Chaque ligne commence par le retrait correspondant au niveau du signet, se poursuit par le titre nettoyé et se termine par le numéro de page. Des pointillés occupent l’espace intermédiaire pour faciliter le repérage. Le formateur vise une largeur stable, mais ne tronque jamais un titre long uniquement pour préserver l’alignement ; il conserve l’intitulé complet et insère un séparateur minimal. Les noms de chapitres restent ainsi significatifs et le résultat demeure déterministe dans le navigateur comme dans l’API. Les entrées structurées reprennent le titre, la page, le niveau et la ligne finale : vous pouvez donc employer directement la page fournie ou appliquer ensuite votre propre typographie. L’en-tête par défaut est « Table des matières », mais vous pouvez le remplacer par tout libellé non vide tenant sur une seule ligne.
Intégrez-la à votre flux PDF
Utilisez le texte de page renvoyé comme source pour l’étape qui crée ou insère une page physique dans le PDF. Cette capacité se concentre volontairement sur le rendu du plan : elle ne recalcule pas les destinations après insertion, ne choisit pas les polices, ne répartit pas une longue liste sur plusieurs pages et ne modifie pas le fichier source. Si l’ajout d’une page décale les destinations, corrigez les valeurs avant de produire la table définitive ou pendant l’assemblage. Cette séparation évite l’erreur courante d’une page provoquée par l’ajout de pages liminaires après l’enregistrement des signets. Pour une publication reproductible, extrayez ou entretenez le plan, validez les pages de destination, générez la table puis transmettez le résultat à l’étape de composition. La logique est déterministe, sans réseau ni état conservé, et convient aux vérifications dans le navigateur, aux pipelines, aux portails documentaires et aux tests de régression.
Cas d’usage
Créez une table depuis des signets préparés
Convertissez un plan de chapitres soigneusement tenu en texte aligné avant d’assembler le PDF final.
Automatisez la publication documentaire
Produisez une représentation prévisible de la table à chaque compilation lorsque les destinations changent.
Validez les plans extraits
Refusez immédiatement un résultat vide plutôt que de publier discrètement une table des matières blanche.
Questions fréquentes
Quel est le tarif ?
L’API coûte $0.002 par requête ; la version pour navigateur peut s’exécuter localement sur cette page.
Cette capacité lit-elle le fichier PDF ?
Non. Elle reçoit un plan de signets déjà disponible et met ces données en forme comme table des matières.
Que se passe-t-il si le plan est vide ?
La requête échoue avec une erreur de saisie afin qu’une absence de signets ne produise pas une page trompeuse.
Comment représenter la hiérarchie ?
Attribuez à chaque entrée un niveau partant de zéro. Chaque niveau supérieur ajoute deux espaces de retrait.
Les titres longs sont-ils tronqués ?
Non. Le titre normalisé complet est conservé, avec au moins trois points avant le numéro de page.
L’insertion met-elle les numéros à jour ?
Non. Fournissez les destinations finales ou ajustez-les lors de l’étape ultérieure d’assemblage du PDF.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre 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)Exemple de requête
{
"outline": [
{
"title": "Introduction",
"page": 1,
"level": 0
},
{
"title": "Installation",
"page": 4,
"level": 1
}
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.table_of_contents",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_items | 500 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |