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

Bibliothèques tierces Python Discussion :

[PyPDF2] Ajouter une annotation à une page existante


Sujet :

Bibliothèques tierces Python

  1. #1
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut [PyPDF2] Ajouter une annotation à une page existante
    Bonjour,

    J'utilise PyPDF2 pour collecter des partitions et les concaténer dans un "livre". J'utilise PdfFileWriter et PdfFileReader. J'écris chaque page lue de chaque fichier source, ça marche d'ailleurs très bien, mais j'aimerai ajouter de temps en temps une annotation (un petit texte supplémentaire). J'ai lu la doc de PyPDF2. La classe PageObject() (qui semble être celle de chaque page obtenue avec le reader) ne contient aucune méthode qui permettrait de faire ça... Ai-je raté quelque chose?

    A+

    Pfeuh

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    from PyPDF2 import PdfFileReader
    from PyPDF2 import PdfFileWriter
     
    pdf_writer = PdfFileWriter()
     
    for fname in ("./test/a1.pdf", "./test/a2.pdf", "./test/a3.pdf"):
        input_pdf = PdfFileReader(fname)
        nb_pages = input_pdf.getNumPages()
        for page_num in range(nb_pages):
            page = input_pdf.getPage(page_num)
            # --------------------------
            # ajouter ici une annotation
            # --------------------------
            pdf_writer.addPage(page)
     
    with open("./test/book.pdf", mode="wb") as output_file:
        pdf_writer.write(output_file)

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Ai-je raté quelque chose?
    La partie "comment font les autres?" en cherchant un peu sur Internet retourne ce genre d'article qui donne des tas des pistes.... qui devrait donner des pistes sur quoi chercher dans la documentation de pyPDF2 pour faire çà (si la question était juste de comment faire avec pypdf2)

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

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Tu crois vraiment que je n'ai pas "fait comme les autres" et que je n'ai pas cherché avant de poster? L'article dont tu donnes le lien est pile le genre d'article que j'ai déjà visionné, mais ça reste de la magie noire... Très peu pédagogique et énormément de zones d'ombre, par exemple, au hasard, pourquoi faut-il deux librairies, pypdf et reportlab? Elles sont si mal faites que ça?

    C'est sûr que dans l'absolu, ça peut résoudre le problème, mais au niveau compréhension, je ne suis pas plus avancé. Merci quand même. Je continue à chercher. Comme les autres.

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Bonjour.

    Avec la lib PyMuPDF, et particulièrement sa classe Page, il est possible d'insérer du texte dans une page de PDF.

    Voir la méthode Page.add_freetext_annot.


  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par pfeuh Voir le message
    L'article dont tu donnes le lien est pile le genre d'article que j'ai déjà visionné, mais ça reste de la magie noire...
    Lorsque vous demandez de l'aide, on ne sait pas quelles pistes vous avez déjà sondé...
    De plus, vous ne précisez pas si vous voulez absolument faire ça avec PyPDF2 ou si une solution qui fonctionne pourrait suffire.

    Citation Envoyé par pfeuh Voir le message
    Très peu pédagogique et énormément de zones d'ombre, par exemple, au hasard, pourquoi faut-il deux librairies, pypdf et reportlab? Elles sont si mal faites que ça?
    Si on essaie de comprendre ce que fait le code, çà crée une page avec le Canvas de reportlab pour y placer le texte. Puis on lit le fichier avec pypdf et çà utilise la méthode .mergepage pour "coller" le texte par dessus.
    C'est le même genre de méthode utilisée dans la documentation de pypdf2 (sans autre bibliothèque, mais pas testé).

    Citation Envoyé par pfeuh Voir le message
    C'est sûr que dans l'absolu, ça peut résoudre le problème, mais au niveau compréhension, je ne suis pas plus avancé.
    Là j'ai du mal à vous suivre... car il faut pouvoir imaginer les contraintes à satisfaire pour effectuer la mise à jour d'une ou de plusieurs pages d'un PDF existant. L'équivalent en programmation serait ajouter une fonctionnalité à un programme sans pouvoir le reconstruire depuis le source.
    Et ça sort largement du cadre de la question Python...

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

  6. #6
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Merci messieurs pour ces pistes.

    Citation Envoyé par wiztricks Voir le message
    vous ne précisez pas si vous voulez absolument faire ça avec PyPDF2 ou si une solution qui fonctionne pourrait suffire.
    Disons que la solution qui fonctionne, je l'avais déjà avant de poster. Ma vraie question (et je l'ai d'ailleurs explicitement posée) est "Pourquoi faut-il 2 bibliothèques pour le faire?" Je pense avoir compris maintenant pourquoi, je pense que PyPDF2 n'est pas prévu pour créer du contenu, mais je peux bien sûr me tromper.

    N'ayant jamais mis les mains dans le cambouis en ce qui concerne le pdf, je n'ai pas compris que ce qu'on appelle "page" dans n'importe quelle bibliothèque, c'est du contenu "brut" qui du coup peut être généré par une bibliothèque quelconque et être importé dans une autre bibliothèque quelconque elle aussi.

    N'hésitez pas a corriger, je suis demandeur.

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Attention : si je vous ai conseillé PyMuPDF, c'est à la place de PyPDF2, pas en complément.

    Dans cette libraire, Page est une classe qui contient des méthodes pour manipuler une page d'un fichier PDF.

    Vous pouvez extraire la page du PDF, la rajouter à un autre PDF, la supprimer, récupérer les images qu'elle contient, le texte, apporter des annotations, faire de l'OCR dessus si le texte n'est pas exploitable par copié/collé, etc.

    En revanche, si tu tiens à rester sur PyPDF2, tu peux fusionner 2 pages de PDF en une seule. L'une d'elle servira de calque et se superposera à l'autre. A toi de faire une page PDF de ton annotation en amont du traitement, puis de l'appliquer sur la page PDF concernée.

    Ca fonctionne très bien avec PyPDF2.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Ma vraie question (et je l'ai d'ailleurs explicitement posée) est "Pourquoi faut-il 2 bibliothèques pour le faire?"
    Ce n'est pas dans le post initial.

    Pour ce qui est de PyPDF2, je vous ai indiqué où ils ont documenté ça.

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

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Citation Envoyé par pfeuh Voir le message
    N'ayant jamais mis les mains dans le cambouis en ce qui concerne le pdf, je n'ai pas compris que ce qu'on appelle "page" dans n'importe quelle bibliothèque, c'est du contenu "brut" qui du coup peut être généré par une bibliothèque quelconque et être importé dans une autre bibliothèque quelconque elle aussi.
    En gros:

    - pdf est un langage de description de pages. Il y a peut-être une définition officielle de ce qu'on appelle "page", mais le plus souvent, une page, c'est ce qui peut être imprimé sur une feuille de papier.

    - La vocation principale de PyPDF2, c'est le "spilt and merge", c'est à dire convertir un fichier pdf multipages en plusieurs fichiers pdf de chacun 1 page, ou au contraire de rassembler plusieurs fichiers pdf en un seul. Et ça, il le fait très bien. Si pyPDF2 fait autre chose, c'est "en plus". Mais pour manipuler des contenus, il y a plus puissant, comme reportlab. Je ne connais pas PyMuPDF.

    - ça, c'est pour piloter du pdf par programme, mais on peut aussi modifier des pdf à la main avec des éditeurs spécialisés comme Adobe Accrobat pro, ou (c'est ce que j'ai), Wondershare PDFElement. Mais ce sont des programmes payants "WYSIWYG" ("what you see is what you get"). Je ne sais pas s'il en existe de gratuits.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  10. #10
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Merci messieurs pour vos réponses.

    Citation Envoyé par tyrtamos Voir le message
    - La vocation principale de PyPDF2, c'est le "spilt and merge" .../... Mais pour manipuler des contenus, il y a plus puissant, comme reportlab.
    Merci beaucoup tyrtamos, c'est la confirmation de ce que j'ai cru comprendre au fur et à mesure que les réponses arrivaient.

Discussions similaires

  1. QTextDocument, ajouter une page
    Par Somato dans le forum Débuter
    Réponses: 1
    Dernier message: 06/12/2008, 18h37
  2. Ajouter une page en fin de rapport
    Par superlofo dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 09/10/2008, 14h13
  3. [Inno Setup] ajouter une page avec des checkbox
    Par cotede2 dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 28/05/2007, 23h01
  4. Réponses: 7
    Dernier message: 15/05/2007, 12h05

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