Django + ReportLabをHerokuで動かしてpdfを表示する

最近、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が開き、「はろーわーるど」が表示されました。

f:id:thinkAmi:20170114072442p:plain

 

ソースコード

GitHubに上げました。
thinkAmi-sandbox/Django_ReportLab_on_Heroku-sample