Comment travailler avec un PDF en Python – Real Python

By | avril 17, 2019

Python pas cher

Le format de document portable ou PDF est un format de fichier qui peut être utilisé pour présenter et échanger des documents de manière fiable entre systèmes d'exploitation. Le PDF a été inventé à l'origine par Adobe, mais il s'agit maintenant d'un standard ouvert géré par l'Organisation internationale de normalisation (ISO). Vous pouvez travailler avec un PDF préexistant en Python en utilisant le PyPDF2 paquet.

PyPDF2 est un package pur-Python que vous pouvez utiliser pour différents types d'opérations PDF.

À la fin de cet article, vous saurez comment procéder:

  • Extraire les informations du document à partir d'un PDF en Python
  • Faire pivoter les pages
  • Fusionner des PDF
  • PDF divisés
  • Ajouter des filigranes
  • Crypter un PDF

Commençons!

L'histoire de pyPdf, PyPDF2, et PyPDF4

L'original pyPdf paquet a été libéré en 2005. La dernière version officielle de pyPdf était en 2010. Après un an environ, une société appelée Phasit a sponsorisé une fourchette de pyPdf appelé PyPDF2. Le code a été écrit pour être rétro-compatible avec l'original et a très bien fonctionné pendant plusieurs années, sa dernière version date de 2016.

Il y avait une brève série de versions d'un paquet appelé PyPDF3, puis le projet a été renommé en PyPDF4. Tous ces projets font à peu près la même chose, mais la plus grande différence entre pyPdf et PyPDF2 + est que ces dernières versions ont ajouté la prise en charge de Python 3. Il y a un autre fork en Python 3 de l'original pyPdf pour Python 3, mais celui-ci n'a pas été maintenu depuis de nombreuses années.

Tandis que PyPDF2 a été récemment abandonné, le nouveau PyPDF4 n'a pas une compatibilité ascendante complète avec PyPDF2. La plupart des exemples de cet article fonctionneront parfaitement avec PyPDF4, mais il y en a qui ne peuvent pas, c'est pourquoi PyPDF4 n'est pas présenté plus lourdement dans cet article. Ne hésitez pas à échanger les importations pour PyPDF2 avec PyPDF4 et voyez comment cela fonctionne pour vous.

pdfrw: Une alternative

Patrick Maupin a créé un package appelé pdfrw qui peut faire beaucoup des mêmes choses que PyPDF2 Est-ce que. Vous pouvez utiliser pdfrw pour tous les mêmes types de tâches que vous apprendrez à faire dans cet article pour PyPDF2, à l’exception notable du cryptage.

La plus grande différence en matière de pdfrw c’est qu’il s’intègre au package ReportLab afin que vous puissiez créer un nouveau fichier PDF préexistant et en créer un nouveau à l’aide de ReportLab en utilisant tout ou partie du fichier PDF préexistant.

Installation

L'installation PyPDF2 peut être fait avec pépin ou conda si vous utilisez Anaconda au lieu de Python standard.

Voici comment installer PyPDF2 avec pépin:

L'installation est assez rapide PyPDF2 n'a pas de dépendances. Vous passerez probablement autant de temps à télécharger le paquet qu’à l’installer.

Maintenant passons à autre chose et apprenons à extraire des informations d’un fichier PDF.

Vous pouvez utiliser PyPDF2 extraire les métadonnées et du texte d'un PDF. Cela peut être utile lorsque vous effectuez certains types d’automatisation sur vos fichiers PDF préexistants.

Voici les types actuels de données pouvant être extraites:

  • Auteur
  • Créateur
  • Producteur
  • Assujettir
  • Titre
  • Nombre de pages

Vous devez rechercher un fichier PDF à utiliser pour cet exemple. Vous pouvez utiliser n’importe quel fichier PDF que vous avez sur votre machine. Pour faciliter les choses, je suis allé à Leanpub et j'ai pris un échantillon de l'un de mes livres pour cet exercice. L’échantillon que vous souhaitez télécharger s’appelle reportlab-sample.pdf.

Écrivons du code en utilisant ce fichier PDF et apprenons comment vous pouvez accéder à ces attributs:

# extract_doc_info.py

de PyPDF2 importation PdfFileReader

def extract_information(pdf_path):
    avec ouvrir(pdf_path, 'rb') comme F:
        pdf = PdfFileReader(F)
        information = pdf.getDocumentInfo()
        nombre de pages = pdf.getNumPages()

    SMS = F"" "
                Des informations sur pdf_path: 

                Auteur: information.author
                Créateur: information.creator
                Producteur: information.producer
                Assujettir: information.subject
                Titre: information.title
                Nombre de pages: nombre de pages
                "" "

    impression(SMS)
    revenir information

si __prénom__ == '__principale__':
    chemin = 'reportlab-sample.pdf'
    extract_information(chemin)

Ici vous importez PdfFileReader du PyPDF2 paquet. le PdfFileReader est une classe avec plusieurs méthodes pour interagir avec les fichiers PDF. Dans cet exemple, vous appelez .getDocumentInfo (), qui retournera une instance de DocumentInformation. Il contient la plupart des informations qui vous intéressent. Vous appelez également .getNumPages () sur l'objet lecteur, qui renvoie le nombre de pages du document.

le information La variable a plusieurs attributs d'instance que vous pouvez utiliser pour obtenir le reste des métadonnées souhaitées dans le document. Vous imprimez ces informations et les renvoyez également pour une utilisation future éventuelle.

Tandis que PyPDF2 a .extractText (), qui peut être utilisé sur ses objets de page (non représentés dans cet exemple), cela ne fonctionne pas très bien. Certains PDF renverront du texte et d’autres une chaîne vide. Lorsque vous souhaitez extraire du texte d’un fichier PDF, vous devez consulter le PDFMiner projet à la place. PDFMiner est beaucoup plus robuste et a été spécialement conçu pour extraire du texte à partir de PDF.

Vous êtes maintenant prêt à apprendre comment faire pivoter des pages PDF.

Comment faire pivoter des pages

Parfois, vous recevrez des PDF contenant des pages en mode paysage au lieu du mode portrait. Ou peut-être qu'ils sont même à l'envers. Cela peut se produire lorsque quelqu'un numérise un document au format PDF ou par courrier électronique. Vous pouvez imprimer le document et lire la version papier ou vous pouvez utiliser la puissance de Python pour faire pivoter les pages incriminées.

Pour cet exemple, vous pouvez choisir un article de Real Python et l’imprimer au format PDF.

Apprenons à faire pivoter quelques-unes des pages de cet article avec PyPDF2:

# rotate_pages.py

de PyPDF2 importation PdfFileReader, PdfFileWriter

def rotation_pages(pdf_path):
    pdf_writer = PdfFileWriter()
    lecteur PDF = PdfFileReader(chemin)
    # Faire pivoter la page de 90 degrés vers la droite
    Page 1 = lecteur PDF.getPage(0).le sens des aiguilles d'une montre(90)
    pdf_writer.ajouter une page(Page 1)
    # Faire pivoter la page de 90 degrés vers la gauche
    page 2 = lecteur PDF.getPage(1).rotateCounterClockwise(90)
    pdf_writer.ajouter une page(page 2)
    # Ajouter une page en orientation normale
    pdf_writer.ajouter une page(lecteur PDF.getPage(2))

    avec ouvrir('rotate_pages.pdf', 'wb') comme fh:
        pdf_writer.écrire(fh)

si __prénom__ == '__principale__':
    chemin = 'Jupyter_Notebook_An_Introduction.pdf'
    rotation_pages(chemin)

Pour cet exemple, vous devez importer le PdfFileWriter en plus de PdfFileReader parce que vous aurez besoin d'écrire un nouveau PDF. rotation_pages () prend le chemin vers le PDF que vous souhaitez modifier. Dans cette fonction, vous devrez créer un objet écrivain que vous pourrez nommer. pdf_writer et un objet lecteur appelé lecteur PDF.

Ensuite, vous pouvez utiliser .GetPage () pour obtenir la page désirée. Ici, vous prenez la page zéro, qui est la première page. Ensuite, vous appelez l’objet page .le sens des aiguilles d'une montre() méthode et passer à 90 degrés. Ensuite, pour la page deux, vous appelez .rotateCounterClockwise () et passez-le également à 90 degrés.

Après chaque appel aux méthodes de rotation, vous appelez .ajouter une page(). Cela ajoutera la version pivotée de la page à l'objet écrivain. La dernière page que vous ajoutez à l'objet écrivain est la page 3 sans aucune rotation.

Enfin, vous écrivez le nouveau PDF en utilisant .écrire(). Il prend un objet de type fichier en tant que paramètre. Ce nouveau PDF contiendra trois pages. Les deux premiers seront pivotés dans des directions opposées et seront en paysage tandis que la troisième page est une page normale.

Voyons maintenant comment fusionner plusieurs PDF en un seul.

Comment fusionner des PDF

Il existe de nombreuses situations dans lesquelles vous souhaiterez regrouper deux fichiers PDF ou plus et les fusionner en un seul fichier PDF. Par exemple, vous pourriez avoir une page de garde standard devant traiter de nombreux types de rapports. Vous pouvez utiliser Python pour vous aider à faire ce genre de chose.

Pour cet exemple, vous pouvez ouvrir un PDF et imprimer une page en tant que PDF séparé. Recommencez ensuite, mais avec une page différente. Cela vous donnera quelques entrées à utiliser à titre d'exemple.

Continuons et écrivons du code que vous pourrez utiliser pour fusionner des PDF:

# pdf_merging.py

de PyPDF2 importation PdfFileReader, PdfFileWriter

def merge_pdfs(les chemins, sortie):
    pdf_writer = PdfFileWriter()

    pour chemin dans les chemins:
        lecteur PDF = PdfFileReader(chemin)
        pour page dans intervalle(lecteur PDF.getNumPages()):
            # Ajouter chaque page à l'objet écrivain
            pdf_writer.ajouter une page(lecteur PDF.getPage(page))

    # Ecrire le PDF fusionné
    avec ouvrir(sortie, 'wb') comme en dehors:
        pdf_writer.écrire(en dehors)

si __prénom__ == '__principale__':
    les chemins = [[[['document1.pdf', 'document2.pdf']
    merge_pdfs(les chemins, sortie='merged.pdf')

Vous pouvez utiliser merge_pdfs () lorsque vous avez une liste de fichiers PDF que vous souhaitez fusionner ensemble. Vous aurez également besoin de savoir où enregistrer le résultat. Cette fonction prend donc une liste de chemins d'entrée et un chemin de sortie.

Ensuite, vous passez en boucle sur les entrées et créez un objet lecteur PDF pour chacune d’elles. Ensuite, vous parcourrez toutes les pages du fichier PDF et utiliserez .ajouter une page() d'ajouter chacune de ces pages à elle-même.

Une fois que vous avez fini d'itérer toutes les pages de tous les PDF de votre liste, vous écrivez le résultat à la fin.

Un élément que je voudrais souligner est que vous pouvez améliorer un peu ce script en ajoutant une série de pages à ajouter si vous ne voulez pas fusionner toutes les pages de chaque fichier PDF. Si vous souhaitez un défi, vous pouvez également créer une interface de ligne de commande pour cette fonction à l’aide de Python. argparse module.

Voyons comment faire le contraire de la fusion!

Comment diviser des PDF

Il arrive que vous ayez un PDF que vous devez diviser en plusieurs PDF. Cela est particulièrement vrai pour les PDF contenant beaucoup de contenu numérisé, mais il existe une multitude de bonnes raisons de vouloir scinder un PDF.

Voici comment vous pouvez utiliser PyPDF2 diviser votre PDF en plusieurs fichiers:

# pdf_splitting.py

de PyPDF2 importation PdfFileReader, PdfFileWriter

def Divisé(chemin, name_of_split):
    pdf = PdfFileReader(chemin)
    pour page dans intervalle(pdf.getNumPages()):
        pdf_writer = PdfFileWriter()
        pdf_writer.ajouter une page(pdf.getPage(page))

        sortie = F'name_of_split page.pdf '
        avec ouvrir(sortie, 'wb') comme output_pdf:
            pdf_writer.écrire(output_pdf)

si __prénom__ == '__principale__':
    chemin = 'Jupyter_Notebook_An_Introduction.pdf'
    Divisé(chemin, 'jupyter_page')

Dans cet exemple, vous créez à nouveau un objet lecteur PDF et passez en boucle sur ses pages. Pour chaque page du fichier PDF, vous allez créer une nouvelle instance de graveur PDF et y ajouter une seule page. Ensuite, vous écrirez cette page dans un fichier portant un nom unique. Une fois l'exécution du script terminée, chaque page du fichier PDF d'origine doit être fractionnée en fichiers PDF distincts.

Voyons maintenant comment ajouter un filigrane à votre fichier PDF.

Comment ajouter des filigranes

Les filigranes identifient des images ou des motifs sur des documents imprimés et numériques. Certains filigranes ne peuvent être vus que dans des conditions d'éclairage particulières. La raison pour laquelle le filigranage est important est qu'il vous permet de protéger votre propriété intellectuelle, telle que vos images ou vos PDF. Un autre terme pour le filigrane est superposition.

Vous pouvez utiliser Python et PyPDF2 mettre en filigrane vos documents. Vous devez disposer d'un fichier PDF contenant uniquement votre image ou texte en filigrane.

Apprenons à ajouter un filigrane maintenant:

# pdf_watermarker.py

de PyPDF2 importation PdfFileWriter, PdfFileReader

def create_watermark(input_pdf, sortie, filigrane):
    watermark_obj = PdfFileReader(filigrane)
    watermark_page = watermark_obj.getPage(0)

    lecteur PDF = PdfFileReader(input_pdf)
    pdf_writer = PdfFileWriter()

    # Filigrane toutes les pages
    pour page dans intervalle(lecteur PDF.getNumPages()):
        page = lecteur PDF.getPage(page)
        page.mergePage(watermark_page)
        pdf_writer.ajouter une page(page)

    avec ouvrir(sortie, 'wb') comme en dehors:
        pdf_writer.écrire(en dehors)

si __prénom__ == '__principale__':
    create_watermark(
        input_pdf='Jupyter_Notebook_An_Introduction.pdf', 
        sortie='watermarked_notebook.pdf',
        filigrane='filigrane.pdf')

create_watermark () accepte trois arguments:

  1. input_pdf: le chemin du fichier PDF à filigraner
  2. sortie: le chemin que vous souhaitez enregistrer la version en filigrane du PDF
  3. filigrane: un PDF contenant votre image ou texte en filigrane

Dans le code, ouvrez le fichier PDF en filigrane et récupérez uniquement la première page du document, car c’est là que votre filigrane doit résider. Ensuite, vous créez un objet lecteur PDF à l’aide de la commande input_pdf et un générique pdf_writer objet pour écrire le PDF en filigrane.

La prochaine étape consiste à parcourir les pages du input_pdf. C'est là que se passe la magie. Vous aurez besoin d'appeler .mergePage () et passez le watermark_page. Lorsque vous faites cela, il superposera la watermark_page en haut de la page actuelle. Ensuite, vous ajoutez cette page nouvellement fusionnée à votre pdf_writer objet.

Enfin, vous écrivez sur un disque le fichier PDF nouvellement tatoué, et vous avez terminé!

Le dernier sujet que vous apprendrez est comment PyPDF2 gère le cryptage.

Comment chiffrer un PDF

PyPDF2 ne prend actuellement en charge que l’ajout d’un mot de passe utilisateur et d’un mot de passe propriétaire à un fichier PDF préexistant. En format PDF, un mot de passe de propriétaire vous donnera essentiellement des privilèges d'administrateur sur le PDF et vous permettra de définir des autorisations sur le document. D'autre part, le mot de passe de l'utilisateur vous permet simplement d'ouvrir le document.

Autant que je sache, PyPDF2 ne vous autorise pas réellement à définir des autorisations sur le document, même s'il vous permet de définir le mot de passe du propriétaire.

Quoi qu'il en soit, voici comment vous pouvez ajouter un mot de passe, qui chiffrera également le PDF de manière inhérente:

# pdf_encrypt.py

de PyPDF2 importation PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, mot de passe):
    pdf_writer = PdfFileWriter()
    lecteur PDF = PdfFileReader(input_pdf)

    pour page dans intervalle(lecteur PDF.getNumPages()):
        pdf_writer.ajouter une page(lecteur PDF.getPage(page))

    pdf_writer.Crypter(utilisateur_pwd=mot de passe, propriétaire_pwd=Aucun, 
                       use_128bit=Vrai)

    avec ouvrir(output_pdf, 'wb') comme fh:
        pdf_writer.écrire(fh)

si __prénom__ == '__principale__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   mot de passe='deux Poisson')

add_encryption () prend en compte les chemins d'accès PDF d'entrée et de sortie, ainsi que le mot de passe que vous souhaitez ajouter au fichier PDF. Il ouvre ensuite un graveur PDF et un objet lecteur, comme auparavant. Comme vous souhaitez chiffrer l'intégralité du fichier PDF d'entrée, vous devez parcourir toutes ses pages et les ajouter à l'auteur.

La dernière étape consiste à appeler .Crypter(), qui prend le mot de passe de l'utilisateur, le mot de passe du propriétaire, et si un cryptage 128 bits doit ou non être ajouté. Par défaut, le cryptage 128 bits doit être activé. Si vous le définissez à Faux, le cryptage 40 bits sera appliqué à la place.

Conclusion

le PyPDF2 le paquet est très utile et est généralement assez rapide. Vous pouvez utiliser PyPDF2 pour automatiser les gros travaux et tirer parti de ses capacités pour vous aider à mieux faire votre travail!

Dans ce tutoriel, vous avez appris à:

  • Extraire les métadonnées d'un PDF
  • Faire pivoter les pages
  • Fusionner et diviser des PDF
  • Ajouter des filigranes
  • Ajouter le cryptage

Gardez également un œil sur le plus récent PyPDF4 paquet car il va probablement remplacer PyPDF2 bientôt. Vous pouvez également vouloir vérifier pdfrw, qui peut faire beaucoup des mêmes choses que PyPDF2 peut faire.

Lectures complémentaires

Si vous souhaitez en savoir plus sur l'utilisation de fichiers PDF en Python, consultez certaines des ressources suivantes pour plus d'informations: