2017-02-09 45 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完美無缺! –