{"title":"PDFファイルを作成する","version":"5.1","locale":"ja","docname":"howto/outputting-pdf","url":"/ja/5.1/howto/outputting-pdf/","canonical":"https://djangodocs.dev/ja/5.1/howto/outputting-pdf/","summary":"このドキュメントでは、Django のビューを使用して PDF ファイルを動的に出力する方法を説明します。これは、優れたオープンソースの Python PDF ライブラリ ReportLab により可能になっています。 PDF ファイルを動的に生成する利点は、異なる目的のためにカスタマイズされた PDF…","html":"<h1>PDFファイルを作成する<a class=\"heading-anchor\" href=\"#how-to-create-pdf-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>このドキュメントでは、Django のビューを使用して PDF ファイルを動的に出力する方法を説明します。これは、優れたオープンソースの Python PDF ライブラリ <a class=\"reference external\" href=\"https://docs.reportlab.com/\">ReportLab</a> により可能になっています。</p>\n<p>PDF ファイルを動的に生成する利点は、異なる目的のためにカスタマイズされた PDF を作成できることです。たとえば、異なるユーザーや異なるコンテンツを使用して生成できます。</p>\n<p>たとえば、<a class=\"reference external\" href=\"https://www2.kusports.com/\">kusports.com</a> では、March Madness コンテストに参加する人たちのために、カスタマイズされたプリンター向けの NCAA トーナメントブラケットを PDF ファイルとして生成するのに Django が使われていました。</p>\n<section id=\"install-reportlab\">\n<h2>ReportLab をインストールする<a class=\"heading-anchor\" href=\"#install-reportlab\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>ReportLab ライブラリは、<a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/reportlab/\">PyPI で利用できます</a>。<a class=\"reference external\" href=\"https://www.reportlab.com/docs/reportlab-userguide.pdf\">ユーザーガイド</a> (偶然ではなく PDF で提供されています) もダウンロードして利用できます。ReportLab は <code class=\"docutils literal notranslate\"><span class=\"pre\">pip</span></code> により次のコマンドでインストールできます。</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>-m<span class=\"w\"> </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>reportlab\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -m pip install reportlab\n</code></pre></div></div></div>\n<p>Python の対話的インタープリタ内でインポートすることでインストールをテストします。</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">reportlab</span>\n</code></pre></div>\n<p>このコマンドが何もエラーを起こさなければ、インストールは機能しています。</p>\n</section>\n<section id=\"write-your-view\">\n<h2>ビューを書く<a class=\"heading-anchor\" href=\"#write-your-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django で PDF を動的に生成するときに重要な点は、ReportLab API がファイルライクなオブジェクトとして振る舞い、Django の <a class=\"reference internal\" href=\"/ja/5.1/ref/request-response/#django.http.FileResponse\" title=\"django.http.FileResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileResponse</span></code></a> オブジェクトがファイルライクなオブジェクトを受け取るということです。</p>\n<p>ここに、&quot;Hello World&quot;の例を示します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">io</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FileResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">reportlab.pdfgen</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">canvas</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">some_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Create a file-like buffer to receive PDF data.</span>\n    <span class=\"n\">buffer</span> <span class=\"o\">=</span> <span class=\"n\">io</span><span class=\"o\">.</span><span class=\"n\">BytesIO</span><span class=\"p\">()</span>\n\n    <span class=\"c1\"># Create the PDF object, using the buffer as its &quot;file.&quot;</span>\n    <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">canvas</span><span class=\"o\">.</span><span class=\"n\">Canvas</span><span class=\"p\">(</span><span class=\"n\">buffer</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Draw things on the PDF. Here&#39;s where the PDF generation happens.</span>\n    <span class=\"c1\"># See the ReportLab documentation for the full list of functionality.</span>\n    <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">drawString</span><span class=\"p\">(</span><span class=\"mi\">100</span><span class=\"p\">,</span> <span class=\"mi\">100</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Hello world.&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Close the PDF object cleanly, and we&#39;re done.</span>\n    <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">showPage</span><span class=\"p\">()</span>\n    <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n\n    <span class=\"c1\"># FileResponse sets the Content-Disposition header so that browsers</span>\n    <span class=\"c1\"># present the option to save the file.</span>\n    <span class=\"n\">buffer</span><span class=\"o\">.</span><span class=\"n\">seek</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">FileResponse</span><span class=\"p\">(</span><span class=\"n\">buffer</span><span class=\"p\">,</span> <span class=\"n\">as_attachment</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">filename</span><span class=\"o\">=</span><span class=\"s2\">&quot;hello.pdf&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>コードとコメントが自分自身の意味を説明しているはずですが、いくつかの点には言及しておくべきでしょう。</p>\n<ul class=\"simple\">\n<li><p>レスポンスはファイル名の拡張子に基づいて自動的にMIMEタイプ <em class=\"mimetype\">application/pdf</em> を設定します。これはブラウザに、ドキュメントがHTMLファイルや一般的な <em class=\"mimetype\">application/octet-stream</em> バイナリコンテンツではなく、PDFファイルであることを伝えます。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">as_attachment=True</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">FileResponse</span></code> に渡されると、適切な <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Disposition</span></code> ヘッダが設定され、ウェブブラウザはそのマシンでデフォルトが設定されていたとしても、そのドキュメントをどのように扱うかを確認するダイアログボックスをポップアップするようになります。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">as_attachment</span></code> パラメータが省略された場合、ブラウザはPDFを扱うために設定されたプログラムやプラグインを使ってPDFを扱います。</p></li>\n<li><p>任意の <code class=\"docutils literal notranslate\"><span class=\"pre\">filename</span></code> パラメータを指定できます。これはブラウザの &quot;名前を付けて保存&quot; ダイアログで使用されます。</p></li>\n<li><p>ReportLab API にフックできます: <code class=\"docutils literal notranslate\"><span class=\"pre\">canvas.Canvas</span></code> の第一引数に渡されたバッファと同じバッファを <a class=\"reference internal\" href=\"/ja/5.1/ref/request-response/#django.http.FileResponse\" title=\"django.http.FileResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileResponse</span></code></a> クラスに渡すことができます。</p></li>\n<li><p>後続のPDF生成メソッドはすべて、PDFオブジェクト（この場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">p</span></code> ）に対して呼び出され、 <code class=\"docutils literal notranslate\"><span class=\"pre\">buffer</span></code> に対して呼び出されるのではないことに注意してください。</p></li>\n<li><p>最後に、PDFファイル上で <code class=\"docutils literal notranslate\"><span class=\"pre\">showPage()</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> を呼び出すことが重要です。</p></li>\n</ul>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>ReportLabはスレッドセーフではありません。一部のユーザーからは、多くの人が同時にアクセスするPDF生成Djangoビューを構築する際に奇妙な問題が発生するとの報告があります。</p>\n</aside>\n</section>\n<section id=\"other-formats\">\n<h2>ほかのフォーマット<a class=\"heading-anchor\" href=\"#other-formats\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>これらの例には PDF 固有のものはあまりないことに注意してください -- <code class=\"docutils literal notranslate\"><span class=\"pre\">reportlab</span></code> を使った部分だけです。同じようなテクニックを使って、Pythonのライブラリがあれば任意のフォーマットを生成できます。また、 <a class=\"reference internal\" href=\"/ja/5.1/howto/outputting-csv/\"><span class=\"doc\">CSVを出力する</span></a> にも別の例とテキストベースのフォーマットを生成するときに使えるテクニックがあります。</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">参考</p>\n<p>Django Packagesは、DjangoからPDFファイルを生成するのに役立つ <a class=\"reference external\" href=\"https://djangopackages.org/grids/g/pdf/\">パッケージの比較一覧</a> を提供しています。</p>\n</aside>\n</section>","rootId":"how-to-create-pdf-files","toc":[{"title":"ReportLab をインストールする","anchor":"install-reportlab","children":[]},{"title":"ビューを書く","anchor":"write-your-view","children":[]},{"title":"ほかのフォーマット","anchor":"other-formats","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to ガイド","url":"/ja/5.1/howto/"}],"prev":{"docname":"howto/outputting-csv","title":"CSVを出力する","url":"/ja/5.1/howto/outputting-csv/"},"next":{"docname":"howto/overriding-templates","title":"テンプレートをオーバーライドする","url":"/ja/5.1/howto/overriding-templates/"},"formats":{"html":"/ja/5.1/howto/outputting-pdf/","markdown":"/ja/5.1/howto/outputting-pdf.md","json":"/ja/5.1/howto/outputting-pdf.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/howto/outputting-pdf.txt","official":"https://docs.djangoproject.com/ja/5.1/howto/outputting-pdf/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}