Simplifiez le déverrouillage du mot de passe PDF avec python + bat

environnement

Windows 10 (je ne connais pas Mac / Linux, donc je ne peux pas le supporter) python 3.7

table des matières

--Motivation et vue d'ensemble

Motivation et vue d'ensemble

En raison de l'influence du virus corona, je pense que de nombreux cours en ligne ont lieu dans les universités. Je pense que la plupart des matériels de cours à cet effet sont distribués en utilisant les services du campus, mais il y a des enseignants qui peuvent parfois leur mettre un mot de passe. Ce n'est pas bon de le redistribuer, et vous voulez probablement refuser la navigation par des non-étudiants, mais pour cela, il est assez ennuyeux de saisir le mot de passe à chaque fois que vous ouvrez ***. *** *** Alors créons un PDF avec le mot de passe déverrouillé. Si vous recherchez "PDF password release", etc., vous trouverez diverses choses, mais cette fois, vous pouvez libérer le PDF simplement en faisant un glisser-déposer ***. C'est pourquoi nous suivons un processus en deux étapes.

-Lien fichier bat et fichier python --Déverrouillez le mot de passe PDF (s'il est connu)

Cela peut être réalisé avec python seul, mais je pense que bat est nécessaire pour déverrouiller le mot de passe simplement par glisser-déposer. Utilisons donc python pour déverrouiller le mot de passe PDF.

Structure du répertoire et contenu des fichiers

Tout d'abord, la structure du répertoire et le contenu du fichier implémenté sont affichés. Interprétez le dossier de classe comme le dossier dans lequel les matériaux de classe sont placés.

root/  ├ main.py  └ decoder.bat

class/  ├ password.txt  └ target.pdf

main.py


import sys, pathlib

from pikepdf import Pdf


def get_password(folder):
    passfile = None

    found : bool = False
    #Tout d'abord, recherchez dans le même dossier
    for f in folder.glob("*"):
        if "password" == f.stem:
            passfile = f
            found = True

    #S'ils ne sont pas au même niveau, recherchez un autre niveau au-dessus
    if not found:
        folder = folder.parent
        for f in folder.glob("*"):
            if "password" == f.stem:
                passfile = f

    #S'il n'y a pas de fichier de mots de passe dans la hiérarchie immédiatement supérieure
    if not found:
        return None
    
    #Extraire le mot de passe du fichier
    with open(passfile, mode="r", encoding="utf-8") as f:
        password = f.read()

    return password

def main():
    #Au départ de la chauve-souris
    try:
        path = sys.argv[1]
    #Lors du déplacement du fichier py seul
    except:
        print("input target path")
        path = input()

    path = pathlib.Path(path)
    #Rejeter un fichier autre que PDF
    if path.suffix != ".pdf":
        print("Only PDF file accept.")
        sys.exit()
    
    password = get_password(folder=path.parent)
    #Si le fichier de mots de passe n'existe pas
    if password == None:
        print("No password file. input password = ", end="")
        password = input()
    try:
        pdf = Pdf.open(path, password=password)
    except:     #Si le mot de passe est incorrect
        print("failed to open PDF. check password.")
        sys.exit()

    pdf_unlock = Pdf.new()
    pdf_unlock.pages.extend(pdf.pages)
    #Enregistrer au même niveau que le PDF d'origine
    newname = f"{path.parent / path.stem}-unlocked.pdf"
    pdf_unlock.save(newname)


if __name__ == '__main__':
    main()

decoder.bat


@echo off
Réécrire la partie de classe rem avec le chemin complet du dossier de classe
cd "class"
"main.py" %*

Paquets dépendants

Vous pouvez piper. Facile.

pip install pikepdf

Utilisez une bibliothèque appelée pikepdf pour déverrouiller le mot de passe PDF. Existe par référence [1]. Un exemple de programme est également disponible ici, veuillez donc vous y référer.

Commentaire

À propos de la coopération entre le fichier bat et python

Si vous faites glisser et déposez un fichier tel qu'un fichier image dans le fichier bat pour l'ouvrir, à l'invite de commande

C:\Users\user> decoder.bat (Chemin complet du fichier)

On dirait. Cet argument peut être reçu en tant que% * dans le fichier bat. (En fait,% 0 est meilleur ...) (Reportez-vous à la référence [2] pour plus de détails)

Passez cet argument tel quel à python. En python, vous pouvez recevoir des arguments de ligne de commande en tant que sys. La référence [3] décrit le minimum. Ainsi, sys.argv [1] contient l'argument (chemin du fichier) passé du fichier bat cette fois.

Déverrouillez le mot de passe PDF

Les étapes de base sont les suivantes. Tous les noms de variables sont les mêmes que main.py

Ouvrir le fichier PDF avec mot de passe
pdf = Pdf.open(path, password=password)
Préparer un nouveau fichier PDF
pdf_unlock = Pdf.new()
Copiez le PDF pré-ouvert dans un nouveau PDF
pdf_unlock.pages.extend(pdf.pages)
Enregistrer le nouveau PDF
pdf_unlock.save(newname)
Le fichier PDF nouvellement enregistré n'a pas de mot de passe, cela signifie donc que vous avez atteint votre objectif.

En fait utiliser

1. Préparez votre mot de passe.
Écrivez le mot de passe de target.pdf dans password.txt dans le diagramme de la structure des répertoires. Pour le moment, veuillez noter que vous ne devez pas briser la ligne. Puisque les mots de passe donnés par la plupart des professeurs sont les mêmes à chaque fois, nous avons adopté un mécanisme pour préparer un fichier de mots de passe.
Vous pouvez saisir l'invite de commande sans la préparer, donc si le mot de passe est différent à chaque fois, saisissez-le au moment de l'exécution sans créer password.txt.

2. Créer un raccourci
C'est une bonne idée de mettre un raccourci pour decoder.bat sur votre bureau. Il semble plus pratique de pouvoir l'exécuter depuis le bureau. Il n'est pas nécessaire séparément.

3. Exécutez
Faites glisser et déposez le fichier PDF sur le raccourci créé à l'étape 2. Ensuite, l'invite de commande sera lancée (pendant un moment) et le fichier PDF déverrouillé par mot de passe sera enregistré au même emplacement que le fichier d'origine.
Si vous n'avez pas créé de fichier de mot de passe, vous serez invité à le saisir à l'invite de commande. Entrez s'il vous plait.
~~ De plus, l'interdiction de saut de ligne de password.txt peut être résolue en implémentant de sorte que seule la première ligne soit lue côté python ~~

Tips

Fonctionnement du fichier python seul

Cela fonctionne uniquement avec main.py. Dans ce cas, vous serez invité à indiquer le chemin (absolu) où se trouve le PDF. À ce stade, vous pouvez également faire glisser et déposer le fichier PDF vers l'invite de commande.

À propos de password.txt

Si vous en préparez deux comme ci-dessous, celui le plus proche du fichier PDF aura la priorité.

class/  ├ password.txt  └ 0605/    ├ password.txt    └ target.pdf

Si vous êtes un enseignant qui change le mot de passe en fonction du jour, vous pouvez créer password.txt dans le dossier pour chaque jour.

Remarques

  • Libérer le mot de passe Ne jamais redistribuer les fichiers PDF aux enseignants sans autorisation ――Ne communiquez votre mot de passe à personne.

Postscript

Cela ne semble pas fonctionner si le mot de passe contient des caractères pleine largeur.

Résumé

――Python est pratique! !! !! ――Je suis content si tu l'aimes

Les références

[1] [Python] Débloquons le mot de passe du fichier pdf! [2] Passer des arguments lors de l'exécution du fichier batch [3] Python: Que sont les arguments de ligne de commande?

Recommended Posts

Simplifiez le déverrouillage du mot de passe PDF avec python + bat
Intégrez des fichiers PDF avec Python
Gestion des mots de passe avec python: trousseau de clés
[Python] Générer un mot de passe avec Slackbot
Générer un mot de passe pour le manuel avec python
FizzBuzz en Python3
Grattage avec Python
Résumé de la comparaison des bibliothèques pour générer des PDF avec Python
Convertir un PDF en image (JPEG / PNG) avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
[Automation] Extraire le tableau en PDF avec Python
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
Expérimentez avec les règles de mot de passe NIST 800-63B en Python
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Mettez un mot de passe sur le PDF
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Convertissez l'image au format .zip en PDF avec Python
Communication série avec Python
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Communication de socket avec Python
Analyse de données avec python 2
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Exécutez Python avec VBA
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
Communication série avec python
Sortie PDF avec Django
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Exécutez prepDE.py avec python3
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
Pixelliser un PDF avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Publier des tweets avec python
Conduisez WebDriver avec python
Utiliser mecab avec Python 3
[Python] Redirection avec CGIHTTPServer
Analyse vocale par python
Pensez à yaml avec python
Utiliser Kinesis avec Python