4 回答

TA貢獻1942條經驗 獲得超3個贊
將 CSV 視為水果沙拉。你可以在一個大鍋里把香蕉切成薄片,加入一些葡萄柚、一些菠蘿……然后把整體分成單獨的部分,然后放在一起放在桌子上(這是:你生成你的 CSV 文件,然后將它發送到客戶端)。但是你也可以直接做單獨的部分:在一個小碗里切一些香蕉片,加入一些葡萄柚,一些菠蘿,......把這個小碗帶到桌子上,然后對其他單獨的部分重復這個過程(這是:您生成 CSV 文件并在生成它時將其部分發送給客戶端)。
好吧,如果 CSV 是水果沙拉,那么 PDF 就是蛋糕。您必須混合所有成分并將其放入烤箱。這意味著在烘烤整個蛋糕之前,您不能將一塊蛋糕帶到餐桌上。同樣,在完全生成 PDF 文件之前,您無法開始將其發送給客戶。
所以,為了回答你的問題,這個 (?response = StreamingHttpResponse((writer.writerow(row) for row in rows), content_type="text/csv")
) 不能為 PDF 完成。
但是,一旦生成文件,您就可以使用其他答案中提到的方式將其流式傳輸到客戶端FileResponse
。
如果您的問題是生成 PDF 花費的時間太長(例如可能會觸發超時錯誤),請考慮以下幾點:
嘗試優化生成算法的速度
在客戶端請求之前在后臺生成文件并將其存儲在您的存儲系統中。您可能希望使用 cronjob 或celery來觸發 PDF 的生成而不阻止 HTTP 請求。
一旦準備好下載,就使用 websockets 將文件發送到客戶端(參見django-channels)

TA貢獻1853條經驗 獲得超9個贊
您嘗試過FileResponse嗎?
像這樣的東西應該可以工作,它基本上是你可以在Django 文檔中找到的:
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')

TA貢獻1801條經驗 獲得超8個贊
查看您提供的鏈接,它確實提供了指向使用reportlab動態創建和發送 pdf 文件的頁面的鏈接。
import io
from django.http import FileResponse
from reportlab.pdfgen import canvas
def some_view(request):
? ? # Create a file-like buffer to receive PDF data.
? ? buffer = io.BytesIO()
? ? # Create the PDF object, using the buffer as its "file."
? ? p = canvas.Canvas(buffer)
? ? # Draw things on the PDF. Here's where the PDF generation happens.
? ? # See the ReportLab documentation for the full list of functionality.
? ? p.drawString(100, 100, "Hello world.")
? ? # Close the PDF object cleanly, and we're done.
? ? p.showPage()
? ? p.save()
? ? # FileResponse sets the Content-Disposition header so that browsers
? ? # present the option to save the file.
? ? buffer.seek(0)
? ? return FileResponse(buffer, as_attachment=True, filename='hello.pdf')

TA貢獻2016條經驗 獲得超9個贊
我有一個類似的情況,我能夠“生成和流式下載”文件csv
,json
和類型,我想對Excel -xml
文件做同樣的事情。xlsx
不幸的是,我不能那樣做。但是,那段時間我發現了一些事情
文件、CSV、JSON 和 XML 是具有適當表示的文本文件。但是,對于 PDF 或 Excel(或類似文件),這些文件是使用適當的格式和適當的元數據構建的。
只有當我們調用一些特定的方法時, PDF 和類似文檔的二進制數據才會寫入io 緩沖區。[
showPage()
和save()
方法reportlab
。(來源 - Django Doc)]如果我們檢查文件流,PDF 和 Excel 需要復雜的特殊應用程序(例如:PDF 閱讀器、Bowsers 等)來查看/讀取數據,而對于 CSV 和 JSON,我們只需要一個簡單的文本編輯器。
因此,我得出結論,“通過流下載即時生成文件” (不確定我應該使用的正確技術術語是什么)的過程對于所有文件類型都是不可能的,但只適用于一些面向文本的文件
注意:這是我有限的經驗,可能有誤。
添加回答
舉報