Djangoを使用したPDFの出力—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/howto/outputting-pdf
移動先:案内検索

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=TrueFileResponseに渡されると、適切な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の出力も参照してください。

も参照してください

Djangoパッケージは、DjangoからPDFファイルを生成するのに役立つパッケージの比較を提供します。