1. 程式人生 > >django 動態生成PDF檔案

django 動態生成PDF檔案

可以通過開源的Python PDF庫ReportLab來實現PDF檔案的動態生成。

一、安裝ReportLab

ReportLab庫在PyPI上提供,可以使用pip來安裝:

$ pip install reportlab

在Python互動直譯器中匯入它來測試安裝:

>>> import reportlab

如果沒有丟擲任何錯誤,證明已安裝成功。

二、編寫檢視

ReportLab的API可以處理於類似於檔案(file-like)的物件。下面是一個 “Hello World”的例子:

from reportlab.pdfgen import canvas
from django.http import HttpResponse def some_view(request): # 建立帶有PDF頭部定義的HttpResponse物件 response = HttpResponse(content_type='application/pdf') response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"' # 建立一個PDF物件,並使用響應物件作為它要處理的‘檔案’ p = canvas.Canvas(response) # 通過PDF物件的drawString方法,寫入一條資訊。具體參考模組的官方文件說明。 p.drawString(100, 100, "Hello world.") # 關閉PDF物件 p.showPage() p.save() return response 

相關說明:

  • 響應物件的MIME型別為application/pdf。 這會告訴瀏覽器,文件是個PDF檔案而不是HTML檔案。
  • 響應物件設定了附加的Content-Disposition協議頭,含有PDF檔案的名稱。
  • 檔名可以是任意的,瀏覽器會在“另存為...”對話方塊等中使用。
  • Content-Disposition以'attachment'開頭,強制讓瀏覽器彈出對話方塊來提示或者確認。
  • Canvas函式接受一個類似於檔案的物件,而HttpResponse物件正好合適。
  • 最後,在PDF檔案上呼叫showPage()和save()方法非常重要。
  • 注意:ReportLab並不是執行緒安全的。

三、複雜的PDF

使用ReportLab建立複雜的PDF文件時,可以考慮使用io庫作為PDF檔案的臨時儲存地點。這個庫提供了一個類似於檔案的物件介面,非常實用。 下面的例子是上面的“Hello World”示例採用io重寫後的樣子:

from io import BytesIO
from reportlab.pdfgen import canvas from django.http import HttpResponse def some_view(request): # Create the HttpResponse object with the appropriate PDF headers. response = HttpResponse(content_type='application/pdf') response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"' buffer = BytesIO() # Create the PDF object, using the BytesIO object 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. p.showPage() p.save() # Get the value of the BytesIO buffer and write it to the response. pdf = buffer.getvalue() buffer.close() response.write(pdf) return response