2017-02-09 27 views
1

私はpython-pptx v0.6.2を使ってパワーポイントを生成します。 BytesIOに存在するパワーポイントを読んだ後、いくつかの変更を加えて保存します。私は、ファイルを正常にダウンロードすることができ、私はコンテンツがファイルに書き込むことができると確信しています。しかし、パワーポイントを開くと、「Powerpointはfoo.pptxのコンテンツに問題が見つかりました.Powerpointは事前設定を修復できます。」というエラーメッセージがポップアップします。「修復」ボタンをクリックすると、パワーポイントが次のように表示されます。 「修復」モード。私のPythonバージョンは3.5.2、Djangoバージョンは1.10です。以下は、私のコードは次のとおりです。Django python-pptxライブラリを使って生成されたパワーポイントにエラーメッセージ

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') 

最初の3行を置き換えることができます。

執筆では、元の(不要な)ストリームに書き込んでいます。これは厄介です。私はあなたがそれの最後に追加しているseek(0)をしなかったのでそれが疑わしい。また、再利用に対処するのは概念的に複雑です。

新しいBytesIOバッファを保存用に使用すると、適切な動作が得られると思います。それは、開いたものを切り離し、変更して保存することができるので、後で別々の方法に分解することもできるため、より良い方法です。

最初のBytesIOを削除すると、.pptx "ファイル"をHTTP応答に取り込むために、保存用のものが必要になります。

+0

あなたのアドバイスに従って、私は最初の3行を "prs = Presentation( 'foo.pptx')"に置き換え、 "prs.save(source_stream)"の前に "source_stream = BytesIO()"というコードを挿入します。最後に生成されたパワーポイントは完璧に動作します! –

関連する問題