Python Office Automation - Utilisation de base de la bibliothèque PyPDF2

Bonjour à tous, je suis Xiao Zhang ~, l'article d'aujourd'hui est lié au bureau automatisé Actuellement, je pense personnellement qu'il existe trois bibliothèques Python qui gèrent relativement bien les PDF, à savoir PyPDF2, Pdfplumer et PDFminer;

image-20210313210858337

Le contenu du didacticiel d'aujourd'hui se concentre principalement sur PyPDF2, avec l'aide de celui-ci pour réaliser les opérations de base suivantes sur PDF

  • 1. Divisez un seul PDF en plusieurs fichiers PDF;
  • 2. Combinez plusieurs PDF en un seul fichier PDF;
  • 3. Faites pivoter une page dans le PDF;
  • 4. Ajoutez un filigrane au PDF;
  • 5. Crypter le PDF;
  • 6. Décryptez le PDF;
  • 6. Obtenez des informations de base sur le PDF, telles que l'auteur, le titre, le nombre de pages, etc.

Histoire PyPDF2

Avant que le texte ne commence, parlons de l'historique de développement de PyPDF2. Le prédécesseur de PyPDF était le package pyPDf, qui a été publié en 2005. La dernière version du package a été publiée en 2010. Après environ un an, une société nommée Phasit a sponsorisé une branche de PyPdf. Plus tard nommé PyPDF2, les fonctions des deux versions sont fondamentalement les mêmes, la plus grande différence est que PyPDF2 a ajouté le support des fonctionnalités de Python3;

PyPDF2 n'a pas été mis à jour récemment. La dernière version a été publiée en 2016, mais la popularité de son utilisation n'a pas diminué. Bien que différentes versions telles que PyPDF3 et PyPDF4 soient apparues plus tard, ces packages ne sont pas entièrement rétrocompatibles avec les fonctions PyPDF2. Le niveau de bienvenue est certainement pas aussi bon que PyPDF2

Installation de PyPDF2

Comme les autres bibliothèques Python, l'installation peut être effectuée via les outils pip ou conda

pip install pypdf2

Extraction d'informations PDF

Utilisez PyPDF2 pour extraire des métadonnées et des informations textuelles à partir de PDF, et avoir une compréhension générale du PDF

Les données qui peuvent être extraites avec PyPDF2 sont les suivantes

  • Auteur
  • créateur;
  • fabricant;
  • Matière;
  • Titre;
  • Nombre de pages;

Ici, j'ai téléchargé l'exemple PDF "Seige_of_Vicksburg_Sample_OCR" fourni par le site officiel, un total de six pages, comme données de test

image-20210313230206113

from  PyPDF2 import PdfFileReader


# # pdf 文档
pdf_path = "D:/Data/自动化办公/PDF/Seige_of_Vicksburg_Sample_OCR.pdf"

with open(pdf_path,'rb') as f:
    pdf = PdfFileReader(f)
    infomation = pdf.getDocumentInfo()
    number_of_pages = pdf.getNumPages()

    txt = f'''{pdf_path} information:
    Author : {infomation.author},
    Creator : {infomation.creator},
    Producer : {infomation.producer},
    Subject : {infomation.subject},
    Title : {infomation.title},
    Number of pages : {number_of_pages}
    '''
    print(txt)

Ce qui suit est le résultat d'impression

D:/Data/自动化办公/PDF/Seige_of_Vicksburg_Sample_OCR.pdf information:
    Author : DSI,
    Creator : LuraDocument PDF Compressor Server 5.5.46.38,
    Producer : LuraDocument PDF v2.38,
    Subject : None,
    Title : Binder1.pdf,
    Number of pages : 6

Dans l'exemple ci-dessus, la classe PdfFileReader est utilisée pour interagir avec les fichiers pdf; l'appel de la méthode getDocumentInfo () dans cette classe retourne une instance de DocumentInformation, qui stocke les informations dont nous avons besoin; l'appel de la méthode getNumPages sur l'objet lecteur peut également renvoyer Document pages;

Vues personnelles, et il y a aussi les pages de données d' un peu de valeur, lorsque l'essentiel de la méthode statistique est applicable

Rotation des pages PDF

Chaque page de pdf dans PyPDF2 existe en tant qu'objet de page, et une instance d'une page peut être renvoyée via la méthode get_Page (page_index) dans l'objet lecteur, où page_index représente l'index

Il existe deux façons de faire pivoter une page

  • Rotation dans le sens des aiguilles d'une montre (90), rotation de 90 degrés dans le sens des aiguilles d'une montre;
  • rotateCounterClockwise (90), tourner de 90 degrés dans le sens antihoraire;

Le code suivant signifie que la première page du PDF cible pivote de 90 degrés dans le sens des aiguilles d'une montre, la deuxième page de 90 degrés dans le sens inverse des aiguilles d'une montre et que la position et l'angle des autres pages restent inchangés;

from  PyPDF2 import PdfFileReader,PdfFileWriter

pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(pdf_path)
# Rotate page 90 degrees to the right
page_1 = pdf_reader.getPage(0).rotateClockwise(90)
pdf_writer.addPage(page_1)
# Rotate page 90 degrees to the left
page_2 = pdf_reader.getPage(1).rotateCounterClockwise(90)
pdf_writer.addPage(page_2)
# 之后的正常写出
for i in range(2,pdf_reader.getNumPages()):
    pdf_writer.addPage(pdf_reader.getPage(i))

with open(pdf_path, 'wb') as fh:
     pdf_writer.write(fh)

Le résultat est le suivant

image-20210313232532349

PdfFileReader,PdfFileWriterCes deux classes sont utilisées dans le code. La rotation de page ne fonctionne pas sur la base du PDF d'origine, mais crée un nouvel objet de flux PDF dans la mémoire et y ajoute chaque page après l'opération via la méthode addPage () Objet, puis écrivez l'objet en mémoire dans le fichier;

Je vous écris, en fait, pour dire la vérité, rotation des pages, cette fonction n'est pas fondamentalement un rôle ici juste en essayant d'agir comme certains des mots, ha ha ha

Divisez un seul PDF en plusieurs PDF

from  PyPDF2 import PdfFileReader,PdfFileWriter

# # pdf 文档
pdf_path = "D:/Data/自动化办公/PDF/Seige_of_Vicksburg_Sample_OCR.pdf"
save_path = 'D:/Data/自动化办公/PDF/'

# Split Pages of PDF

pdf_reader = PdfFileReader(pdf_path)
for i in range(0,pdf_reader.getNumPages()):
    pdf_writer = PdfFileWriter()
    pdf_writer.addPage(pdf_reader.getPage(i))
    # Every page write to a path
    with open(save_path+'{}.pdf'.format(str(i)), 'wb') as fh:
         pdf_writer.write(fh)
    print('{} Save Sucessfully !\n'.format(str(i)))

Le code divise chaque page du fichier PDF d'origine en chaque fichier PDF, où le nom du fichier est nommé par l'index de la page;

image-20210313235957539

Il peut également être extrait dans une plage de numéros de page fixe dans le fichier pdf en le fractionnant. Par exemple, je souhaite uniquement extraire les pages 2 à 5 du pdf et pas d'autres parties, le code sera donc écrit sous la forme suivante

pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(pdf_path)
for i in range(1,5):
    # pdf_writer = PdfFileWriter()
    pdf_writer.addPage(pdf_reader.getPage(i))
    # Every page write to a path
with open(save_path+'2_5.pdf', 'wb') as fh:
        pdf_writer.write(fh)

Combinez plusieurs fichiers PDF en un seul

Bien que les directions de division et de fusion de pdf soient opposées, les classes et les principes utilisés sont les mêmes

PdfFileReaderLisez chaque pdf et obtenez l'objet de page de chaque page de manière récursive, PdfFileWritecréez un nouvel objet de flux, écrivez les objets de page lus dans la mémoire précédente dans cet objet de flux dans l'ordre, et enfin écrivez dans le fichier disque

from  PyPDF2 import PdfFileReader,PdfFileWriter

p1_pdf = "D:/Data/自动化办公/PDF/Seige_of_Vicksburg_Sample_OCR.pdf"
p2_pdf = "D:/Data/自动化办公/PDF/Seige_of_Vicksburg_Sample_OCR.pdf"


merge_pdf = 'D:/Data/自动化办公/PDF/merge.pdf'

p1_reader = PdfFileReader(p1_pdf)
p2_reader = PdfFileReader(p2_pdf)

merge = PdfFileWriter()
# Write p1
for i in range(0,p1_reader.getNumPages()):
    merge.addPage(p1_reader.getPage(i))
# Write p2
for j in range(0,p2_reader.getNumPages()):
    merge.addPage(p2_reader.getPage(j))

# Write out
with open(merge_pdf,'wb') as f:
    merge.write(f)

Les résultats sont les suivants

image-20210314002536754

PDF ajouter un filigrane

Parmi les fonctions répertoriées aujourd'hui, je pense que cette fonction est la plus utile. L'ajout de filigranes par lots utilise principalement la méthode margePage () dans l'objet de page. L'effet de l'ajout de filigranes est obtenu en fusionnant deux pages.

Parce que PyPDF2 ne peut manipuler que des objets PDF, avant d'ajouter un filigrane, vous devez stocker le filigrane à ajouter dans un fichier pdf

from  PyPDF2 import PdfFileReader,PdfFileWriter
watermark = 'D:/Data/自动化办公/PDF/watermark.pdf'
input_pdf = 'D:/Data/自动化办公/PDF/merge.pdf'
output = 'D:/Data/自动化办公/PDF/merge_watermark.pdf'


watermark_obj = PdfFileReader(watermark)
watermark_page = watermark_obj.getPage(0)

pdf_reader = PdfFileReader(input_pdf)
pdf_writer = PdfFileWriter()

# Watermark all the pages
for page in range(pdf_reader.getNumPages()):
    page = pdf_reader.getPage(page)
    page.mergePage(watermark_page)
    pdf_writer.addPage(page)

with open(output, 'wb') as out:
    pdf_writer.write(out)

L'effet est le suivant, de gauche à droite, l'image d'origine, le filigrane et l'image d'origine après l'ajout du filigrane en séquence [Le transfert d'image du lien externe a échoué, le site source peut avoir un mécanisme de lien anti-sangsue, il est recommandé pour enregistrer l'image et la télécharger directement (img-XP0ELXsk-1615825692823) (https://images.zeroingpython.top/img/image-20210314005417135.png)]

L'effet ci-dessus n'est pas bon car le problème de mise en page n'a pas été pris en compte lors de la création du filigrane, il en manquait donc une partie lors de la fusion;

L'avantage d'utiliser le code ci-dessus pour ajouter un filigrane est que vous pouvez spécifier le filigrane du champ de page pour le pdf, par exemple, n'ajouter que des pages paires aux pages impaires, ce qui est non seulement flexible et efficace, mais de Bien sûr, vous pouvez également effectuer des opérations par lots sur plusieurs fichiers

Cryptage et décryptage PDF

cryptage pdf

Pour un fichier pdf, si nous ne voulons pas que les autres puissent lire le contenu, nous pouvons définir un mot de passe pour celui-ci via pypdf2. S'il ne s'agit que d'un seul fichier, il est préférable de trouver un outil pour une opération manuelle et ce sera plus efficace, mais s'il s'agit de fichiers multiples, la méthode suivante est fortement recommandée

watermark = 'D:/Data/自动化办公/PDF/Seige_of_Vicksburg_Sample_OCR.pdf'
input_pdf = 'D:/Data/自动化办公/PDF/merge.pdf'
output = 'D:/Data/自动化办公/PDF/merge_watermark1.pdf'


watermark_obj = PdfFileReader(watermark)
watermark_page = watermark_obj.getPage(0)

pdf_reader = PdfFileReader(input_pdf)
pdf_writer = PdfFileWriter()

# Watermark all the pages
for page in range(pdf_reader.getNumPages()):
    page = pdf_reader.getPage(page)
    page.mergePage(watermark_page)
    pdf_writer.addPage(page)
pdf_writer.encrypt(user_pwd='123456',
                       use_128bit=True)
with open(output, 'wb') as out:
    pdf_writer.write(out)

image-20210314092935806

La fonction de cryptage est principalement utilisée, et trois paramètres doivent être pris en compte

  • user_pwd, str, mot de passe utilisateur, utilisé pour restreindre l'ouverture et la lecture des fichiers;

  • owner_pwd, str, est un niveau plus haut que le mot de passe de l'utilisateur. Lorsqu'il est fourni, le fichier peut être ouvert sans aucune restriction. S'il n'est pas spécifié, le owner_pwd par défaut est le même que user_pwd;

  • use_128bit Valeur booléenne, utilisée pour indiquer s'il faut utiliser un mot de passe de 128 bits, False signifie un mot de passe de 40 bits, la valeur par défaut est True;

décryptage pdf

Le déchiffrement est utilisé lors de la lecture du fichier et la fonction decrypt () est utilisée

rom PyPDF2 import PdfFileWriter, PdfFileReader

input_pdf='reportlab-encrypted.pdf'
output_pdf='reportlab.pdf'
password='twofish'

pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(input_pdf)
pdf_reader = pdf_reader.decrypt(password)

for page in range(pdf_reader.getNumPages()):
     pdf_writer.addPage(pdf_reader.getPage(page))

with open(output_pdf, 'wb') as fh:
      pdf_writer.write(fh)

Le principe du décryptage dans l'exemple ci-dessus est de lire un fichier crypté et de l'écrire dans un pdf non crypté

résumé

Cet article présente l'utilisation de base de la bibliothèque PyPDF2 et implémente certaines opérations de base à l'aide de celle-ci ainsi que des exemples de code; mais voici un rappel que toutes les opérations ci-dessus ne s'appliquent qu'aux scénarios d'opération par lots. Si l'objet est un seul fichier , il est recommandé d'utiliser des méthodes conventionnelles. Démontrer ses compétences ne fera que perdre du temps

Je n'ai pas couvert l'extraction et l'écriture de contenu graphique en pdf, car pypdf2 n'est pas bon à cet égard, et Pdfplumber et PDFminer sont bien meilleurs dans l'extraction de texte. Si vous voulez bien faire , vous devez d'abord affûter vos outils ; je le ferai présentez cet aspect dans les didacticiels suivants et attendez votre attention avec impatience!

Eh bien, ce qui précède est tout le contenu de cet article. Enfin, merci à tous d'avoir lu. Rendez-vous dans le prochain numéro ~

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42512684/article/details/114860216
conseillé
Classement