Python 是否可以使用StreamingHttpResponse生成PDF,因为它是';对于大型数据集,是否可以使用CSV?
我有一个大的数据集,我必须生成CSV和PDF。对于CSV,我使用以下指南:Python 是否可以使用StreamingHttpResponse生成PDF,因为它是';对于大型数据集,是否可以使用CSV?,python,django,large-data,streaminghttpresponse,Python,Django,Large Data,Streaminghttpresponse,我有一个大的数据集,我必须生成CSV和PDF。对于CSV,我使用以下指南: 它工作得很好。然而,我找不到任何可以为PDF做的事情。可以吗?我使用render_to_pdf以及pdf模板。我有一个类似的情况,我可以“生成并流式下载”csv、json和xml类型的文件,我想用Excel-xlsx文件做同样的事情 不幸的是,我不能那样做。但是,在那段时间里,我发现了一些东西 文件、CSV、JSON和XML是具有适当表示形式的文本文件。但是,当涉及到PDF或Excel(或类似文件)时,这些文件是使用适当
它工作得很好。然而,我找不到任何可以为PDF做的事情。可以吗?我使用
render_to_pdf
以及pdf模板。我有一个类似的情况,我可以“生成并流式下载”csv、json
和xml
类型的文件,我想用Excel-xlsx
文件做同样的事情
不幸的是,我不能那样做。但是,在那段时间里,我发现了一些东西
showPage()
和save()
方法的reportlab
(源-)
查看您提供的链接,它确实提供了一个链接,指向使用动态创建和发送pdf文件的页面
导入io
从django.http导入文件响应
从reportlab.pdfgen导入画布
定义某些视图(请求):
#创建一个类似文件的缓冲区来接收PDF数据。
buffer=io.BytesIO()
#创建PDF对象,使用缓冲区作为其“文件”
p=canvas.canvas(缓冲区)
#在PDF上画东西。这里是生成PDF的地方。
#有关功能的完整列表,请参阅ReportLab文档。
p、 抽绳(100100,“你好,世界。”)
#干净地关闭PDF对象,我们就完成了。
p、 showPage()
p、 保存()
#FileResponse设置内容处置标头,以便浏览器
#显示保存文件的选项。
buffer.seek(0)
返回FileResponse(缓冲区,如_attachment=True,filename='hello.pdf')
这里是文档的链接。它有点长,而且存储在一个恼人的单页pdf中,但它应该可以让您启动并运行,并且能够很好地按照您的需要格式化pdf。将CSV视为一种水果沙拉。你可以在一个大锅里切香蕉,加一些葡萄柚,一些菠萝。。。然后将整个文件拆分为单独的部分,并将其合并到表中(即:生成CSV文件,然后将其发送到客户端)。但是你也可以直接做一些单独的部分:在一个小碗里切一些香蕉片,加入一些葡萄柚,一些菠萝。。。将这个小碗放到桌上,并对其他单独的部分重复此过程(即:生成CSV文件,并在生成文件时将其逐部分发送给客户端) 如果CSV是水果沙拉,那么PDF是蛋糕。你必须把所有的配料混合在一起放进烤箱。这意味着在你烤完整个蛋糕之前,你不能把一片蛋糕带到桌上。同样,在完全生成PDF文件之前,您无法开始将其发送到客户端 因此,为了回答您的问题,这个(
response=StreamingHttpResponse((writer.writerow(row)表示行中的行),content\u type=“text/csv”)
)不能用于PDF
但是,一旦生成了文件,就可以使用其他答案中提到的方法将其流式传输到客户端
如果您的问题是生成PDF需要花费太多时间(例如,可能会触发超时错误),请考虑以下几点:
你试过FileResponse吗?这样想。如果需要,CSV可以有多张图纸。它是可编辑的。其中,PDF格式无法修改。PDF是一个大文档,没有任何工作表。我尝试了这个片段来生成一个大的PDF,比如说
.drawString(…)
方法的100k迭代,下载没有在p.save()
执行之前开始。是的,必须在流媒体开始之前创建PDF。
import csv
from django.http import StreamingHttpResponse
class Echo:
"""An object that implements just the write method of the file-like
interface.
"""
def write(self, value):
"""Write the value by returning it, instead of storing in a buffer."""
return value
def some_streaming_csv_view(request):
"""A view that streams a large CSV file."""
# Generate a sequence of rows. The range is based on the maximum number of
# rows that can be handled by a single sheet in most spreadsheet
# applications.
rows = (["Row {}".format(idx), str(idx)] for idx in range(65536))
pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer)
response = StreamingHttpResponse((writer.writerow(row) for row in rows),
content_type="text/csv")
response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
return response
import io
from django.http import FileResponse
from reportlab.pdfgen import canvas
def stream_pdf(request):
buffer = io.BytesIO()
p = canvas.Canvas(buffer)
p.drawString(10, 10, "Hello world.")
p.showPage()
p.save()
buffer.seek(io.SEEK_SET)
return FileResponse(buffer, as_attachment=True, filename='helloworld.pdf')