So arbeiten Sie mit einem PDF in Python

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 PaketPyPDF2verwenden.

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 PaketpyPdfwurde 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:

  1. input_pdf:ist der Pfad der PDF-Datei, der mit einem Wasserzeichen versehen werden soll

  2. output:ist der Pfad, in dem Sie die mit Wasserzeichen versehene Version der PDF-Datei speichern möchten

  3. 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 PaketPyPDF4im Auge, da es wahrscheinlich baldPyPDF2ersetzen 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: