Ajoutez un signet PDF et validez sa page
Dans un PDF de 32 pages où Cover, Methods et Appendix pointent vers les pages 1, 8 et 27, un signet Results vers la page 18 arrive en troisième. Indiquez pages, signets, titre et page cible pour obtenir le plan à jour. Gratuit dans votre navigateur.
- Gratuit
- Fonctionne dans votre navigateur
- Sans inscription
- Vos données restent sur votre appareil
Lancer gratuitement
Exemple résolu
- Nombre de pages
- 32
- Titre
- Results
- Page
- 18
- Quantité
- 4
- Index inséré
- 2
Ajoutez une entrée de navigation fiable au plan d’un PDF sans deviner si sa destination existe ni où elle doit se placer. Indiquez le nombre de pages du document, ses signets de premier niveau, un titre et une page cible numérotée à partir de un. La capacité valide cette destination par rapport à la plage réelle, contrôle le plan existant et insère le signet dans l’ordre des pages. Elle renvoie un nouveau plan structuré et l’indice d’insertion, faciles à transmettre à une étape ultérieure d’écriture du PDF ou à vérifier dans un flux documentaire automatisé.
Décrivez le PDF et le signet à ajouter
Commencez par le nombre total de pages du PDF, car cette valeur définit toutes les destinations valides. Fournissez ensuite le plan actuel de premier niveau sous forme de tableau d’enregistrements contenant un titre et une page, dans l’ordre employé par le document. La numérotation commence à un : la page 1 désigne la première page visible du PDF, et non un décalage interne nul.
Indiquez enfin le titre et la page cible du signet à ajouter. Les espaces situés aux extrémités du titre sont supprimés afin qu’une saisie accidentelle dans un formulaire ou une feuille de calcul ne soit pas visible. La capacité traite la représentation du plan sans décoder ni réécrire les octets binaires du PDF.
Cette séparation convient après la lecture du fichier par un analyseur ou avant l’écriture du plan actualisé par une bibliothèque. Un plan vide est accepté : la même requête peut donc créer le premier signet ou compléter une table des matières existante.
Validez les limites et conservez un ordre prévisible
Un signet n’est utile que si sa destination peut exister. La page zéro, les nombres négatifs, les fractions et les valeurs dépassant la dernière page produisent une erreur d’entrée non valide qui précise la plage autorisée. Les signets existants sont soumis à la même règle, ce qui empêche une modification apparemment réussie de conserver des destinations cassées.
Leurs titres doivent également contenir du texte visible. Le plan fourni doit être classé par pages croissantes ; accepter une liste désordonnée rendrait la bonne position ambiguë et risquerait de réorganiser silencieusement la navigation voulue. Après validation, l’algorithme avance jusqu’au premier signet visant une page ultérieure et insère le nouveau juste avant.
Si plusieurs signets visent déjà la même page, la nouvelle entrée les suit et préserve leur ordre relatif. Le tableau reçu n’est jamais modifié.
Intégrez le plan renvoyé à votre flux documentaire
Les données restent indépendantes de toute bibliothèque ; une application peut associer chaque titre et chaque page numérotée à partir de un aux objets de destination exigés par son logiciel d’écriture. Cette capacité ne modifie pas les octets du PDF, ne déduit pas les titres depuis le texte, ne crée pas de descendants imbriqués et ne répare pas un plan désordonné. Ces tâches nécessitent une analyse, des choix hiérarchiques ou une sérialisation externes.
Gardez le nombre de pages issu de la version qui sera finalement écrite.
Cas d’usage
Ajouter un nouveau chapitre
Insérez le libellé d’un chapitre sur sa page de début vérifiée avant l’écriture du PDF révisé.
Automatiser la navigation des rapports
Ajoutez un signet pour une annexe ou un résumé généré et refusez les modèles qui calculent une destination impossible.
Contrôler les changements du plan
Affichez l’indice d’insertion et le plan actualisé dans une interface d’approbation avant de modifier le fichier original.
Questions fréquentes
Cette capacité modifie-t-elle le fichier PDF lui-même ?
Non. Elle renvoie une représentation actualisée du plan qu’un logiciel PDF ou un flux documentaire pourra appliquer.
Où le signet est-il placé si un autre vise la même page ?
Il est inséré après tous les signets existants de cette page, dans l’ordre fourni.
Peut-on ajouter des signets imbriqués ?
Non. Cette opération ciblée ajoute un signet de premier niveau à un plan ordonné par page.
Peut-on ajouter le premier signet d'un PDF qui n'en a aucun ?
Oui. Un plan vide est accepté : la même opération sert à créer le premier signet ou à compléter une longue table des matières, sans changer de mode.
Que se passe-t-il si les signets existants ne suivent pas l'ordre des pages ?
Ils sont refusés. Les signets existants doivent aller de la plus petite à la plus grande page ; accepter une liste en désordre rendrait la bonne position ambiguë et pourrait réorganiser en silence la navigation voulue par l'auteur.
Outils associés
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-add \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"page_count":24,"outline":[{"title":"Introduction","page":1},{"title":"Results","page":12}],"title":"Methods","page":7}'const res = await fetch("https://api.kit.forhosting.com/pdf/bookmarks-add", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"page_count": 24,
"outline": [
{
"title": "Introduction",
"page": 1
},
{
"title": "Results",
"page": 12
}
],
"title": "Methods",
"page": 7
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/pdf/bookmarks-add",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"page_count": 24,
"outline": [
{
"title": "Introduction",
"page": 1
},
{
"title": "Results",
"page": 12
}
],
"title": "Methods",
"page": 7
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/pdf/bookmarks-add", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"page_count":24,"outline":[{"title":"Introduction","page":1},{"title":"Results","page":12}],"title":"Methods","page":7}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"page_count":24,"outline":[{"title":"Introduction","page":1},{"title":"Results","page":12}],"title":"Methods","page":7}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/pdf/bookmarks-add", 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
{
"page_count": 24,
"outline": [
{
"title": "Introduction",
"page": 1
},
{
"title": "Results",
"page": 12
}
],
"title": "Methods",
"page": 7
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "pdf.bookmarks_add",
"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. |
Notes techniques
Validez les limites et conservez un ordre prévisible
La page demandée doit donc être un entier compris entre 1 et page_count, bornes incluses. Sans réseau, horodatage, identifiant aléatoire ni comparaison régionale, une même entrée JSON donne toujours la même sortie.
Intégrez le plan renvoyé à votre flux documentaire
La réponse contient page_count, le nombre final de signets, un inserted_index commençant à zéro et le plan actualisé complet. Utilisez inserted_index si une interface de révision doit mettre en évidence la ligne créée, ou ignorez-le et transmettez directement le plan à l’étape suivante. L’outil du navigateur permet à un éditeur de contrôler rapidement une destination avant publication, tandis qu’un appel d’API à $0.002 convient aux opérations répétées : ajout d’une mention légale, d’une annexe, de notes de version ou d’un chapitre généré.
Questions techniques
Comment les pages sont-elles numérotées ?
La numérotation commence à un : 1 est la première page et page_count la dernière destination valide.
Que se passe-t-il si la page cible est hors limites ?
La requête échoue avec invalid_input et un message indiquant la plage valide.
Quel est le prix d’une requête API ?
Une requête API réussie coûte $0.002 ; la même opération déterministe est gratuite dans votre navigateur.