[Python] Parser du PDF
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

[Python] Parser du PDF



  1. #1
    Loupsio

    [Python] Parser du PDF


    ------

    Bonjour à tous,
    Je cherche à parser du PDF avec python,
    j'ai vu qu'il existait des outils tels que pyPDF2 ou pdfMiner mais ceux ci servent à lire le PDF et a chercher des mots, un peu comme s'il s'agissait d'un .txt, (ou récupérer les métadonnées, mais cela reste donc limité)
    Or j'ai un pdf créé avec LaTeX (package hyperref) ce qui me permet non seulement d'avoir des champs remplissables (champs a écrire, menu déroulants, etc...) dans le pdf, mais aussi de nommer chaque champs comme un html afin de pouvoir y avoir accès plus tard, ex :

    Code:
    \TextField[name=poids]{Poids :}
    
    \ChoiceMenu[name=sexe,combo]{Sexe}{Masculin, Féminin, Non-binaire}
    Chaque question remplissable du pdf a donc un "name" associé, et je souhaiterai parser les informaions afin de recueillir les champs rempli du PDF grâce à cela

    Celui qui avait l'air le plus complet est pyPDF2, mais je n'ai pas vu quoi que ce soit qui mentionne de parser et récupérer autre chose que les métadonnées (titre auteur...), je n'ai rien vu sur les champs remplissables
    car lorsqu'on passe par :
    Code:
     pdf.getDocumentInfo()
    il récupère des attributs connus :
    '/Author'
    '/CreationDate'
    '/Creator'
    '/Producer'
    '/Title'

    Mais pas des attributs qu'on aurait nous même donné,

    Merci à vous

    -----
    Dernière modification par Loupsio ; 23/09/2019 à 09h20.

  2. #2
    pm42

    Re : [Python] Parser du PDF

    Tu as lu ceci : https://stackoverflow.com/questions/...ython/43680515 ?
    Cela semble être proche de ton besoin (voir la dernière réponse aussi).

  3. #3
    Loupsio

    Re : [Python] Parser du PDF

    Salut,
    Merci pm42 de ta réponse, non je n'étais pas tombé dessus, effectivement ca répond à mon problème (j'ai juste une dernière question, cf. fin de message), en tout cas c'est assez pour que je puisse me débrouiller pour le reste
    En revanche je n'ai cependant pas compris l’intégralité du code que j'ai réutilisé, mais assez pour corriger les problèmes engendrés par le code que j'ai repris et que ca fonctionne (ce qui est l'essentiel)

    pour ceux par la suite que cela intéresserait j'ai utilisé celui ci (car les autres propositions avec d'autres packages étaient bieeeeen plus long que ce à quoi je m'attendais)
    Code:
    import sys
    from pdfminer.pdfparser import PDFParser
    from pdfminer.pdfdocument import PDFDocument
    from pdfminer.pdftypes import resolve1
    
    #filename = sys.argv[1]
    fp = open("Test.pdf", 'rb')
    
    parser = PDFParser(fp)
    doc = PDFDocument(parser)
    fields = resolve1(doc.catalog['AcroForm'])['Fields']
    for i in fields:
        field = resolve1(i)
        name, value = field.get('T'), field.get('V')
        print('{0}: {1}'.format(name, value))
    En revanche j'obtenais des : "civilite: b'\xfe\xff\x00M\x00.'"
    Après plusieurs essais c'est parce que c'était codé en utf-16, j'ai donc remplacé l'avant dernière ligne par
    Code:
    name, value = field.get('T').decode('utf-16'), field.get('V').decode('utf-16')
    Cependant cela me soulève juste une dernière question du coup, est-ce que l'encodage de ce qui est contenu dans le champs dépend de la machine utilisée au moment de la création du fichier PDF ou de la machine utilisée au moment du remplissage des champs ? car habituellement sur linux tout mes trucs sont en utf-8 par défaut, ce qui n'est pas forcément le cas de windows , (même rarement, je crois que c'est plutôt ISO), cependant ici j'ai eu la surprise que ce soit de l'utf-16, (je ne savais meme pas que je pouvais faire de l'utf-16)
    Du coup est ce que ce sera tout le temps de l'utf-16 peut importe l'utilisateur et la machine qu'il utilise pour le remplir? ou est-ce que si quelqu'un rempli les champs, enregistre le pdf et me le renvoi cela peut être autre chose que de l'utf-16?

  4. #4
    pm42

    Re : [Python] Parser du PDF

    Il semble que ce soit compliqué : https://stackoverflow.com/questions/...their-encoding

    Mais ta librairie ne fait pas la conversion quand tu spécifie le decode(‘utf-16’) ?

  5. A voir en vidéo sur Futura
  6. #5
    Loupsio

    Re : [Python] Parser du PDF

    Quand je spécifie decode('utf-16') elle me renvoi bien ce que je vois dans le pdf quand je l'ouvre avec un lecteur pdf classique, mais c'est moi qui ai créé et rempli le pdf, si quand j'ai rempli le pdf test avec "ma machine" , celle ci a enregistré les champs en utf-16 et que quelqu'un d'autre qui remplirai le pdf le remplirai en autre chose que de l'utf-16, alors le .decode('utf-16') brut dans le code python ne servirai a rien et il faudrait lui faire détecter automatiquement l'encodage du fichier dans ce cas

    D'ailleurs au passage tout n'est pas en utf-16, je viens de m'apercevoir que pour que tout soit nickel c'est cette ligne que je dois mettre :
    Code:
    name, value = field.get('T').decode('utf-8'), field.get('V').decode('utf-16')
    Car les "names" sont en utf-8 et les "values" en utf-16 (comme effectivement c'est dit dans le lien que tu viens d'envoyer, il peut y avoir plusieurs encodages sur une même page pdf, donc pas de détection automatique de l'encodage du document du coup)

    Donc si j'ai des 100aines de pdf rempli par des 100aines de personnes il faudrait donc faire au cas par cas si l'encodage n'est pas le même d'une personne à l'autre, et qu'en plus ce n'est pas le même encodage pour l'intégralité du document ?
    (à moins que l'encodage des champs soit défini au moment de la création du pdf avec LaTeX et non pas au moment du remplissage de celui ci par l'utilisateur, d’où mon questionnement)

  7. #6
    pm42

    Re : [Python] Parser du PDF

    Citation Envoyé par Loupsio Voir le message
    Donc si j'ai des 100aines de pdf rempli par des 100aines de personnes il faudrait donc faire au cas par cas si l'encodage n'est pas le même d'une personne à l'autre, et qu'en plus ce n'est pas le même encodage pour l'intégralité du document ?
    Je ne sais pas. Il faut sans doute faire des essais. Ou trouver où est défini l'encodage d'un champ.

Discussions similaires

  1. Aide Parser pour Formules écrites en Latec
    Par Ludwig1 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 21/12/2016, 09h20
  2. en python le multi tache n'est pas possible alors pourquoi les threads existent sur python?
    Par docEmmettBrown dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 10/06/2015, 15h47
  3. Parser un tableau html
    Par squal31 dans le forum Programmation et langages, Algorithmique
    Réponses: 20
    Dernier message: 15/09/2011, 16h22
  4. Comment ecrire un parser (syntaxique) en C ?
    Par invitef6b3c3d3 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 09/09/2011, 11h14
  5. Parser 'proprement' en C
    Par ze6killer dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 09/10/2008, 18h17