Python/Django - 我可以创建多个类似 pdf 文件的对象,将它们压缩并作为附件发送吗?
Posted
技术标签:
【中文标题】Python/Django - 我可以创建多个类似 pdf 文件的对象,将它们压缩并作为附件发送吗?【英文标题】:Python/Django - Can I create multiple pdf file-like objects, zip them and send as attachment? 【发布时间】:2012-12-29 09:19:45 【问题描述】:我正在使用 Django 创建一个 Web 应用程序,其中输入了一些参数并创建了绘图。我想有一个链接,可以将所有图下载到一个 zip 文件中。为此,我正在编写一个视图,它将创建所有图(我已经编写了创建每个图并显示它们的视图),然后将它们压缩,将 zip 文件保存为响应对象。
我可以做到这一点的一种方法是创建每个绘图,将其作为 pdf 文件保存到磁盘,然后最后将它们全部压缩为响应。但是,如果可能的话,我想回避保存到磁盘?
干杯。
【问题讨论】:
您可以使用python GZip库在内存中压缩。但我不确定你是否可以在内存中制作 PDF。您还可以查看 (***.com/questions/6413441/python-pdf-library) 和 xhtml2pdf。 【参考方案1】:这对我有用,按照 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
行为。
【讨论】:
所有文件都是一系列字节(字符串)。以上是关于Python/Django - 我可以创建多个类似 pdf 文件的对象,将它们压缩并作为附件发送吗?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 Alamofire 创建多个单独的操作队列(或类似的东西)?