fbpx

Mehrere PDF Dateien mit Passwort schützen

Inhalt
    Add a header to begin generating the table of contents

    Kennst du das?
    Du hast dein Hirn von links nach rechts gedreht und die schönsten Auswertungen und Zusammenstellungen für den Kunden erstellt. Die PDFs sind fertig, schön aufgeteilt nach Inhalt.
    Jetzt musst du nur noch alles in eine E-Mail packen und der Kunde ist glücklich.

    Aber halt!
    Sicherheit muss sein. Also werden die PDFs vorher noch schön mit einem Passwort versehen!

    Du weißt nicht, was du mit den Dateien machen sollst?
    Hier findest du Hilfe.

    Hier findest du auch ein Video zum Artikel:

    Wie kann ich eine PDF mit einem Passwort schützen?

    • PDF Datei mit Adobe Acrobat DC öffnen
    • Über das Menü den Kennwortschutz auswählen
    • Datei – Mit Kennwort schützen
    • Werkzeuge – Schützen – Mit Kennwort schützen
    • Auswahl für den Passwortschutz bei Öffnen der Datei
    • Passwort eingeben
    • Passwort wiederholen
    • Anwenden

    Puh…
    Das sind ganz schön viele Schritte.
    Und dazu sind es noch zehn Dateien die du dem Kunden schicken musst.
    Jede einzelne Datei öffnen und die Schritte abarbeiten? Eigentlich wolltest du doch endlich Feierabend machen und nach Hause fahren!

    Na ja, was soll man machen. Augen zu und durch heißt es immer, oder?
    Also nochmal eine Stunde das Hirn ausschalten und stumpf eine PDF nach der Anderen durchklicken. Nur nicht zu sehr abschalten! Nicht, dass noch irgendwo was schiefläuft.

    Das ist frustrierend.
    Dafür bist du dir eigentlich zu schade.
    Geht das nicht besser? Schneller?

    Wie kann ich mehrere PDFs mit einem Passwort schützen?

    Adobe bietet hier keine schöne Möglichkeit.
    Aber Python!
    Mit einem kleinen Skript lässt sich zum Beispiel direkt ein ganzes Verzeichnis voller PDFs mit Passwort versehen. Innerhalb weniger Sekunden!
    Und einmal geschrieben kannst du das Skript wieder und wieder und wieder verwenden.
    Keine ermüdende, langweilige und zähe Klickerei mehr.

    • Verzeichnis angeben
    • Passwort angeben
    • Starten

    Das war’s auch schon! Mehr musst du in Zukunft nicht mehr machen!
    Interessiert?
    Dann lass uns das doch gleich mal zusammenschreiben.

    Um das Passwort an die Datei setzen zu können musst du im Grunde die selben Schritte durchführen, die auch der Adobe Acrobat Reader von dir verlangt.
    Der große Vorteil ist nur, dass Python dir die Arbeit abnimmt. Und die Arbeit natürlich auch viel schneller erledigt als du selbst 😉

    Schritt 1: PDF Datei öffnen

    Es gibt viele verschiedene Bibliotheken, die dir dabei helfen mit Python eine PDF Datei zu öffnen. Ich finde pikepdf für den Job sehr angenehm.

    Also erstmal pikepdf installieren – falls nicht schon passiert.

    %pip install pikepdf

    Du bekommst mit pikepdf die Klasse Pdf an die Hand. Mit der kannst du deine PDF Datei dann öffnen:

    from pikepdf import Pdf
    
    pdf_datei = Pdf.open('/content/drive/MyDrive/posts/dateien/pdf/unprotected/unprotected_1.pdf')
    print(pdf_datei)
    pdf_datei.close()

    Damit siehst du in der Ausgabe eine Dateireferenz zu deinem Pfad, bzw. zu deiner PDF Datei.

    Aber wie kann jetzt das Passwort gesetzt werden?
    Genau genommen speicherst du die geöffnete PDF einfach mit einem Passwort wieder ab.

    Schritt 2: PDF mit Passwort speichern

    from pikepdf import Pdf, Encryption
    
    password = '12345'
    pdf_datei = Pdf.open('/content/drive/MyDrive/posts/dateien/pdf/unprotected/unprotected_1.pdf')
    pdf_datei.save('/content/drive/MyDrive/posts/dateien/pdf/protected/unprotected_1.pdf', encryption=Encryption(owner=password, user=password))
    pdf_datei.close()

    Ich hoffe, du änderst das Passwort für deine Einsätze dann entsprechend 😉

    Wie schon gesagt wird eigentlich nur die PDF geöffnet und mit einem Passwort neu abgespeichert.

    Dafür liefert das PDF Objekt die Funktion save().
    Im Minimum braucht save() einen Pfad, wohin abgespeichert werden soll.

    Das gibt dir natürlich auch die Möglichkeit, dass du die Ursprungsdatei nicht verändern musst!

    Noch besser! Falls also irgendwas schiefgehen sollte, hast du weiterhin das Original und es ist nichts verloren. Die Funktion machen wir uns direkt zu Nutzen.
    Einfach zur Sicherheit.
    Gibt ein besseres Gefühl, oder?

    Da du jetzt ein Passwort dran setzen willst, brauchst du noch das Attribut encryption.
    Das erwartet ein Objekt Encryption und das wiederum bekommst du von pikepdf.
    Also gleich mal zum import zufügen, um es nicht zu vergessen.

    Das Encryption Objekt kennt mehrere Attribute. Wichtig für dich sind hier aber nur owner und user.

    Mit owner kannst das Passwort festsetzen, dass ein owner, also ein Besitzer der Datei benötigt um die Datei verändern zu können.

    Im Gegenzug kannst du mit user das Passwort setzen, dass ein user, also ein Benutzer für seine Berechtigungen braucht.

    Das sind einfach zwei unterschiedliche Berechtigungsebenen bei PDFs.
    Da uns hier der Unterschied nicht interessiert wird einfach beides mit der Variablen passwort belegt.

    Datei schließen nicht vergessen und das wars.
    Schon hast du eine PDF mit einem Passwort geschützt!
    Gratulation 🙂

    Schritt 3: Pfad dynamisch gestalten

    Wenn du mehrere PDF Dateien in einem Rutsch mit einem Passwort belegen willst, musst du natürlich irgendwie einen Ort angeben, woher die PDF Dateien genommen werden.

    Alternativ müsstest du wieder jede Datei einzeln angeben. Das ist ja nicht Sinn der Sache.

    Auch wieder um es einfach und übersichtlich zu halten erstellst du erstmal eine neue Variable für den Pfad.

    Damit du nach der Umwandlung auch weißt welche Dateien jetzt ein Passwort haben und welche nicht ist es natürlich sinnvoll gleich zwei Pfade anzulegen.

    Einen für die ungeschützten “Originale” und einen für die geschützten “Kopien”.

    Den Dateinamen kannst du dabei behalten, einen Anhang als Markierung dran setzen oder die Datei auch komplett umbenennen.
    Wie es dir am besten passt.

    Hier lässt du den Dateinamen jetzt einfach mal gleich und legst die geschützten Dateien in einen neuen Ordner.

    Zuletzt noch den Pfad beim Öffnen und Speichern der Datei anpassen und aus dem Basispfad und dem Dateinamen zusammen bauen und schon ist der Code ein kleines Stück dynamischer.

    from pikepdf import Pdf, Encryption
    
    password = '12345'
    path_unprotected = '/content/drive/MyDrive/posts/dateien/pdf/unprotected/'
    path_protected = '/content/drive/MyDrive/posts/dateien/pdf/protected/'
    
    pdf_datei = Pdf.open(path_unprotected + 'unprotected_1.pdf')
    pdf_datei.save(path_protected + 'unprotected_1.pdf', encryption=Encryption(owner=password, user=password))
    pdf_datei.close()

    Schritt 4: Alle Dateien aus einem Verzeichnis lesen

    Jetzt hast du das Verzeichnis angegeben in dem alle deine PDF Dateien liegen, die du schützen willst.

    Das musst der Code jetzt natürlich berücksichtigen und alle PDF Dateien verarbeiten.

    Um alle Dateien auszulesen, nimmst du dir das os Modul zur Hand.

    Wie du Dateien aus einem einzelnen Verzeichnis einsammeln kannst habe ich in dem Artikel genauer beschrieben.
    Willst du gleich ganze Hierarchien auslesen kannst du dir den Artikel hier in Ruhe durchlesen.

    Ansonsten ist das “führe eine Aktion für jedes Element” aus natürlich immer eine for-Schleife.

    from pikepdf import Pdf, Encryption
    import os
    
    password = '12345'
    path_unprotected = '/content/drive/MyDrive/posts/dateien/pdf/unprotected/'
    path_protected = '/content/drive/MyDrive/posts/dateien/pdf/protected/'
    
    for pdf in os.listdir(path_unprotected):
        pdf_datei = Pdf.open(path_unprotected + pdf)
        pdf_datei.save(path_protected + pdf, encryption=Encryption(owner=password, user=password))
        pdf_datei.close()

    In der Schleife setzt du den Dateinamen wieder mit dem Pfad zusammen, damit pikepdf die Datei auch finden kann.
    Gleiches gilt fürs Speichern.

    Das war’s.
    Dein Tool ist fertig.

    Aber einen kleinen Bonus habe ich noch für dich 😉

    Bonus: Wiederverwendbarkeit

    Damit dein Code auch wiederverwendbar ist, solltest du ihn in eine Funktion legen.
    Damit muss er später nur noch aufgerufen werden und du kannst mehrere Sachen in einer Datei zusammen stellen.

    from pikepdf import Pdf, Encryption
    import os
    
    password = '12345'
    path_unprotected = '/content/drive/MyDrive/posts/dateien/pdf/unprotected/'
    path_protected = '/content/drive/MyDrive/posts/dateien/pdf/protected/'
    
    def add_protection():
        for pdf in os.listdir(path_unprotected):
            pdf_datei = Pdf.open(path_unprotected + pdf)
            pdf_datei.save(path_protected + pdf, encryption=Encryption(owner=password, user=password))
            pdf_datei.close()
    
    add_protection()

    Wie du siehst, ist es auch gar nicht schwer.
    Einfach mit def eine neue Funktion einleiten.
    Dahinter ein Name den du frei wählen kannst. Achte nur darauf, dass der Name auch beschreibt, was wirklich drin passiert. Sonst verwirrst du dich nur später.

    Und um den Code jetzt auszuführen, rufst du ganz unten die Funktion mit ihrem Namen und den Funktionsklammern auf.

    Bonus: PDF Dateien filtern

    Einen leg ich dir doch noch drauf: Dateien filtern.

    Ich bekomme auch regelmäßig ganze Ordner zur Verfügung gestellt, in denen dann nicht nur die Daten drin sind, die ich brauche, sondern auch noch Unterordner und andere Dateitypen mit denen ich überhaupt nichts anfangen kann.

    Natürlich könnte ich manuell durchgehen, die Ordner löschen, die Dateien sortieren und löschen und alles aufräumen.

    Aber weiss ich jetzt schon, ob ich die Daten nicht vielleicht später noch brauche?

    Und manuell sortieren ist auch doof.
    Also nehme ich das einfach in mein Programm mit auf und lasse – mal wieder – Python die Arbeit für mich erledigen.

    Dafür brauche ich zwei Dinge:
    Die Möglichkeit Dateien und Ordner zu unterscheiden (Hier habe ich einen Artikel dazu).
    Und eine einfache Bedingung.

    from pikepdf import Pdf, Encryption
    import os
    
    password = '12345'
    path_unprotected = '/content/drive/MyDrive/posts/dateien/pdf/unprotected/'
    path_protected = '/content/drive/MyDrive/posts/dateien/pdf/protected/'
    
    def add_protection():
        for pdf in os.listdir(path_unprotected):
            if os.path.isfile(path_unprotected + pdf):
                pdf_datei = Pdf.open(path_unprotected + pdf)
                pdf_datei.save(path_protected + pdf, encryption=Encryption(owner=password, user=password))
                pdf_datei.close()
    
    add_protection()

    Zuerst willst du natürlich wissen, ob du überhaupt eine Datei oder einen Ordner in der Hand hast.
    Wenn es ein Ordner ist, brauchst du gar nicht erst weiter prüfen und kannst sofort zum nächsten Eintrag weiter springen.

    Mit os.path.isfile() kannst du genau diese Prüfung machen.

    Sehr schön, jetzt weißt du also, dass es sich um eine Datei handelt.
    Aber ist es eine PDF Datei? Oder eine CSV Datei? Oder etwas ganz Anderes?

    Das prüfst du jetzt auch noch!

    from pikepdf import Pdf, Encryption
    import os
    
    password = '12345'
    path_unprotected = '/content/drive/MyDrive/posts/dateien/pdf/unprotected/'
    path_protected = '/content/drive/MyDrive/posts/dateien/pdf/protected/'
    
    def add_protection():
        for pdf in os.listdir(path_unprotected):
            if os.path.isfile(path_unprotected + pdf) and pdf.lower().endswith('.pdf'):
                pdf_datei = Pdf.open(path_unprotected + pdf)
                pdf_datei.save(path_protected + pdf, encryption=Encryption(owner=password, user=password))
                pdf_datei.close()
    
    add_protection()

    Mit and hängst du eine weitere Bedingung an deine if.

    In der Variablen pdf steckt der Dateiname. Ein Dateiname beinhaltet auch immer eine Dateiendung. Und genau die willst du ja prüfen.

    Du willst also wissen “Endet der Dateiname mit .pdf?”.
    Deshalb pdf.endswith(‘.pdf’).

    Natürlich wäre es zu einfach, wenn jeder für eine PDF Datei auch wirklich .pdf als Endung wählen würde.

    In der Praxis ist es eher: pdf, Pdf, PDF, PdF und was man sich sonst noch so vorstellen kann.

    Damit du eine einheitliche Prüfung bekommst, musst du natürlich auch Äpfel mit Äpfeln vergleichen.

    Dafür hast du das .lower().
    Damit wird jeder Buchstabe in dem übergebenen Text erstmal kleingeschrieben.
    Ausnahmslos jeder.

    Also auch ein PDF wird zu pdf.

    Und dann kannst du natürlich wieder schön und vor allem verlässlich vergleichen.

    Das wars für heute!
    Im nächsten Artikel zeige ich dir dann den Weg zurück.
    Also von geschützt zu ungeschützt.


    Ingo Janßen

    Ingo Janßen

    Lerne nicht einfach programmieren. Löse Probleme und automatisiere Aufgaben!

    Das könnte dich auch interessieren

    Nach oben scrollen
    Newsletter Popup Form

    Keine Inhalte mehr verpassen?

    Melde dich direkt für den "Code-Kompass" an und erhalte nützliche Tipps und Informationen direkt in deinen Posteingang.