Защитить PDF‑файлы в Python

Зашифровать PDF с паролем и разрешениями

Aspose.PDF for Python показывает, как защитить PDF‑документ с помощью шифрования на основе пароля:

  1. Загрузите PDF‑документ.
  2. Создайте объект разрешений.
  3. Разрешите конкретные разрешения.
  4. Установите пароли пользователя и владельца.
  5. Выберите алгоритм шифрования.
  6. Примените шифрование к документу.
  7. Сохраните зашифрованный PDF.
import aspose.pdf as ap
import sys
from os import path

def encrypt_password(infile, outfile):
    """
    Encrypt PDF with password and permissions.

    Args:
        infile (str): Input PDF filename
        outfile (str): Output PDF filename

    Returns:
        None

    Example:
        encrypt_password("sample.pdf", "sample_protected.pdf")

    Note:
        Uses AES 128-bit encryption. Allows screen readers, forbids all other operations.
        User password: "userpassword", Owner password: "ownerpassword".
    """
    document = ap.Document(infile)
    document_privilege = ap.facades.DocumentPrivilege.forbid_all
    document_privilege.allow_screen_readers = True

    document.encrypt(
        "userpassword",
        "ownerpassword",
        document_privilege,
        ap.CryptoAlgorithm.AESx128,
        False,
    )
    document.save(outfile)

Зашифровать PDF с полными правами доступа

Зашифровать PDF‑документ, позволяя полные права доступа, с помощью Aspose.PDF for Python. В примере используется шифрование RC4 128-bit, которое обеспечивает базовую безопасность и сохраняет совместимость со старыми PDF‑просмотрщиками.

  1. Загрузите PDF‑документ.
  2. Определите пароли пользователя и владельца.
  3. Установите полные права доступа.
  4. Выберите алгоритм шифрования.
  5. Вызовите метод encrypt() с паролями, разрешениями и алгоритмом.
  6. Сохраните зашифрованный PDF.
import aspose.pdf as ap
import sys
from os import path

def encrypt_pdf_file(infile, outfile):
    """
    Encrypt PDF with full permissions.

    Args:
        infile (str): Input PDF filename
        outfile (str): Output PDF filename

    Returns:
        None

    Example:
        encrypt_pdf_file("sample.pdf", "sample_protected.pdf")

    Note:
        Uses RC4 128-bit encryption with allow_all privileges.
    """
    document = ap.Document(infile)
    document.encrypt(
        "userpassword",
        "ownerpassword",
        ap.facades.DocumentPrivilege.allow_all,
        ap.CryptoAlgorithm.RC4x128,
        False,
    )
    document.save(outfile)

Расшифровать PDF‑файл, используя пароль владельца

Чтобы удалить защиту паролем и восстановить полный доступ:

  1. Загрузите зашифрованный PDF, используя правильный пароль (‘password’ — пароль пользователя или владельца).
  2. Удалите всю защиту паролем и настройки шифрования из документа.
  3. Сохраните теперь незащищённый PDF в указанный файл вывода.
import aspose.pdf as ap
import sys
from os import path

def decrypt_pdf_file(infile, outfile):
    """
    Decrypt password-protected PDF.

    Args:
        infile (str): Input encrypted PDF filename
        outfile (str): Output decrypted PDF filename

    Returns:
        None

    Example:
        decrypt_pdf_file("sample_protected.pdf", "sample_unprotected.pdf")

    Note:
        Requires user password to open document.
    """
    document = ap.Document(infile, "userpassword")
    document.decrypt()
    document.save(outfile)

Изменение пароль PDF-файла

Обновить учетные данные безопасности (пароли пользователя и владельца) PDF‑документа, сохраняя его содержимое и структуру.

  1. Откройте PDF, используя существующий пароль владельца (‘owner’), который дает полный доступ, включая возможность изменять параметры безопасности.
  2. Замените старые пароли новым паролем пользователя (’newuser’) и новым паролем владельца (’newowner’).
  3. Сохраните PDF с обновлёнными настройками пароля.
import aspose.pdf as ap
import sys
from os import path

def change_password(infile, outfile):
    """
    Change user and owner passwords.

    Args:
        infile (str): Input PDF filename
        outfile (str): Output PDF filename

    Returns:
        None

    Example:
        change_password("sample_protected.pdf", "sample_changepassword.pdf")

    Note:
        Changes from ownerpassword to newuser/newowner.
    """
    document = ap.Document(infile, "ownerpassword")
    document.change_passwords("ownerpassword", "newuser", "newowner")
    document.save(outfile)

Определить правильный пароль из массива

В некоторых сценариях вам может потребоваться определить правильный пароль из списка потенциальных вариантов, чтобы получить доступ к защищённому PDF. Приведённый ниже фрагмент кода демонстрирует, как проверить, защищён ли PDF-файл паролем, а затем попытаться разблокировать его, перебирая заранее определённый список паролей с использованием Aspose.PDF for Python via .NET.

Процесс включает:

  1. Использование PdfFileInfo для определения, зашифрован ли PDF.
  2. Откройте PDF с каждым паролем, используя ap.Document().
  3. Если успешно, он выводит количество страниц.
  4. Если нет, он ловит исключение и сообщает о неверном пароле.
import aspose.pdf as ap
import sys
from os import path

def determine_correct_password_from_list(infile):
    """
    Test multiple passwords to find correct one.

    Args:
        infile (str): Input encrypted PDF filename

    Returns:
        None

    Example:
        determine_correct_password_from_list("sample_protected.pdf")

    Note:
        Tries passwords: test, test1, test2, test3, userpassword.
        Prints page count if password is correct.
    """
    info = ap.facades.PdfFileInfo(infile)
    print(f"File is password protected {info.is_encrypted}")

    passwords = "test", "test1", "test2", "test3", "userpassword"

    for password in passwords:
        try:
            document = ap.Document(infile, password)
            count = len(document.pages)
            if count > 0:
                print(f"Number of Page in document are = {count}")
        except RuntimeError as ex:
            template = "An exception of type {0} occurred. Arguments:\n{1!r}"
            message = template.format(type(ex).__name__, ex.args)
            print(message)