IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Extraire le contenu d'un .pdf en Python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Non-informaticien
    Inscrit en
    Août 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non-informaticien

    Informations forums :
    Inscription : Août 2013
    Messages : 37
    Par défaut Extraire le contenu d'un .pdf en Python
    Bonjour,

    je sais que ce sujet a déjà été abordé dans le forum, mais pas dans des sujets postérieurs à 2010, d'après mes recherches...

    Donc mon problème est simple : prendre un fichier .pdf, et en extraire le contenu, comme s'il s'agissait d'un texte, avec open() et readlines(), pour retenir le contenu sous forme de chaines de caractères.

    J'ai essayé plusieurs modules (PDFMiner, pyPdf, etc...), mais je galère pour seulement les installer.

    Connaissez-vous un module récent, simple d'installation, et qui permet cette fonctionnalité ?

    Je vous remercie d'avance.

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    pdfrw semble sympa, mais l'installation des modules est un autre problème que celui posé en titre, ton problème serait plutôt "Difficulté à installer un module python".

    Dans ce cas, par exemple, tu peux utiliser PIP permettant d'installer des modules facilement... sous quelle version python es-tu ? Il me semble que dans les versions 3.4 et plus, pip est déjà pré-installé lors de l'installation python. C'est compatible sur toutes les plateformes.

  3. #3
    Membre chevronné
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2012
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2012
    Messages : 321
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    ... sous quelle version python es-tu ? Il me semble que dans les versions 3.4 et plus, pip est déjà pré-installé lors de l'installation python. C'est compatible sur toutes les plateformes.
    En effet, il me semble bien qu'à partir des versions 2.7 et 3.4, il est normalement intégré. Du coup, en ligne de commande, il faut lancer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pip3 install <nom_module>
    si c'est pour du python 2.7+ alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pip install <nom_module>
    si pip n'est pas installé, alors la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo apt-get install python3-pip
    permettra de le faire (pour python3, pour python 2 c'est python-pip)

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    En effet, il me semble bien qu'à partir des versions 2.7 et 3.4, il est normalement intégré
    Je pensais à l'OS Windows, car je ne l'ai pas... Utilisant Linux, j'attendais une confirmation d'un utilisateur Windows concernant PIP, car je pense que le PO est sous cet OS. C'est de ma faute, j'aurai dû le spécifier dans ma réponse précédente.

  5. #5
    Membre averti
    Homme Profil pro
    Non-informaticien
    Inscrit en
    Août 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non-informaticien

    Informations forums :
    Inscription : Août 2013
    Messages : 37
    Par défaut
    Bonjour Messieurs,

    merci de vos réponses, en effet pdfrw s'installe bien avec PIP. Pour la version de Python 3.4.1 que j'utilise, sous Windows 10, il faut mettre à jour PIP tout de même (https://pip.pypa.io/en/stable/installing/#upgrading-pip).

    Par contre pour pdfrw, je ne suis pas sûr que l'on se soit bien entendus : mon but est de récupérer, autant que faire se peut, le contenu textuel d'un pdf. A moins que je ne me trompe, pdfrw ne me renvoie qu'une liste de balises illisibles.

    J'ai vu d'autres modules comme pdfminer3k que j'ai pu importer via PIP. J'ai également importé le module io, en fait déjà présent sous Python 3, qui permet d'avoir le module StringIO, qui sert normalement à lire des chaines de caractères (https://docs.python.org/2/library/stringio.html).

    Du coup, j'ai trouvé sur StackOverFlow une requête qui correspond assez à ce que je veux faire : http://stackoverflow.com/questions/2...iner-in-python

    Précisément cette requête :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    def convert_pdf_to_txt(path):
      rsrcmgr = PDFResourceManager()
      retstr = StringIO()
      Codec = 'utf-8'
      laparams = LAParams()
      device = TextConverter(rsrcmgr, retstr, codec=Codec, laparams=laparams)
      fp = file(path, 'rb')
      interpreter = PDFPageInterpreter(rsrcmgr, device)
      password = ""
      maxpages = 0
      caching = True
      pagenos=set()
      for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)
        text = retstr.getvalue()
      fp.close()
      device.close()
      retstr.close()
      return text
    Seulement, souci : après avoir installé PDFMiner et io.StringIO, la requête échoue avec ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>>convert_pdf_to_txt(path)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 6, in convert_pdf_to_txt
    TypeError : __init__ got an unexpected keyword argument "codec"

    J'ai ensuite essayé plusieurs manipulations sur la requête, mais rien n'y fit.

    Connaissez-vous PDFMiner ? Et une requête qui fonctionne pour obtenir le contenu textuel d'un PDF?

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par Termirtau Voir le message
    Connaissez-vous PDFMiner ? Et une requête qui fonctionne pour obtenir le contenu textuel d'un PDF?
    L'exemple que vous avez récupéré est pour Python2.7 qui fonctionne avec PDFMiner. Cette bibliothèque n'est pas supportée en Python3, vous avez certainement installé PDFMiner3k dont les interfaces prennent en compte les changements de Python3.

    Ligne 6, virez codec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
             device = TextConverter(rsrcmgr, retstr, laparams=laparams)
    Python sera "content" mais pas sûr que le résultat vous plaise car çà va dépendre du contenu de vos PDF.
    lire la documentation de PDFMiner:
    PDF is evil. Although it is called a PDF "document", it's nothing like Word or HTML document. PDF is more like a graphic representation. PDF contents are just a bunch of instructions that tell how to place the stuff at each exact position on a display or paper. In most cases, it has no logical structure such as sentences or paragraphs and it cannot adapt itself when the paper size changes. PDFMiner attempts to reconstruct some of those structures by guessing from its positioning, but there's nothing guaranteed to work. Ugly, I know. Again, PDF is evil.
    mais vous aurez peut être de la chance...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    pdfrw semble sympa, mais l'installation des modules est un autre problème que celui posé en titre, ton problème serait plutôt "Difficulté à installer un module python".

    Dans ce cas, par exemple, tu peux utiliser PIP permettant d'installer des modules facilement... sous quelle version python es-tu ? Il me semble que dans les versions 3.4 et plus, pip est déjà pré-installé lors de l'installation python. C'est compatible sur toutes les plateformes.
    Pour ma part je créé un raccourci du setup.py et je rajoute install à la fin de la cible.
    Cible : C:\Users\*****\Downloads\pdfrw-0.2\setup.py install

    J'ai installé PyPDF2, ReportLab, slate, PDFMiner... et je n'ai pas réussi à en exploiter un seul correctement . J'ai python 3.5.2 et j'ai l'impression que pdfrw est juste conçu pour réécrire des fichiers en PDF ou à la rigueur obtenir les infos du documents mais pas vraiment le contenu texte, est ce que je me trompe? Je trouve les modules compliqués à utiliser pour un débutant pour moi, le pire c'est PDFMiner pour extraire le texte du fichier PDF il faut un pavé et installer cStringIO si je comprends bien, bref c'est un peu compliqué et pas compatible avec les versions 3. de python...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
    from pdfminer.converter import TextConverter
    from pdfminer.layout import LAParams
    from pdfminer.pdfpage import PDFPage
    from cStringIO import StringIO
     
    def convert_pdf_to_txt(path):
        rsrcmgr = PDFResourceManager()
        retstr = StringIO()
        codec = 'utf-8'
        laparams = LAParams()
        device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
        fp = file(path, 'rb')
        interpreter = PDFPageInterpreter(rsrcmgr, device)
        password = ""
        maxpages = 0
        caching = True
        pagenos=set()
     
        for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
            interpreter.process_page(page)
     
        text = retstr.getvalue()
     
        fp.close()
        device.close()
        retstr.close()
        return text
    J'ai le sentiment que je vais devoir revenir à python 2.4...

  8. #8
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par LeNarvalo Voir le message
    J'ai installé PyPDF2, ReportLab, slate, PDFMiner... et je n'ai pas réussi à en exploiter un seul correctement .
    En ce qui me concerne, j'utilise PyPDF2 sur Python 3.4.3, et ça marche très bien! Je l'installe avec pip, et je ne l'utilise que pour faire du "split & merge".

    Citation Envoyé par LeNarvalo Voir le message
    J'ai le sentiment que je vais devoir revenir à python 2.4...
    Ce serait vraiment dommage, mais revenir à Python 3.4 serait plus judicieux: j'ai aussi essayé Python 3.5 et je suis revenu en arrière à cause de PyQt5.7 ... (http://www.developpez.net/forums/d16...5/#post8738200)

  9. #9
    Membre averti
    Homme Profil pro
    Non-informaticien
    Inscrit en
    Août 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non-informaticien

    Informations forums :
    Inscription : Août 2013
    Messages : 37
    Par défaut
    Bonjour,

    je relance la conversation, car j'ai installé PyPDF2 (je suis toujours sur Python 3.4.1).

    Je ne sais pas quel problème LeNarvalo a eu, ni comment tyrtamos utilise ce module, mais quand j'entre ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import PyPDF2
    pdf_file=open("F:\IALeCun.pdf")
    read_pdf=PyPDF2.PdfFileReader(pdf_file)
    ...alors j'obtiens l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    io.UnsupportedOperation: can't do nonzero end-relative seeks
    Savez-vous d'où viens cette erreur ? Puis-je la modifier avec quelques corrections sur pdf.py (dans la librairie PyPDF2) ?


    Pour information, le texte "IALeCun.pdf" que j'importe est celui-là, si vous voulez faire le même essai :
    https://www.college-de-france.fr/med...__Y._LeCun.pdf

  10. #10
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    L'ouverture de ton pdf n'est sans doute pas fait en mode binaire, il faut le faire...

Discussions similaires

  1. [FPDF] Extraire le texte d'un pdf
    Par SandraG dans le forum Bibliothèques et frameworks
    Réponses: 13
    Dernier message: 08/10/2009, 14h48
  2. [PDF] extraire le contenu d'un pdf en text simple
    Par SpaceFrog dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 01/10/2009, 08h32
  3. [VB6] Afficher le contenu d'un Pdf dans une form
    Par joquetino dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 04/08/2006, 19h59
  4. Extraire le contenu des balises XML
    Par calimero2611 dans le forum Modules
    Réponses: 7
    Dernier message: 12/06/2006, 15h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo