2025, Oct 03 13:31
Python में पासवर्ड-प्रोटेक्टेड PowerPoint खोलें: win32com की सीमा और msoffcrypto का समाधान
win32com Presentations.Open पासवर्ड क्यों नहीं लेता, यह समझें और msoffcrypto-tool से pptx पहले डिक्रिप्ट कर Python ऑटोमेशन में नॉन-इंटरैक्टिव PowerPoint खोलें.
Python ऑटोमेशन के जरिए पासवर्ड-संरक्षित PowerPoint फ़ाइलें खोलना आसान दिखता है—जब तक आप ऐसा पैरामीटर न भेज दें जिसे COM API समझती ही नहीं। अगर आप win32com के माध्यम से पासवर्ड सीधे PowerPoint को देने की कोशिश करते हैं, तो TypeError आता है, क्योंकि अपेक्षित आर्गुमेंट होता ही नहीं। नीचे इस विफलता के तरीके की साफ़ झलक और एक व्यावहारिक उपाय दिया गया है, जिससे आप प्रोटेक्टेड प्रेज़ेंटेशन को प्रोग्रामेटिकली खोल सकते हैं।
समस्या को दोहराना
नीचे दिया गया स्निपेट Presentations.Open में Password कीवर्ड देकर एक सुरक्षित प्रेज़ेंटेशन खोलने की कोशिश करता है। यह PowerPoint COM एप्लिकेशन शुरू करता है, उसे दृश्य (Visible) बनाता है, और फिर open कॉल पर असफल हो जाता है।
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 क्या कर सकती है और क्या नहीं—यह जानना समय बचाता है और नाज़ुक कोड से बचाता है। Presentations.Open के लिए कोई समर्थित Password पैरामीटर मौजूद नहीं है, इसलिए उस पर निर्भर रहने से हमेशा विफलता होगी। अगर आपको नॉन-इंटरैक्टिव वर्कफ़्लो चाहिए, तो खोलने से पहले डिक्रिप्ट करना प्रोग्रामेटिक एक्सेस का भरोसेमंद रास्ता है।
व्यावहारिक मार्गदर्शन
COM मेथड्स को असमर्थित पैरामीटर पास न करें; API सिग्नेचर ही अंतिम स्रोत है। यदि मैनुअल एंट्री स्वीकार्य है, तो पासवर्ड छोड़ दें और PowerPoint को प्रॉम्प्ट करने दें। अनअटेंडेड स्क्रिप्ट्स और सेवाओं के लिए, msoffcrypto-tool से प्रोटेक्टेड pptx को डिक्रिप्ट करें और फिर बनी अस्थायी कॉपी को win32com के जरिए खोलें। इससे ऑटोमेशन पूर्वानुमेय रहता है और मॉडेल डायलॉग या अनपेक्षित एक्सेप्शन्स से बचाव होता है।
यह लेख StackOverflow के प्रश्न पर आधारित है, जिसे Peter ने पूछा, और Ajeet Verma द्वारा दिए गए उत्तर पर।