Гид по технологиям

Шифрование и расшифровка PDF в Python

5 min read Python Обновлено 06 Jan 2026
Шифрование PDF в Python с PyMuPDF
Шифрование PDF в Python с PyMuPDF

Важно: приведённый код сохраняет файлы локально и запрашивает пароль через ввод в консоли. Для продакшн‑решений используйте безопасное управление ключами и учёт доступа.

красный замок на фоне числового кода на ноутбуке

Неавторизованный доступ к чувствительным файлам — частая проблема. Чтобы гарантировать, что доступ к содержимому имеют только уполномоченные, можно зашифровать файлы до передачи.

В этой статье показано, как зашифровать PDF с помощью Python и PyMuPDF и как затем расшифровать его обратно.

Ключевые понятия

  • PyMuPDF (fitz): библиотека для работы с PDF и другими форматами; кратко — инструмент для открытия, редактирования и сохранения PDF.
  • AES-256: симметричный алгоритм шифрования, который используется в примерах (один из доступных алгоритмов в fitz).

Установка окружения

Требуется базовое знание Python. В терминале macOS или командной строке Windows выполните:

pip install PyMuPDF

Эта библиотека поможет открывать и манипулировать PDF.

Установка библиотеки PyMuPDF в терминале IDE

После установки PyMuPDF можно переходить к коду. Полный исходный код доступен в репозитории на GitHub (ссылка в исходном материале).

Импорт модуля fitz

Импортируйте модуль fitz из PyMuPDF:

import fitz  

fitz используется для открытия, шифрования, расшифровки и сохранения PDF.

Проверка, зашифрован ли PDF

Создайте функцию, возвращающую булево значение — зашифрован ли файл:

def pdf_is_encrypted(file):  
    pdf = fitz.Document(file)  
    return pdf.isEncrypted

Эта функция пригодится для автоматического решения — шифровать файл или расшифровывать.

Шифрование PDF

Функция шифрования проверяет, не зашифрован ли уже файл, и если нет — применяет AES-256 и сохраняет зашифрованную версию.

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")

Эта функция сохраняет зашифрованный PDF в путь, указанный в параметре outfile.

Результат программы: зашифрованный файл в проводнике

Расшифровка зашифрованного PDF

Функция расшифровки сначала проверяет, зашифрован ли файл, затем запрашивает пароль и пытается открыть PDF. Если пароль верный, содержимое сохраняется в новый незашифрованный файл.

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')

Код сохранит незашифрованный PDF в текущую рабочую директорию как decrypted.pdf.

Результат программы: расшифрованный файл в проводнике

В примере защищённый файл protected.pdf был расшифрован и сохранён как decrypted.pdf.

Управление потоком программы

Главная функция контролирует последовательность: путь к входному PDF, вызов функций шифрования и расшифровки и передача параметров.

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)  

Чтобы изменить имя зашифрованного файла, замените “protected.pdf” на своё, сохранив расширение “.pdf”.

Запуск основного метода

Убедитесь, что main() запускается только при непосредственном запуске скрипта:

if __name__ == '__main__':  
    main()

Этот фрагмент проверяет, выполняется ли скрипт как основная программа, и вызывает main.

Полезные рекомендации и варианты использования

Когда это работает хорошо

  • Локальная защита документов перед отправкой по электронной почте.
  • Добавление базовой защиты для внутренних отчётов и форм.

Когда это может не подойти

  • Если требуется управление доступом на уровне пользователей и аудит: шифрование файла + пароль недостаточно, нужна система управления правами (DRM, сервер авторизации).
  • Если нужно централизованное хранение и ротация ключей: используйте KMS (Key Management Service).

Альтернативные библиотеки и подходы

  • PyPDF2 — часто используемая библиотека, поддерживает базовое шифрование/расшифровку.
  • pikepdf — обёртка над QPDF, подходит для продакшн‑операций и сложных трансформаций.
  • Использовать контейнеры (например, зашифрованный ZIP с AES) при переносе нескольких файлов.

Эвристики и ментальные модели

  • Если вам нужна совместимость со старыми ридерами PDF — тестируйте на целевых клиентах (Adobe Reader, мобильные читалки).
  • Считайте пароль секретом первой категории; хранение в коде (как в примере) допустимо только для тестов.

Роли и чек‑листы

  • Разработчик: проверить шифрование/расшифровку локально, покрыть тестами.
  • Системный администратор: обеспечить безопасное хранилище паролей/ключей (KMS, HashiCorp Vault).
  • Конечный пользователь: получать инструкции по вводу пароля и по безопасному хранению файла.

Тесты и критерии приёмки

  • Файл sample.pdf был зашифрован и создался protected.pdf.
  • protected.pdf нельзя открыть без пароля (проверка на Adobe Reader или другом ридере).
  • При вводе правильного пароля создаётся decrypted.pdf идентичный sample.pdf по содержимому.
  • При вводе неправильного пароля скрипт сообщает о неверном пароле и не создаёт decrypted.pdf.

Безопасность и жёсткие рекомендации

  • Никогда не храните пароли в открытом коде в продакшне.
  • Используйте безопасное хранилище секретов (KMS, Vault) и ротацию паролей/ключей.
  • Рассмотрите многофакторную авторизацию при доступе к месту хранения зашифрованных файлов.
  • Для корпоративных сценариев используйте решения с аудитом доступа и управлением правами.

Быстрый набор команд и сниппеты

  • Установка: pip install PyMuPDF
  • Открытие файла: pdf = fitz.open(‘file.pdf’)
  • Проверка шифрования: pdf.isEncrypted
  • Сохранение с шифрованием: pdf.save(‘out.pdf’, encryption=fitz.PDF_ENCRYPT_AES_256, user_pw=’пароль’)

Пример: немедленная расшифровка без интерактивного ввода (не рекомендуется в продакшне):

password = 'pass123'
pdf = fitz.open('protected.pdf')
if pdf.authenticate(password):
    pdf.save('decrypted_noninteractive.pdf')

Краткий глоссарий

  • PDF: формат документа Portable Document Format.
  • AES-256: алгоритм симметричного шифрования с ключом 256 бит.
  • KMS: служба управления ключами.

Заключение

Шифрование PDF с помощью PyMuPDF — простой способ добавить уровень защиты при передаче и хранении документов. Для тестовых и локальных задач подойдёт приведённый пример. Для боевой эксплуатации следует добавить безопасное хранение паролей, аудит и управление доступом.

Краткие рекомендации:

  • Для прототипа: используйте пример как есть, но с вводом пароля в консоли.
  • Для продакшна: интегрируйте KMS, ротацию ключей и аудит доступа.

Резюме

  • PyMuPDF позволяет быстро шифровать и расшифровывать PDF.
  • Пример использует AES-256 и демонстрирует базовый рабочий поток.
  • Для реальной безопасности дополните процесс управлением ключей и аудитом.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство