【问题标题】:Django the powerpoint generated using python-pptx library has error messageDjango 使用 python-pptx 库生成的 powerpoint 有错误消息
【发布时间】:2017-12-17 06:53:37
【问题描述】:

我使用 python-pptx v0.6.2 来生成 powerpoint。我将现有的PowerPoint 读入BytesIO,然后进行一些修改并保存。我可以成功下载文件,并且我确信内容可以写入文件。但是当我打开powerpoint时,它会弹出一条错误消息“Powerpoint发现foo.pptx中的内容有问题。Powerpoint可以尝试修复presatation。”,然后我必须点击“修复”按钮,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

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

【问题讨论】:

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

标签: python django powerpoint python-pptx bytesio


【解决方案1】:

您的 IO 似乎有问题。

前三行可以替换为:

prs = Presentation('foo.pptx')

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

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

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

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

【讨论】:

  • 嗨,Scanny,感谢您的回答。按照您的建议,我将前三行替换为“prs = Presentation('foo.pptx')”,然后在“prs.save(source_stream)”之前插入代码“source_stream = BytesIO()”。最后生成的PowerPoint完美运行!
猜你喜欢
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
相关资源
最近更新 更多