Django使用python-pptx库生成的powerpoint有错误消息

时间:2017-02-09 14:03:25

标签: python django powerpoint python-pptx bytesio

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

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

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

1 个答案:

答案 0 :(得分:1)

看起来你的IO有问题。

前三行可以替换为:

prs = Presentation('foo.pptx')

将文件放入基于内存的流中只会使用不必要的资源。

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

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

如果你删除了第一个BytesIO,你应该只需要一个用于保存,以获得.pptx"文件"进入HTTP响应。