Listez les signets PDF avec pages et niveaux
Transformez l’arborescence d’un PDF en une liste de signets claire et ordonnée, facile à contrôler, tester, exporter ou intégrer à un autre processus.
Lancer gratuitement
Tout se passe dans votre navigateur : gratuit, sans envoi de vos données.
Chaque élément contient le titre du signet, son niveau hiérarchique compté à partir de un et sa page cible également comptée à partir de un. Le parcours respecte l’ordre du plan et place chaque enfant immédiatement après son parent. Une arborescence vide est explicitement refusée, afin que l’absence de table des matières ne soit jamais confondue avec un résultat valide dépourvu de données.
Convertissez une arborescence en lignes exploitables
Les signets PDF sont généralement organisés sous forme d’arbre. Les chapitres occupent le premier niveau, les sections figurent sous les chapitres et les rubriques peuvent descendre encore plus loin. Cette structure est pratique dans un lecteur, mais moins adaptée à l’audit de navigation, à la création d’un rapport, à la comparaison d’éditions ou à l’envoi vers un tableur. Cette capacité parcourt le plan en préordre : elle émet d’abord le parent, puis tous ses descendants dans leur ordre initial, avant de passer au frère suivant. Chaque ligne contient les données utiles à un inventaire : titre, niveau et page cible. Les niveaux et les pages commencent à un. La liste respecte ainsi l’ordre de lecture visible tout en supprimant l’imbrication récursive. Elle n’ouvre et ne modifie aucun fichier PDF ; elle reçoit le plan déjà produit par un analyseur ou une étape documentaire antérieure.
Maîtrisez la validation et l’ordre déterministe
Chaque signet doit être un objet doté d’un titre non vide et d’une page exprimée par un entier positif. Les enfants facultatifs doivent former un tableau d’autres signets. Les espaces placés aux extrémités du titre sont supprimés, sans modifier le texte intérieur. L’algorithme ne trie jamais par ordre alphabétique ou par numéro de page, car un tel tri pourrait dénaturer l’intention de l’auteur. Il suit la séquence reçue et déduit le niveau de la profondeur. Une entrée identique donne donc toujours une sortie identique, sans réseau, horodatage, identifiant aléatoire ni comportement lié à l’environnement. Un plan racine vide entraîne une erreur de saisie. Une automatisation peut ainsi s’arrêter lorsqu’un document ne possède aucun signet au lieu de publier un index vide en apparence valable. Les enfants mal formés, titres manquants, destinations incorrectes, profondeurs excessives, cycles et arbres trop volumineux sont également refusés.
Intégrez la liste à vos traitements documentaires
Une liste plate constitue une frontière simple entre l’analyse PDF et les règles métier suivantes. Vous pouvez l’afficher comme table des matières, vérifier la présence des chapitres attendus, comparer les titres et destinations de plusieurs versions ou associer des pages à des sections pour une extraction ultérieure. La réponse comprend le nombre total et les enregistrements ordonnés ; un système peut donc contrôler le volume avant de traiter chaque élément. Le niveau permet de recréer l’indentation, voire l’arbre, tandis que la page facilite la navigation et le calcul de plages. Cette capacité restitue uniquement le plan fourni : elle ne vérifie pas l’existence des pages dans un PDF précis, ne déduit pas les titres depuis le texte et ne répare pas les liens défectueux. Si l’analyseur fournit le nombre de pages, validez les limites séparément. L’exécution dans le navigateur est gratuite et l’automatisation par API coûte $0.002 par requête, avec une logique identique dans les deux canaux.
Cas d’usage
Auditer la navigation d’un document
Examinez chaque signet dans l’ordre visible et repérez les chapitres absents, niveaux inattendus ou destinations erronées avant publication.
Créer une table des matières
Convertissez la sortie de l’analyseur en lignes indentables par niveau et reliées à leurs pages cibles.
Comparer des éditions PDF
Produisez des inventaires stables de deux versions et comparez leurs titres, leur hiérarchie, leur ordre et leurs destinations.
Questions fréquentes
Cette capacité lit-elle directement le fichier PDF ?
Non. Elle reçoit un plan produit par un analyseur PDF et transforme cet arbre en enregistrements de signets.
Dans quel ordre les résultats apparaissent-ils ?
Le parcours est en préordre : chaque parent précède ses enfants et les éléments frères conservent l’ordre documentaire fourni.
Comment les niveaux sont-ils numérotés ?
Les signets supérieurs sont au niveau 1, leurs enfants au niveau 2, puis chaque profondeur ajoute un niveau.
Que se passe-t-il si le plan est vide ?
La requête échoue avec une erreur de saisie afin de ne pas confondre une absence de signets avec un rapport vide valide.
L’existence des pages cibles est-elle contrôlée ?
Chaque destination doit être un entier positif, mais sa comparaison avec le nombre de pages nécessite un contrôle séparé.
Quel est le prix d’une requête API ?
Une requête API coûte $0.002. Vous pouvez également exécuter gratuitement la même logique déterministe dans le navigateur.
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/bookmarks-list \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"outline":[{"title":"Introduction","page":1,"children":[{"title":"Background","page":3}]},{"title":"Methods","page":8}]}'const res = await fetch("https://api.kit.forhosting.com/pdf/bookmarks-list", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"outline": [
{
"title": "Introduction",
"page": 1,
"children": [
{
"title": "Background",
"page": 3
}
]
},
{
"title": "Methods",
"page": 8
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/pdf/bookmarks-list",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"outline": [
{
"title": "Introduction",
"page": 1,
"children": [
{
"title": "Background",
"page": 3
}
]
},
{
"title": "Methods",
"page": 8
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/pdf/bookmarks-list", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"outline":[{"title":"Introduction","page":1,"children":[{"title":"Background","page":3}]},{"title":"Methods","page":8}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"outline":[{"title":"Introduction","page":1,"children":[{"title":"Background","page":3}]},{"title":"Methods","page":8}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/pdf/bookmarks-list", 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,
"children": [
{
"title": "Background",
"page": 3
}
]
},
{
"title": "Methods",
"page": 8
}
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.bookmarks_list",
"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_mb | 25 |
max_pages | 200 |
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. |