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.