Cifrar y descifrar archivos PDF usando Python

Cómo cifrar y descifrar archivos PDF usando Python

El acceso no autorizado a archivos confidenciales es un problema común hoy en día. Para asegurarse de que solo las personas que autorice puedan acceder al contenido de sus archivos, puede cifrarlos antes de la transmisión.

Configuración del entorno

Para seguir, debe estar familiarizado con los conceptos básicos de Python .

En un terminal Mac o interfaz de línea de comandos de Windows, ejecute el siguiente comando para instalar la biblioteca PyMuPDF: pip install PyMuPDF

Esta biblioteca lo ayudará a abrir y manipular archivos PDF.

Instalación de la biblioteca PyMuPDF en la terminal de un IDE

Cuando haya terminado de instalar PyMuPDF, estará listo para comenzar a codificar.

El código fuente completo está disponible en un repositorio de GitHub .

Importar el Módulo Fitz

Importar módulo fitz de la biblioteca PyMuPDF. Esto le permitirá llamar y utilizar las funciones que admite.

Utilizará fitz para abrir, cifrar, descifrar y guardar los archivos PDF.

Comprobar si el PDF está cifrado

Cree una función que verificará si el PDF ya está encriptado y devolverá un valor booleano.

def pdf_is_encrypted(file):

    pdf = fitz.Document(file)

    return pdf.isEncrypted

Utilizará esta función más adelante para ayudar al programa a decidir automáticamente si cifrar o descifrar el PDF de entrada.

Cifrar el PDF

Cree una función para cifrar el PDF de entrada. La función comprobará si el PDF ya está cifrado. Si no está encriptado, lo encriptará usando el algoritmo AES-256 . Este es el algoritmo de encriptación más fuerte que ofrece fitz. Finalmente guardará el PDF encriptado.

def encrypt_pdf_file(pdf, password, outfile, file):

    if not pdf_is_encrypted(file):

        perm = int(

            # Ensure everyone with the PDF

            # can access it

            fitz.PDF_PERM_ACCESSIBILITY

            | fitz.PDF_PERM_PRINT # permits printing

            | fitz.PDF_PERM_COPY # permits copying

            | fitz.PDF_PERM_ANNOTATE # permits annotations

        )

        # eEncryption algorithm

        encrypt_meth = fitz.PDF_ENCRYPT_AES_256

        pdf.save(outfile, encryption=encrypt_meth, user_pw=password,

                permissions=perm)

        if pdf.save:

            print("PDF encrypted")

Esta función guarda el PDF encriptado en la ruta del archivo que pasa en el argumento del archivo de salida.

Salida de un programa que muestra un archivo encriptado en el explorador

Descifrar el PDF cifrado

Cree una función de descifrado. Esta función primero verificará si el archivo de entrada está encriptado. Si está encriptado, le pedirá al usuario que ingrese la contraseña. A continuación, intentará abrir el PDF con la contraseña proporcionada. Si la contraseña es correcta, fitz descifrará el PDF. A continuación, guardará el contenido del PDF descifrado en otro archivo PDF desprotegido.

def decrypt_pdf(file):

    if pdf_is_encrypted(file):

        password = input('Enter pdf password : ')

        pdf = fitz.open(file)

        if pdf.authenticate(password):

            pdf.save('decrypted.pdf')

            if pdf.save:

                print("PDF decrypted")

        else:

            print('Incorrect Password')

Este código guarda el PDF desprotegido en su directorio de trabajo actual.

Ha descifrado el archivo protected.pdf y lo ha guardado como decrypted.pdf .

Control del flujo del programa

Cree una función principal que controlará el flujo de su programa. Almacenará la ruta del PDF de entrada, llamará a la función de cifrado y descifrado y pasará los parámetros de entrada.

def main():

    # replace the file path with either that of

    # the pdf to be encrypted or decrypted

    file = 'sample.pdf'

    pdf = fitz.open(file)

    password = 'pass123'

    encrypt_pdf_file(pdf, password, 'protected.pdf', file)

    decrypt_pdf(pdf)

Para cambiar el nombre del archivo PDF encriptado, reemplace "protected.pdf" con el suyo propio, asegurándose de mantener la extensión ".pdf".

Ejecutar el método principal

Asegúrese de que el método principal se ejecute primero:

if __name__ == '__main__':

    main()

Este código verifica si el script se ejecuta como el programa principal y no como un módulo importado. Si es el programa principal, llama a la función principal.

Sin usted, esta web no existiria. Gracias por visitarme, espero que le haya gustado y vuelva. Muchas gracias ☺️

Fecha actualización el 2023-02-13. Fecha publicación el 2023-02-13. Autor: Oscar olg Mapa del sitio Fuente: makeuseof