ForHosting KIT · Documents et PDF

Extraire les liens d'un PDF

Sur sept annotations d'un PDF, vous obtenez les quatre vrais liens web, chacun avec son numéro de page ; commentaires, surlignages et renvois internes sont écartés. Un lien répété sur trois pages apparaît trois fois. Gratuit dans votre navigateur.

  • Gratuit
  • Fonctionne dans votre navigateur
  • Sans inscription
  • Vos données restent sur votre appareil
Utilisez-le depuis WebAPIE-mailTelegramApp bientôt

Tout se passe dans votre navigateur : gratuit, sans envoi de vos données.

L'extracteur de liens PDF lit la liste d'annotations page par page d'un PDF — exactement ce qu'une bibliothèque de lecture comme pdf.js renvoie depuis getAnnotations — et retourne chaque hyperlien trouvé, avec son numéro de page et son URL cible. C'est l'étape qui manquait entre « j'ai les annotations » et « je sais où pointe ce document » : un passage déterministe, sans rendu, sans OCR et sans conjecture. Les liens purement internes et les annotations qui ne sont pas des liens sont écartés, de sorte que vous récupérez une liste propre et ordonnée des références externes que fait le document, prête pour un audit, une liste de départ pour un crawler ou un contrôle de conformité.

Pourquoi les annotations et pas le texte brut

Chercher des liens en parcourant le texte extrait n'est pas fiable : une URL visible dans le texte peut ne pas être cliquable, et un lien cliquable peut afficher un texte d'ancre qui ne ressemble en rien à sa cible. La source qui fait autorité pour extraire les liens d'un PDF est la couche d'annotations. Les lecteurs PDF stockent les éléments interactifs sous forme d'annotations rattachées à une page, et les hyperliens y vivent comme des entrées de sous-type Link avec une URI.

Cette capacité prend cette liste en entrée — un enregistrement par annotation avec son numéro de page, son sous-type et son URI optionnelle — et la filtre jusqu'aux véritables hyperliens sortants. Comme le numéro de page voyage avec chaque annotation, chaque résultat vous dit exactement où se trouve le lien dans le document, ce qui rend la sortie exploitable pour des relectures et des audits plutôt qu'une simple liste d'URLs.

Ce que l'extracteur garde et ce qu'il écarte

Le filtre est délibérément strict. Seules les annotations dont le sous-type est Link sont prises en compte ; les commentaires, les surlignages, les widgets de formulaire et tout autre type d'annotation sont ignorés. Parmi les annotations Link, seules survivent celles qui portent une URI non vide : une annotation de lien sans URI est généralement un saut interne vers une autre page, c'est-à-dire une navigation à l'intérieur du document et non un hyperlien vers une cible externe, donc elle est exclue.

Les URIs sont débarrassées des espaces environnants, mais sinon renvoyées telles quelles : sans réécriture, sans résolution, sans déduplication. Si la même URL apparaît sur trois pages, vous obtenez trois entrées, car le fait qu'elle apparaisse trois fois est une information. La sortie est ordonnée exactement comme arrivent les annotations, ce qui en pratique correspond à l'ordre du document.

La même URL peut légitimement apparaître plusieurs fois dans un long document — dans le pied de page répété, dans une bibliographie et dans une page de contact — et fusionner ces occurrences effacerait la distinction entre une citation ponctuelle et une référence systématique ; l'extracteur les conserve donc toutes et laisse l'appelant décider quoi agréger ensuite.

Où elle s'insère dans un pipeline

Le flux typique est le suivant : ouvrir le PDF avec une bibliothèque de lecture, collecter les annotations page par page, les aplatir dans la liste d'enregistrements attendue par cette capacité, puis les envoyer. Vous récupérez un compteur et un tableau de paires {page, url}. Les équipes s'en servent pour inventorier les références sortantes des contrats et des rapports avant publication, pour constituer la liste de départ d'une passe de vérification des liens, ou pour confirmer qu'un document anonymisé ne pointe plus là où il ne devrait pas.

Une liste d'annotations vide est traitée comme une erreur et non comme un résultat vide, car une liste vide signifie presque toujours que l'étape d'extraction amont a échoué ou que le fichier n'a jamais eu de couche d'annotations — et renvoyer silencieusement zéro lien le masquerait. Le même code s'exécute gratuitement dans votre navigateur sur cette page : vous pouvez donc valider une charge en la collant et ne payer que lorsque vous automatisez l'appel.

Auditez les références sortantes avant publication

Inventoriez chaque hyperlien d'un rapport ou d'un contrat, avec les numéros de page, pour que les relecteurs confirment que chaque cible est voulue et correcte.

Alimentez une vérification de liens cassés

Transmettez les URLs extraites à un vérificateur de liens pour repérer les destinations mortes dans un document que vos clients s'apprêtent à télécharger.

Vérifiez un document anonymisé

Confirmez que la version publiée d'un PDF ne pointe plus vers des URLs internes de préproduction ou de partenaires qui auraient dû être supprimées.

Combien ça coûte ?

L'exécution est aussi gratuite dans votre navigateur sur cette page.

Quelle entrée attend-elle ?

Une liste d'annotations aplatie : un enregistrement par annotation avec son numéro de page commençant à 1, son sous-type et, pour les liens, son URI. Des bibliothèques comme pdf.js produisent cela depuis getAnnotations avec une petite étape de correspondance.

Pourquoi une erreur plutôt qu'une liste vide ?

Un tableau d'annotations vide signifie que l'extraction amont a échoué ou que le PDF n'a pas de couche d'annotations.

Les sauts de page internes sont-ils inclus ?

Non. Les annotations de lien sans URI sont des destinations internes au document, pas des hyperliens sortants, et elles sont ignorées.

Les URLs en double sont-elles dédupliquées ?

Non. Si la même URL est liée sur trois pages, vous obtenez trois entrées, car chaque occurrence porte son propre numéro de page et cette répétition est en soi une information utile.

Les URLs sont-elles téléchargées ou validées ?

Non. L'extraction est purement locale et déterministe ; aucune requête réseau n'est faite vers les cibles.

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.

POSThttps://api.kit.forhosting.com/pdf/extract-links

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é.

curl -X POST https://api.kit.forhosting.com/pdf/extract-links \
  -H "Authorization: Bearer $KIT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"annotations":[{"page":1,"subtype":"Link","uri":"https://example.com/docs"},{"page":1,"subtype":"Text","uri":null},{"page":3,"subtype":"Link","uri":"https://example.com/contact"}]}'
{
  "annotations": [
    {
      "page": 1,
      "subtype": "Link",
      "uri": "https://example.com/docs"
    },
    {
      "page": 1,
      "subtype": "Text",
      "uri": null
    },
    {
      "page": 3,
      "subtype": "Link",
      "uri": "https://example.com/contact"
    }
  ]
}
{
  "task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
  "type": "pdf.extract_links",
  "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.

par requête$0.002

Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.

max_mb1
max_annotations50000
HTTPCodeSignification
401unauthorizedClé API absente ou invalide : vérifiez l’en-tête Authorization.
402insufficient_balanceSolde insuffisant : rechargez votre compte pour lancer cette tâche.
404unknown_typeType de tâche inconnu : vérifiez le champ type de votre requête.
429rate_limitedTrop de requêtes : ralentissez la cadence, puis réessayez.

Pourquoi les annotations et pas le texte brut

Le contrat valide en outre chaque enregistrement au fil de l'eau : un numéro de page manquant, une page non entière ou un sous-type absent arrête l'appel avec une erreur invalid_input claire, au lieu de produire en silence une réponse partielle que vous seriez tenté de croire.

Consulter la documentation complète du KIT →