2017-02-09 84 views
1

我使用python-pptx v0.6.2生成powerpoint。我读了一个存在的BytesIO的Powerpoint,然后做一些修改并保存。我可以成功下载文件,并且我确定内容可以写入文件。但是当我打开Powerpoint的时候,它会弹出一个错误信息“Powerpoint发现foo.pptx中的内容有问题,Powerpoint可以尝试修复这个提示”,然后我必须点击“修复”按钮,powerpoint会显示为“修复”模式。我的Python版本是3.5.2,Django版本是1.10。以下是我的代码:Django使用python-pptx库生成的powerpoint有错误信息

with open('foo.pptx', 'rb') as f: 
    source_stream = BytesIO(f.read()) 
prs = Presentation(source_stream) 

first_slide = prs.slides[0] 
title = first_slide.shapes.title 
subtitle = first_slide.placeholders[1] 
title.text = 'Title' 
subtitle.text = "Subtitle" 

response = HttpResponse(content_type='application/vnd.ms-powerpoint') 
response['Content-Disposition'] = 'attachment; filename="sample.pptx"' 
prs.save(source_stream) 
ppt = source_stream.getvalue() 
source_stream.close() 
response.write(ppt) 
return response 

任何帮助表示感谢,提前致谢!

+0

那么问题是什么? '.pptx'基本上是一个重命名的'.zip'文件。尝试将其重命名为'.zip'并手动检查里面的内容。 – yedpodtrzitko

回答

1

它看起来像你有问题的IO。

前三行可以被代替:

prs = Presentation('foo.pptx') 

放置文件到一个基于存储器的流只是使用不必要的资源。

在写作时,您正在写入原始(不必要的)流,这是冒险的。我怀疑这是因为你没有seek(0),你将追加到它的末尾。处理重复使用在概念上也更复杂。

如果您使用新的BytesIO缓冲区进行保存,我认为您会得到正确的行为。这也是一种更好的做法,因为它可以将打开,修改和保存分离,然后您可以将其分解为单独的方法。

如果您消除了第一个BytesIO,您只需要一个用于保存以便将.pptx“文件”转换为HTTP响应。

+0

嗨Scanny,谢谢你的回答。遵循你的建议,我用“prs = Presentation('foo.pptx')”替换了前三行,并在“prs.save(source_stream)”之前插入了代码“source_stream = BytesIO()”。最后,生成的PPT完美无缺! –