DjangoでPDFを出力する
このドキュメントでは、Djangoビューを使用してPDFファイルを動的に出力する方法について説明します。 これは、優れたオープンソースの ReportLab PythonPDFライブラリによって可能になります。
PDFファイルを動的に生成する利点は、さまざまな目的(たとえば、さまざまなユーザーやさまざまなコンテンツ)用にカスタマイズされたPDFを作成できることです。
たとえば、Djangoは kusports.com で使用され、マーチマッドネスコンテストに参加する人々のために、カスタマイズされた、プリンターに適したNCAAトーナメントブラケットをPDFファイルとして生成しました。
ReportLabをインストールする
ReportLabライブラリは PyPI で利用できます。 ユーザーガイド(偶然ではありませんが、PDFファイル)もダウンロードできます。 ReportLabはpip
でインストールできます。
Pythonインタラクティブインタープリターにインポートして、インストールをテストします。
>>> import reportlab
そのコマンドでエラーが発生しない場合、インストールは機能しました。
あなたの意見を書いてください
Djangoで動的にPDFを生成するための鍵は、ReportLab APIがファイルのようなオブジェクトに作用し、Djangoの FileResponse オブジェクトがファイルのようなオブジェクトを受け入れることです。
これが「HelloWorld」の例です。
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')
コードとコメントは自明である必要がありますが、いくつか言及する価値があります。
- 応答は、ファイル名拡張子に基づいてMIMEタイプ application / pdf を自動的に設定します。 これは、ドキュメントがHTMLファイルや一般的な application / octet-stream バイナリコンテンツではなく、PDFファイルであることをブラウザに通知します。
as_attachment=True
がFileResponse
に渡されると、適切なContent-Disposition
ヘッダーが設定され、Webブラウザーに、ドキュメントの処理方法を確認するダイアログボックスが表示されるように指示されます。デフォルトはマシンに設定されています。as_attachment
パラメーターを省略すると、ブラウザーは、PDFに使用するように構成されているプログラム/プラグインを使用してPDFを処理します。- 任意の
filename
パラメーターを指定できます。 これは、ブラウザの「名前を付けて保存…」ダイアログで使用されます。 - ReportLabAPIにフックできます。
canvas.Canvas
に最初の引数として渡されたのと同じバッファーを FileResponse クラスに供給することができます。 - 以降のすべてのPDF生成メソッドは、
buffer
ではなく、PDFオブジェクト(この場合はp
)で呼び出されることに注意してください。 - 最後に、PDFファイルで
showPage()
およびsave()
を呼び出すことが重要です。
ノート
ReportLabはスレッドセーフではありません。 一部のユーザーは、同時に多くの人がアクセスするPDF生成のDjangoビューの構築に関する奇妙な問題を報告しています。
その他の形式
これらの例にはPDF固有のものは多くなく、reportlab
を使用しているビットだけであることに注意してください。 同様の手法を使用して、Pythonライブラリを見つけることができる任意の形式を生成できます。 別の例と、テキストベースの形式を生成するときに使用できるいくつかの手法については、 Djangoを使用したCSVの出力も参照してください。