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

Django the powerpoint generated using python-pptx library has error message

我使用python-pptx v0.6.2 生成powerpoint。我将现有的 powerpoint 读入 BytesIO,然后进行一些修改并保存。我可以成功下载文件,我确定可以将内容写入文件。但是当我打开powerpoint时,它会弹出一个错误信息"Powerpoint found a problem with content in foo.pptx. Powerpoint can attempt to repair the presatation.",然后我必须点击"repair"按钮,powerpoint会显示为"repaired"模式。我的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

感谢任何帮助,在此先感谢!

看来您的 IO 有问题。

前三行可以替换为:

prs = Presentation('foo.pptx')

将文件放入 memory-based 流只会使用不必要的资源。

在写入时,您正在写入原始(不必要的)流,这是有风险的。我怀疑是因为您没有 seek(0) 才附加到它的末尾。此外,处理重用在概念上更复杂。

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

如果您删除第一个 BytesIO,您应该只需要一个用于保存,以便将 .pptx "file" 放入 HTTP 响应中。