【发布时间】:2020-06-04 04:04:45
【问题描述】:
我一直在尝试使用 DispatchEx 创建多个 pdf 文件,但是当我尝试测试我的代码时,它只创建第一个 pdf 文件,而所有其他请求都失败并出现奇怪的错误。我做错了什么和/或如何有效地同时处理多个客户呼叫以生成他们请求的各自的 pdf 文件?
这是我的代码的一部分:
rundate = "Quote_{:%d%m%Y_%H%M%S%f}".format(datetime.now())
pythoncom.CoInitialize()
FILENAME = "D:/packages/abc.pptx"
APPLICATION = win32com.client.DispatchEx("PowerPoint.Application")
APPLICATION.Visible = True
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.AlternativeText:
print(shape.AlternativeText)
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)
APPLICATION.Quit()
PRESENTATION.Close()
PRESENTATION = None
APPLICATION = None
os.remove(path_ppt)
PS - 代码成功创建了与发送给它的请求一样多的 ppt 副本(使用shutil),但是当在短时间内发出多个请求时,win32com 会出错,例如 shape.AlternativeText not found, object does not exist等等
【问题讨论】:
-
也许它的
APPLICATION.quit与另一个应用程序调度重叠。也许您可以单方面打开应用程序,然后在此工作人员中执行PRESENTATION = APPLICATION.Presentations.Open(path_ppt)部分。 -
您能否进一步说明如何做到这一点?我是使用 win32com 的新手并尽力而为。
-
即使您可以帮助我了解如何知道一个呼叫是否已经存在,然后让我的客户稍后再试,因为 DispatchEx 似乎不像我理解的那样工作
-
我已经很久没有完成
win32com了,所以只是猜测。我猜测在一个 ppt 实例中创建多个演示文稿比创建多个 ppt 更好。我发现IDispatchEx上的文档有点令人困惑。假设APPLICATION是一个全局变量,而您只执行了一次APPLICATION = win32com.client.DispatchEx("PowerPoint.Application")。然后演示文稿将作为该应用程序中的选项卡来来去去。 -
如果您的客户很热,您可以使用互斥锁来保护此代码以对其进行序列化...但可能会破坏您所在的任何框架。