3 votes

comment vérifier les liens dans un fichier PDF

J'ai un fichier PDF dont je veux vérifier si les liens qu'il contient sont corrects. Corrects dans le sens - toutes les URLs spécifiées sont liées à des pages web et rien n'est cassé. Je cherche un utilitaire simple ou un script qui puisse le faire facilement !

Exemple :

$ testlinks my.pdf
There are 2348 links in this pdf.
2322 links are proper.
Remaining broken links and page numbers in which it appears are logged in brokenlinks.txt

Je n'ai aucune idée de l'existence d'un tel outil, j'ai donc cherché sur Google et sur stackoverflow. Mais je n'ai encore rien trouvé d'utile. J'aimerais donc savoir si quelqu'un a une idée à ce sujet !

Mise à jour : pour que la question soit claire.

6voto

Federico Points 685

Vous pouvez utiliser pdf-link-checker

pdf-link-checker est un outil simple qui analyse un document PDF et vérifie les liens hypertextes cassés. Pour ce faire, il envoie de simples requêtes HTTP à chaque lien trouvé dans un document donné.

Pour l'installer avec pip :

pip install pdf-link-checker

Malheureusement, une dépendance ( pdfminer ) est cassé. Pour le réparer :

pip uninstall pdfminer
pip install pdfminer==20110515

5voto

Jason Buberel Points 1342

Je suggère d'utiliser d'abord l'utilitaire de ligne de commande linux 'pdftotext' - vous pouvez trouver la page de manuel :

pdftotext page de manuel

L'utilitaire fait partie de la collection Xpdf d'outils de traitement PDF, disponible sur la plupart des distributions linux. Voir http://foolabs.com/xpdf/download.html .

Une fois installé, vous pourrez traiter le fichier PDF grâce à pdftotext :

pdftotext file.pdf file.txt

Une fois le traitement effectué, un simple script perl recherche les URL http dans le fichier texte résultant, et les récupère en utilisant LWP::Simple . LWP::Simple->get('http://...') vous permettra de valider les URLs avec un extrait de code tel que :

use LWP::Simple;
$content = get("http://www.sn.no/");
die "Couldn't get it!" unless defined $content;

Cela accomplirait ce que vous voulez faire, je pense. Il existe de nombreuses ressources sur la façon d'écrire des expressions régulières pour faire correspondre des URL http, mais une expression très simple ressemblerait à ceci :

m/http[^\s]+/i

"http suivi d'un ou plusieurs caractères non espace" - en supposant que les URL sont codés en URL de propriété.

1voto

Peter Brooks Points 780

Votre question comporte deux volets.

Vous cherchez à vérifier par regex que le lien contient des informations clés telles que http:// et des codes TLD valides ? Si c'est le cas, je suis sûr qu'un expert en regex passera par là, ou bien jetez un coup d'oeil à regexlib.com qui contient beaucoup de regex existants pour traiter les URLs.

Ou si vous voulez vérifier qu'un site web existe, je vous recommande Python + Requêtes comme vous pourriez script des vérifications pour voir si les sites web existent et ne renvoient pas de codes d'erreur.

C'est une tâche que je suis en train d'accomplir à peu près dans le même but au travail. Nous avons environ 54k liens à traiter automatiquement.

0voto

J.F. Sebastian Points 102961
  1. Collecter les liens par :
    énumération des liens à l'aide de l'API, ou vidage en tant que texte et linkification du résultat, ou enregistrement en tant que html PDFMiner .

  2. Faites des demandes pour les vérifier :
    il existe une pléthore d'options en fonction de vos besoins.

0voto

user1587329 Points 91

https://stackoverflow.com/a/42178474/1587329 Les conseils de l'auteur ont été une source d'inspiration pour l'écriture de cet outil simple (cf. Gist ) :

'''loads pdf file in sys.argv[1], extracts URLs, tries to load each URL'''
import urllib
import sys

import PyPDF2

# credits to stackoverflow.com/questions/27744210
def extract_urls(filename):
    '''extracts all urls from filename'''
    PDFFile = open(filename,'rb')
    PDF = PyPDF2.PdfFileReader(PDFFile)
    pages = PDF.getNumPages()

    key = '/Annots'
    uri = '/URI'
    ank = '/A'

    for page in range(pages):
        pageSliced = PDF.getPage(page)
        pageObject = pageSliced.getObject()
        if pageObject.has_key(key):
            ann = pageObject[key]
            for a in ann:
                u = a.getObject()
                if u[ank].has_key(uri):
                    yield u[ank][uri]

def check_http_url(url):
    urllib.urlopen(url)

if __name__ == "__main__":
    for url in extract_urls(sys.argv[1]):
        check_http_url(url)

Sauvegarder à filename.py en tant que python filename.py pdfname.pdf .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X