So arbeiten Sie mit einem PDF in Python
Das Portable Document Format oder PDF ist ein Dateiformat, mit dem Dokumente zuverlässig zwischen Betriebssystemen dargestellt und ausgetauscht werden können. Während das PDF ursprünglich von Adobe erfunden wurde, wird es jetzt von der Internationalen Organisation für Normung (ISO) inopen standard verwaltet. Sie können mit einer bereits vorhandenen PDF-Datei in Python arbeiten, indem Sie das PaketPyPDF2
verwenden.
PyPDF2
ist einpure-Python-Paket, das Sie für viele verschiedene Arten von PDF-Vorgängen verwenden können.
Am Ende dieses Artikels erfahren Sie, wie Sie Folgendes tun:
-
Extrahieren Sie Dokumentinformationen aus einem PDF in Python
-
Seiten drehen
-
PDFs zusammenführen
-
PDFs teilen
-
Wasserzeichen hinzufügen
-
Verschlüsseln Sie ein PDF
Lass uns anfangen!
Free Bonus:Click here to get access to a chapter from Python Tricks: The Book zeigt Ihnen die Best Practices von Python anhand einfacher Beispiele, die Sie sofort anwenden können, um schöneren + Pythonic-Code zu schreiben.
Verlauf vonpyPdf
,PyPDF2
undPyPDF4
Das ursprüngliche PaketpyPdf
wurde bereits 2005 veröffentlicht. Die letzte offizielle Veröffentlichung vonpyPdf
war im Jahr 2010. Nach einem Zeitraum von ungefähr einem Jahr sponserte ein Unternehmen namensPhasit eine Gabelung vonpyPdf
namensPyPDF2
. Der Code wurde so geschrieben, dass er abwärtskompatibel mit dem Original ist, und funktionierte mehrere Jahre lang recht gut. Die letzte Veröffentlichung erfolgte im Jahr 2016.
Es gab eine kurze Reihe von Releases eines Pakets mit dem NamenPyPDF3
, und dann wurde das Projekt inPyPDF4
umbenannt. Alle diese Projekte machen fast dasselbe, aber der größte Unterschied zwischenpyPdf
und PyPDF2 + besteht darin, dass die letzteren Versionen Python 3-Unterstützung hinzugefügt haben. Es gibt eine andere Python 3-Gabel als die ursprünglichenpyPdf
for Python 3, aber diese wurde seit vielen Jahren nicht mehr gewartet.
WährendPyPDF2
kürzlich aufgegeben wurde, ist das neuePyPDF4
nicht vollständig abwärtskompatibel mitPyPDF2
. Die meisten Beispiele in diesem Artikel funktionieren einwandfrei mitPyPDF4
, aber einige können dies nicht, weshalbPyPDF4
in diesem Artikel nicht stärker behandelt wird. Tauschen Sie die Importe gegenPyPDF2
gegenPyPDF4
aus und sehen Sie, wie es bei Ihnen funktioniert.
pdfrw
: Eine Alternative
Patrick Maupin hat ein Paket namenspdfrw
erstellt, das viele der gleichen Aufgaben ausführen kann wiePyPDF2
. Sie könnenpdfrw
für alle Arten von Aufgaben verwenden, die Sie in diesem Artikel fürPyPDF2
lernen werden, mit Ausnahme der Verschlüsselung.
Der größte Unterschied beipdfrw
besteht darin, dass es in das PaketReportLab integriert wird, sodass Sie eine bereits vorhandene PDF-Datei erstellen und mit ReportLab eine neue erstellen können, indem Sie einige oder alle bereits vorhandenen PDF-Dateien verwenden.
Installation
Die Installation vonPyPDF2
kann mitpip
oderconda
erfolgen, wenn Sie zufällig Anaconda anstelle von normalem Python verwenden.
So würden SiePyPDF2
mitpip
installieren:
$ pip install pypdf2
Die Installation ist recht schnell, daPyPDF2
keine Abhängigkeiten aufweist. Sie werden wahrscheinlich so viel Zeit damit verbringen, das Paket herunterzuladen, wie Sie es installieren werden.
Lassen Sie uns nun fortfahren und lernen, wie Sie einige Informationen aus einem PDF extrahieren.
So extrahieren Sie Dokumentinformationen aus einer PDF-Datei in Python
MitPyPDF2
können Sie Metadaten und Text aus einer PDF-Datei extrahieren. Dies kann hilfreich sein, wenn Sie bestimmte Arten der Automatisierung Ihrer bereits vorhandenen PDF-Dateien durchführen.
Hier sind die aktuellen Datentypen, die extrahiert werden können:
-
Autor
-
Schöpfer
-
Hersteller
-
Gegenstand
-
Titel
-
Seitenzahl
Sie müssen ein PDF suchen, um es für dieses Beispiel zu verwenden. Sie können jedes PDF verwenden, das Sie auf Ihrem Computer zur Hand haben. Um die Sache zu vereinfachen, ging ich zuLeanpub und nahm eine Probe eines meiner Bücher für diese Übung. Das Beispiel, das Sie herunterladen möchten, heißtreportlab-sample.pdf
.
Schreiben wir einen Code mit dieser PDF-Datei und erfahren, wie Sie auf diese Attribute zugreifen können:
# extract_doc_info.py
from PyPDF2 import PdfFileReader
def extract_information(pdf_path):
with open(pdf_path, 'rb') as f:
pdf = PdfFileReader(f)
information = pdf.getDocumentInfo()
number_of_pages = pdf.getNumPages()
txt = f"""
Information about {pdf_path}:
Author: {information.author}
Creator: {information.creator}
Producer: {information.producer}
Subject: {information.subject}
Title: {information.title}
Number of pages: {number_of_pages}
"""
print(txt)
return information
if __name__ == '__main__':
path = 'reportlab-sample.pdf'
extract_information(path)
Hier importieren SiePdfFileReader
aus dem PaketPyPDF2
. DasPdfFileReader
ist eine Klasse mit verschiedenen Methoden zur Interaktion mit PDF-Dateien. In diesem Beispiel rufen Sie.getDocumentInfo()
auf, wodurch eine Instanz vonDocumentInformation
zurückgegeben wird. Diese enthält die meisten Informationen, an denen Sie interessiert sind. Sie rufen auch.getNumPages()
für das Reader-Objekt auf, wodurch die Anzahl der Seiten im Dokument zurückgegeben wird.
Note: Dieser letzte Codeblock verwendet die neuen F-Strings von Python 3 für die String-Formatierung. Wenn Sie mehr erfahren möchten, können SiePython 3’s f-Strings: An Improved String Formatting Syntax (Guide) überprüfen.
Die Variableinformation
verfügt über mehrere Instanzattribute, mit denen Sie den Rest der gewünschten Metadaten aus dem Dokument abrufen können. Sie drucken diese Informationen aus und geben sie zur möglichen zukünftigen Verwendung zurück.
WährendPyPDF2
.extractText()
hat, das für seine Seitenobjekte verwendet werden kann (in diesem Beispiel nicht gezeigt), funktioniert es nicht sehr gut. Einige PDFs geben Text zurück, andere eine leere Zeichenfolge. Wenn Sie Text aus einer PDF-Datei extrahieren möchten, sollten Sie stattdessen das ProjektPDFMiner
überprüfen. PDFMiner
ist viel robuster und wurde speziell zum Extrahieren von Text aus PDFs entwickelt.
Jetzt können Sie mehr über das Drehen von PDF-Seiten erfahren.
So drehen Sie Seiten
Gelegentlich erhalten Sie PDF-Dateien mit Seiten inlandscape mode anstelle des Hochformatmodus. Oder vielleicht stehen sie sogar auf dem Kopf. Dies kann passieren, wenn jemand ein Dokument als PDF oder E-Mail scannt. Sie können das Dokument ausdrucken und die Papierversion lesen oder die Leistung von Python verwenden, um die fehlerhaften Seiten zu drehen.
In diesem Beispiel können Sie einen Real Pythonarticleauswählen und als PDF drucken.
Lassen Sie uns lernen, wie Sie einige Seiten dieses Artikels mitPyPDF2
drehen:
# rotate_pages.py
from PyPDF2 import PdfFileReader, PdfFileWriter
def rotate_pages(pdf_path):
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(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)
# Add a page in normal orientation
pdf_writer.addPage(pdf_reader.getPage(2))
with open('rotate_pages.pdf', 'wb') as fh:
pdf_writer.write(fh)
if __name__ == '__main__':
path = 'Jupyter_Notebook_An_Introduction.pdf'
rotate_pages(path)
In diesem Beispiel müssen Sie diePdfFileWriter
zusätzlich zuPdfFileReader
importieren, da Sie eine neue PDF-Datei schreiben müssen. rotate_pages()
nimmt den Pfad zu der PDF-Datei auf, die Sie ändern möchten. Innerhalb dieser Funktion müssen Sie ein Writer-Objekt erstellen, das Siepdf_writer
nennen können, und ein Reader-Objekt namenspdf_reader
.
Als nächstes können Sie.GetPage()
verwenden, um die gewünschte Seite zu erhalten. Hier greifen Sie zu Seite Null, der ersten Seite. Anschließend rufen Sie die.rotateClockwise()
-Methode des Seitenobjekts auf und übergeben sie in 90 Grad. Dann rufen Sie für Seite zwei.rotateCounterClockwise()
auf und übergeben es ebenfalls um 90 Grad.
Note: Mit dem PaketPyPDF2
können Sie eine Seite nur in Schritten von 90 Grad drehen. Andernfalls erhalten SieAssertionError
.
Nach jedem Aufruf der Rotationsmethoden rufen Sie.addPage()
auf. Dadurch wird die gedrehte Version der Seite zum Writer-Objekt hinzugefügt. Die letzte Seite, die Sie dem Writer-Objekt hinzufügen, ist Seite 3, ohne dass eine Drehung vorgenommen wurde.
Schließlich schreiben Sie das neue PDF mit.write()
. Es wird einfile-like object als Parameter verwendet. Dieses neue PDF enthält drei Seiten. Die ersten beiden werden in entgegengesetzte Richtungen gedreht und befinden sich im Querformat, während die dritte Seite eine normale Seite ist.
Lassen Sie uns nun lernen, wie Sie mehrere PDF-Dateien zu einer zusammenführen können.
So führen Sie PDFs zusammen
Es gibt viele Situationen, in denen Sie zwei oder mehr PDFs aufnehmen und zu einem einzigen PDF zusammenführen möchten. Beispielsweise verfügen Sie möglicherweise über ein Standarddeckblatt, das für viele Arten von Berichten verwendet werden muss. Sie können Python verwenden, um so etwas zu tun.
In diesem Beispiel können Sie eine PDF-Datei öffnen und eine Seite als separate PDF-Datei ausdrucken. Dann mach das nochmal, aber mit einer anderen Seite. Dadurch erhalten Sie einige Eingaben, die Sie beispielsweise verwenden können.
Lassen Sie uns einen Code schreiben, mit dem Sie PDFs zusammenführen können:
# pdf_merging.py
from PyPDF2 import PdfFileReader, PdfFileWriter
def merge_pdfs(paths, output):
pdf_writer = PdfFileWriter()
for path in paths:
pdf_reader = PdfFileReader(path)
for page in range(pdf_reader.getNumPages()):
# Add each page to the writer object
pdf_writer.addPage(pdf_reader.getPage(page))
# Write out the merged PDF
with open(output, 'wb') as out:
pdf_writer.write(out)
if __name__ == '__main__':
paths = ['document1.pdf', 'document2.pdf']
merge_pdfs(paths, output='merged.pdf')
Sie könnenmerge_pdfs()
verwenden, wenn Sie eine Liste von PDFs haben, die Sie zusammenführen möchten. Sie müssen auch wissen, wo das Ergebnis gespeichert werden soll, damit diese Funktion eine Liste von Eingabepfaden und einen Ausgabepfad verwendet.
Anschließend durchlaufen Sie die Eingaben und erstellen für jede ein PDF-Reader-Objekt. Als Nächstes durchlaufen Sie alle Seiten in der PDF-Datei und fügen mit.addPage()
jede dieser Seiten zu sich selbst hinzu.
Sobald Sie alle Seiten aller PDFs in Ihrer Liste durchlaufen haben, schreiben Sie das Ergebnis am Ende auf.
Ein Punkt, auf den ich hinweisen möchte, ist, dass Sie dieses Skript ein wenig verbessern können, indem Sie eine Reihe von Seiten hinzufügen, die hinzugefügt werden sollen, wenn Sie nicht alle Seiten jeder PDF zusammenführen möchten. Wenn Sie eine Herausforderung wünschen, können Sie auch eine Befehlszeilenschnittstelle für diese Funktion mit demargparse
-Modul von Python erstellen.
Lassen Sie uns herausfinden, wie Sie das Gegenteil von Zusammenführen tun können!
So teilen Sie PDFs
Es gibt Zeiten, in denen Sie möglicherweise ein PDF haben, das Sie in mehrere PDFs aufteilen müssen. Dies gilt insbesondere für PDF-Dateien, die viele eingescannte Inhalte enthalten. Es gibt jedoch eine Vielzahl guter Gründe, eine PDF-Datei zu teilen.
So können SiePyPDF2
verwenden, um Ihre PDF-Datei in mehrere Dateien aufzuteilen:
# pdf_splitting.py
from PyPDF2 import PdfFileReader, PdfFileWriter
def split(path, name_of_split):
pdf = PdfFileReader(path)
for page in range(pdf.getNumPages()):
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf.getPage(page))
output = f'{name_of_split}{page}.pdf'
with open(output, 'wb') as output_pdf:
pdf_writer.write(output_pdf)
if __name__ == '__main__':
path = 'Jupyter_Notebook_An_Introduction.pdf'
split(path, 'jupyter_page')
In diesem Beispiel erstellen Sie erneut ein PDF-Reader-Objekt und durchlaufen dessen Seiten. Für jede Seite in der PDF-Datei erstellen Sie eine neue PDF-Writer-Instanz und fügen eine einzelne Seite hinzu. Dann schreiben Sie diese Seite in eine eindeutig benannte Datei. Wenn das Skript ausgeführt wird, sollte jede Seite der Original-PDF in separate PDFs aufgeteilt werden.
Nehmen Sie sich jetzt einen Moment Zeit, um zu erfahren, wie Sie Ihrem PDF ein Wasserzeichen hinzufügen können.
So fügen Sie Wasserzeichen hinzu
Wasserzeichen identifizieren Bilder oder Muster auf gedruckten und digitalen Dokumenten. Einige Wasserzeichen sind nur bei besonderen Lichtverhältnissen zu sehen. Der Grund, warum Wasserzeichen wichtig sind, besteht darin, dass Sie Ihr geistiges Eigentum wie Ihre Bilder oder PDFs schützen können. Ein anderer Begriff für Wasserzeichen ist Overlay.
Sie können Python undPyPDF2
verwenden, um Ihre Dokumente mit einem Wasserzeichen zu versehen. Sie benötigen eine PDF-Datei, die nur Ihr Wasserzeichenbild oder Ihren Text enthält.
Lassen Sie uns jetzt lernen, wie Sie ein Wasserzeichen hinzufügen:
# pdf_watermarker.py
from PyPDF2 import PdfFileWriter, PdfFileReader
def create_watermark(input_pdf, output, watermark):
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)
if __name__ == '__main__':
create_watermark(
input_pdf='Jupyter_Notebook_An_Introduction.pdf',
output='watermarked_notebook.pdf',
watermark='watermark.pdf')
create_watermark()
akzeptiert drei Argumente:
-
input_pdf
:ist der Pfad der PDF-Datei, der mit einem Wasserzeichen versehen werden soll -
output
:ist der Pfad, in dem Sie die mit Wasserzeichen versehene Version der PDF-Datei speichern möchten -
watermark
:ist eine PDF-Datei, die Ihr Wasserzeichenbild oder Ihren Text enthält
Im Code öffnen Sie das PDF mit dem Wasserzeichen und greifen nur auf die erste Seite des Dokuments zu, da sich dort Ihr Wasserzeichen befinden sollte. Anschließend erstellen Sie ein PDF-Reader-Objekt mitinput_pdf
und einem generischenpdf_writer
-Objekt zum Schreiben der PDF-Datei mit Wasserzeichen.
Der nächste Schritt besteht darin, die Seiten ininput_pdf
zu durchlaufen. Hier geschieht die Magie. Sie müssen.mergePage()
aufrufen undwatermark_page
übergeben. Wenn Sie dies tun, werden diewatermark_page
oben auf der aktuellen Seite überlagert. Anschließend fügen Sie diese neu zusammengeführte Seite Ihrempdf_writer
-Objekt hinzu.
Schließlich schreiben Sie das neu mit Wasserzeichen versehene PDF auf die Festplatte und fertig!
Das letzte Thema, das Sie lernen werden, ist, wiePyPDF2
mit Verschlüsselung umgeht.
So verschlüsseln Sie ein PDF
PyPDF2
unterstützt derzeit nur das Hinzufügen eines Benutzerkennworts und eines Besitzerkennworts zu einer bereits vorhandenen PDF-Datei. In PDF Land erhalten Sie mit einem Besitzerkennwort grundsätzlich Administratorrechte für das PDF und können Berechtigungen für das Dokument festlegen. Mit dem Benutzerkennwort können Sie das Dokument jedoch nur öffnen.
Soweit ich das beurteilen kann, können Sie mitPyPDF2
keine Berechtigungen für das Dokument festlegen, obwohl Sie damit das Besitzerkennwort festlegen können.
Unabhängig davon können Sie auf diese Weise ein Kennwort hinzufügen, das auch die PDF-Datei von Natur aus verschlüsselt:
# pdf_encrypt.py
from PyPDF2 import PdfFileWriter, PdfFileReader
def add_encryption(input_pdf, output_pdf, password):
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(input_pdf)
for page in range(pdf_reader.getNumPages()):
pdf_writer.addPage(pdf_reader.getPage(page))
pdf_writer.encrypt(user_pwd=password, owner_pwd=None,
use_128bit=True)
with open(output_pdf, 'wb') as fh:
pdf_writer.write(fh)
if __name__ == '__main__':
add_encryption(input_pdf='reportlab-sample.pdf',
output_pdf='reportlab-encrypted.pdf',
password='twofish')
add_encryption()
übernimmt die Eingabe- und Ausgabe-PDF-Pfade sowie das Kennwort, das Sie der PDF hinzufügen möchten. Anschließend werden wie zuvor ein PDF-Writer und ein Reader-Objekt geöffnet. Da Sie die gesamte Eingabe-PDF-Datei verschlüsseln möchten, müssen Sie alle Seiten durchlaufen und sie dem Writer hinzufügen.
Der letzte Schritt besteht darin,.encrypt()
aufzurufen, wobei das Benutzerkennwort, das Besitzerkennwort und die Frage, ob eine 128-Bit-Verschlüsselung hinzugefügt werden soll, verwendet werden. Standardmäßig ist die 128-Bit-Verschlüsselung aktiviert. Wenn SieFalse
festlegen, wird stattdessen eine 40-Bit-Verschlüsselung angewendet.
Note: PDF-Verschlüsselung verwendet entweder RC4 oder AES (Advanced Encryption Standard), um das PDF gemäßpdflib.com zu verschlüsseln.
Nur weil Sie Ihr PDF verschlüsselt haben, bedeutet dies nicht, dass es unbedingt sicher ist. Es gibt Tools zum Entfernen von Passwörtern aus PDFs. Wenn Sie mehr erfahren möchten, hat die Carnegie Mellon University interessantepaper on the topic.
Fazit
DasPyPDF2
-Paket ist sehr nützlich und normalerweise ziemlich schnell. Sie könnenPyPDF2
verwenden, um große Aufträge zu automatisieren und seine Funktionen zu nutzen, um Ihre Arbeit besser zu erledigen!
In diesem Tutorial haben Sie Folgendes gelernt:
-
Extrahieren Sie Metadaten aus einem PDF
-
Seiten drehen
-
PDFs zusammenführen und teilen
-
Wasserzeichen hinzufügen
-
Verschlüsselung hinzufügen
Behalten Sie auch das neuere PaketPyPDF4
im Auge, da es wahrscheinlich baldPyPDF2
ersetzen wird. Möglicherweise möchten Sie auchpdfrw
auschecken, die viele der gleichen Funktionen wiePyPDF2
ausführen können.
Weitere Lektüre
Wenn Sie mehr über die Arbeit mit PDFs in Python erfahren möchten, lesen Sie einige der folgenden Ressourcen, um weitere Informationen zu erhalten: