2025, Oct 03 13:16

Как открыть защищённую паролем презентацию PowerPoint из Python

Почему PowerPoint через win32com не принимает Password и как открыть защищённый файл из Python: расшифровать pptx msoffcrypto-tool и открыть через COM.

Открывать защищённые паролем файлы PowerPoint из Python кажется простым — пока вы не передадите параметр, которого COM‑API не знает. Попытка передать пароль напрямую в PowerPoint через win32com приводит к TypeError: ожидаемого аргумента в методе просто нет. Ниже — наглядная демонстрация сбоя и рабочий способ программно открыть защищённую презентацию.

Воспроизведение проблемы

Этот фрагмент пытается открыть защищённую презентацию, передавая ключевой аргумент Password в Presentations.Open. Он запускает COM‑приложение PowerPoint, делает его видимым — и падает на вызове открытия.

import win32com.client as comwin
pp_app = comwin.Dispatch('PowerPoint.Application')
pp_app.Visible = True
pp_app.DisplayAlerts = True

slideset = pp_app.Presentations.Open(r'C:\Users\Downloads\PPT File.ppt', Password="123")

Python выдаёт TypeError примерно такого вида:

TypeError: Open() got an unexpected keyword argument 'Password'

Почему это не работает

Сообщение об ошибке говорит само за себя. Presentations.Open не имеет параметра Password, поэтому его передача приводит к TypeError. Иными словами, win32com корректно пробрасывает вызов в COM‑метод, но в его сигнатуре такого аргумента нет. Если полностью убрать параметр Password, PowerPoint откроет диалог и запросит пароль интерактивно — это приемлемо для ручной работы, но не для автоматизации.

Рабочий подход с msoffcrypto-tool

Чтобы программно открыть защищённый паролем файл pptx, сначала расшифруйте его, а затем передайте в PowerPoint расшифрованную копию. Пакет msoffcrypto-tool берёт на себя этап расшифровки.

pip install msoffcrypto-tool

Схема простая: читаем зашифрованный файл, расшифровываем во временный pptx, затем открываем этот временный файл через COM‑объект.

import msoffcrypto
import tempfile
import win32com.client as comlib

src_path = r"your pptx file path"
secret_key = "your password"

# расшифровка во временный файл
with open(src_path, "rb") as fh:
crypt_obj = msoffcrypto.OfficeFile(fh)
crypt_obj.load_key(password=secret_key)
with tempfile.NamedTemporaryFile(delete=False, suffix=".pptx") as tmp_handle:
crypt_obj.decrypt(tmp_handle)
plain_copy = tmp_handle.name

# открытие расшифрованной копии
pp_ctrl = comlib.Dispatch("PowerPoint.Application")
pp_ctrl.Visible = True
deck_obj = pp_ctrl.Presentations.Open(plain_copy, ReadOnly=True, WithWindow=True)

Если пароль указан верно, расшифрованная копия откроется нормально. Если пароль неверный, на этапе расшифровки возникнет исключение msoffcrypto.exceptions.InvalidKeyError с сообщением: The file could not be decrypted with this password.

Что это значит для автоматизации

Понимание того, что умеет и чего не умеет COM‑API, экономит время и помогает избежать хрупкого кода. Параметр Password для Presentations.Open не поддерживается, поэтому попытки использовать его будут стабильно проваливаться. Если нужен неинтерактивный сценарий, надёжнее всего расшифровать файл перед открытием и уже затем передавать его PowerPoint.

Практические рекомендации

Не передавайте неподдерживаемые параметры в методы COM — сигнатура API определяющая. Если ручной ввод устраивает, уберите пароль и позвольте PowerPoint запросить его в диалоге. Для безнадзорных скриптов и сервисов расшифруйте защищённый pptx с помощью msoffcrypto-tool, а затем откройте временную копию через win32com. Такой подход делает автоматизацию предсказуемой и избавляет от модальных окон и неожиданных исключений.

Статья основана на вопросе на StackOverflow от Peter и ответе от Ajeet Verma.