Есть ли способ устранить ошибку «Вызов был отклонен Callee» во время отправки PowerPoint в Python? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть приложение Django, и мой взгляд пытается конвертировать pptx в pdf с помощью Win32Com. Он выдавал ошибку при открытии нескольких экземпляров, поэтому я использовал DispatchEx (и даже попробовал gencache и dynamici c dispatch). Я даже использую подпроцесс для каждого запроса в моем представлении, но я получаю сообщение об ошибке «Call был отклонен Callee», когда несколько запросов отправляются одновременно. Удивительно, но ошибка не произойдет, если я не выйду и не закрою презентацию и приложение powerpoint. Прошло уже много часов с тех пор, как я пытаюсь заставить его работать, просто обрабатывая различные клиентские запросы и создавая для них pdf-файлы из шаблона pptx, но все тщетно. Пожалуйста, помогите!

import shutil
import sys
import subprocess as subp
import win32com.client
import pythoncom
from datetime import datetime
import os
import time

def do_powerpoint(filename):
   """run external copy of self to do powerpoint stuff"""
   # sys.executable is the python.exe you are using, __file__ is the
   # path to this module's source and filename you pass in
   return subp.call([sys.executable, __file__, filename])

def _do_powerpoint(filename):
    try:
        rundate = "Quote_{:%d%m%Y_%H%M%S%f}".format(datetime.now())
        pythoncom.CoInitialize()
        APPLICATION = win32com.client.DispatchEx("PowerPoint.Application")
        APPLICATION.Visible = True # I think False is better so you dont see it pop up
        path_ppt = shutil.copy(filename, "D:/{0}.pptx".format(rundate))
        PRESENTATION = APPLICATION.Presentations.Open(path_ppt)
        Slide1 = PRESENTATION.Slides(1)
        Shape1 = Slide1.Shapes(1)
        print(Shape1.AlternativeText)
        for shape in Slide1.Shapes:
            if shape.HasTextFrame:
                shape.TextFrame.TextRange.Replace(FindWhat="#abc",ReplaceWhat="THAILAND", WholeWords=False)
            if shape.AlternativeText == "1":
                shape.Fill.UserPicture("D:/1.jpg")
            if shape.AlternativeText == "2":
                shape.Fill.UserPicture("D:/2.jpg")
            if shape.AlternativeText == "3":
                shape.Fill.UserPicture("D:/3.jpg")
        PATH_TO_PDF = "{0}{1}{2}".format(r'd:/',rundate,'.pdf')
        PRESENTATION.SaveAs(PATH_TO_PDF, 32)
        '''if I remove below 4 lines, it works fine 
and converts all pptx to pdf, but all instances of 
powerpoint remain open and copies arent deleted, eating system resources'''
        PRESENTATION.Close() 
        APPLICATION.Quit()
        PRESENTATION = None
        APPLICATION = None
        os.remove(path_ppt)
        return True
    except Exception:
        return False

if __name__ == "__main__":
    _do_powerpoint(sys.argv[1]) # will raise error if no parameters
...