2013-01-15 24 views
2

我正在使用Django創建一個Web應用程序,其中輸入了一些參數並創建了繪圖。我想要有一個鏈接,將下載所有的地塊在一個zip文件。爲此,我正在編寫一個視圖,它將創建所有圖(我已經編寫了創建每個單個圖並顯示它們的視圖),然後壓縮它們,將zip文件保存爲響應對象。Python/Django - 我可以創建多個pdf文件類對象,將它們壓縮並作爲附件發送?

我可以做到這一點的一種方式是創建每個圖,將其保存爲PDF文件到磁盤,然後在最後將它們全部壓縮爲響應。但是,如果可能的話,我想避開保存到磁盤。

乾杯。

+0

拍攝您可以使用Python的GZip庫在內存中壓縮。但我不確定您是否可以在內存中製作PDF。你也可以查看(http://stackoverflow.com/questions/6413441/python-pdf-library)和xhtml2pdf。 – pranshus

回答

2

這對我來說是有效的,由Krzysiek的建議使用StringIO。這裏canvas是由matplotlib創建的canvas對象。

#Create the file-like objects from canvases 
file_like_1 = StringIO.StringIO() 
file_like_2 = StringIO.StringIO() 
#... etc... 
canvas_1.print_pdf(file_like_1) 
canvas_2.print_pdf(file_like_2) 
#...etc.... 

#NOW create the zipfile 
response = HttpResponse(mimetype='application/zip') 
response['Content-Disposition'] = 'filename=all_plots.zip' 

buff = StringIO.StringIO() 
archive = zipfile.ZipFile(buff,'w',zipfile.ZIP_DEFLATED) 
archive.writestr('plot_1.pdf',file_like_1.getvalue()) 
archive.writestr('plot_2.pdf',file_like_2.getvalue()) 
#..etc... 
archive.close() 
buff.flush() 
ret_zip = buff.getvalue() 
buff.close() 
response.write(ret_zip) 
return response 

這一切的荏苒部分從https://code.djangoproject.com/wiki/CookBookDynamicZip

2

看看StringIO python模塊。它在內存字符串上實現file行爲。

+0

謝謝。 StringIO確實有效。顯然,pdf文件是字符串... – StevenMurray

+0

所有文件都是一系列字節(字符串)。 –

相關問題