最近、Pythonでpdfを作成する機会がありました。
Pythonのpdf作成ライブラリには何があるのかを調べたところ、ReportLab
が一番有名そうでした。
また、DjangoのドキュメントにもReportLabの記載がありました。
Django で PDF を出力する | Django documentation | Django
そこで、Django + ReportLabのアプリを作り、Herokuにてpdfを表示してみました。
目次
環境
環境の準備
# Python3.5.2でvirtualenv準備 $ eval "$(pyenv init -)" $ python --version Python 3.5.2 $ virtualenv env ... Installing setuptools, pip, wheel...done. $ source env/bin/activate # pipでinstall (env) $ pip install django reportlab uwsgi ... Successfully installed django-1.10.5 olefile-0.44 pillow-4.0.0 reportlab-3.3.0 uwsgi-2.0.14 # Djangoアプリの生成 (env) $ django-admin startproject myproject . (env) $ python manage.py startapp myapp
Djangoアプリの内容
以下を参考に、今回は「はろーわーるど」という日本語をpdf出力してみます。
PythonでPDFを生成したい そしてサイコロを作りたい - [[ともっくす alloc] init]
Viewのソースコードはこんな感じです。
from django.views import View from django.http import HttpResponse from reportlab.lib.pagesizes import A4 from reportlab.lib.pagesizes import portrait from reportlab.lib.units import mm from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.cidfonts import UnicodeCIDFont from reportlab.pdfgen import canvas class PdfView(View): def get(self, request, *args, **kwargs): # pdf用のContent-TypeやContent-Dispositionをセット response = HttpResponse(status=200, content_type='application/pdf') response['Content-Disposition'] = 'filename="example.pdf"' # 即ダウンロードしたい時は、attachmentをつける # response['Content-Disposition'] = 'attachment; filename="example.pdf"' self._create_pdf(response) return response def _create_pdf(self, response): # 日本語が使えるゴシック体のフォントを設定する font_name = 'HeiseiKakuGo-W5' pdfmetrics.registerFont(UnicodeCIDFont(font_name)) # A4縦書きのpdfを作る size = portrait(A4) # pdfを描く場所を作成:pdfの原点は左上にする(bottomup=False) doc = canvas.Canvas(response, pagesize=size, bottomup=False) # フォントとサイズ(9)を指定して、左から20mm・上から18mmの位置に「はろーわーるど」を表示 doc.setFont(font_name, 9) doc.drawString(20*mm, 18*mm, 'はろーわーるど') # pdfの書き出し doc.save()
他には、Herokuで動かすため、
- Procfile
- runtime.txt
- requirements.txt
- uwsgi.ini
を用意します。
各ファイルの内容は以前記事を参考にします。
DjangoをHeroku + uWSGIで動かしてみた - メモ的な思考的な
ローカルでの動作確認
(env) $ python manage.py runserver # Adminなどのmodelは使わないため、runserver時のエラーは無視する You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them.
Herokuへデプロイ
(env) $ heroku login Enter your Heroku credentials. Email:<you@example.com> Password (typing will be hidden): <your password> Logged in as <you> (env) $ heroku create Creating app... done, ⬢ <your app> https://<your app>.herokuapp.com/ | https://git.heroku.com/<your app>.git # collectstatic不要なので、環境変数をセット (env) $ heroku config:set DISABLE_COLLECTSTATIC=1 Setting DISABLE_COLLECTSTATIC and restarting ⬢ <your ap>... done, v3 DISABLE_COLLECTSTATIC: 1 (env) $ git push heroku master ... + xxxxxx...xxxxxxx master -> master
動作確認
(env) $ heroku open
ブラウザでpdfが開き、「はろーわーるど」が表示されました。
ソースコード
GitHubに上げました。
thinkAmi-sandbox/Django_ReportLab_on_Heroku-sample