Django のレスポンスを PDF で

Django を使う理由がもうひとつ増えました。@whosaysni (Yasushi Masuda) さんが、template2pdf というテンプレートから簡単に PDF を生成する Django アプリケーションを公開されています。主な特徴は以下の通りです。

  • ReportLab がオープンソースで公開している PDF ライブラリーを利用
  • 同 ReportLab が作成した Report Markup Language (略: rml) (仕様: PDF ) により、PDF ファイルを XML で定義
  • XML で定義できるので、Django の強力なテンプレートシステムが使える
  • rml -> pdf 変換は Rohit Sankaran 氏が公開している trml2pdf を利用

インストール

すべて setuptools でインストール可能です

利用方法

settings.py の INSTALLED_APPS への追加と、環境に応じて日本語用フォントを設定。

# settings.py
INSTALLED_APPS = (
    # django built-in apps
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    # external apps
    'django_trml2pdf', # thx 2 Yasushi Masuda
    # (以下省略)
}

# set unicode fonts for trml2pdf \
#   (see django_trml2pdf.__init__.py PRELOAD_FONTS)
TRML2PDF_PRELOAD_FONTS = [
    (None, [('UnicodeCIDFont', 'HeiseiKakuGo-W5', None, None)]),
    (None, [('UnicodeCIDFont', 'HeiseiMin-W3', None, None)]),
    ('IPA Mincho', [('TTFont', 'IPA Mincho', 'fonts/ipam.ttf', None),
    ('TTFont', 'IPA Mincho', 'fonts/ipam.ttf', None),
    ('TTFont', 'IPA Mincho', 'fonts/ipam.ttf', None),
    ('TTFont', 'IPA Mincho', 'fonts/ipam.ttf', None),]),
    (None, [('TTFont', 'IPA Gothic', 'fonts/ipag.ttf', None)]),
    (None, [('TTFont', 'IPA PMincho', 'fonts/ipapm.ttf', None)]),
    (None, [('TTFont', 'IPA PGothic', 'fonts/ipapg.ttf', None)]),
]

表示してみる

urls.py に以下のように追加すると使えます。

urlpatterns = patterns('django_trml2pdf',
    (r'^foo/$',
        'direct_to_pdf', {'template': 'trml2pdf/base.rml'}),
)

もちろん views.py の中でも使えます。使い方はアクセンスさんの オーメイク おまけ ページに記載されています。日本語を含むユニコードも問題なく使えます (もちテンプレートファイルはユニコードで作成)。おかげさまで帳票アプリケーションが簡単に作れるようになりましたね!

多謝: Yasushi Masuda さん

日本語の取り扱いについて (追記)

PDF で日本語を表示したい場合は、フォントを PDF ファイル内に内包するか、PDF 標準フォントを指定する必要があります。フォントを PDF に埋め込むと色々とめんどい。

  • 内包 = フォントのデータの分だけ、サイズがでかくなる
  • 配布時のライセンス問題 (フォントはホスト毎にライセンシングされてるのがほとんど

ということで PDF 標準フォントを指定しましょう。trml2pdf/base.rml ファイルで "Serif" って指定されている箇所を settings.py に記載した "HeiseiKakuGo-W5" か "HeiseiMin-W3" に変更します。また、base.rml ファイルに以下のように記述し、利用するフォントを埋め込みます。

<!DOCTYPE document SYSTEM "rml.dtd">
{% load pdf_tags %}
<document filename="{{ pdf_name }}">
  <docinit>
    <registerCidFont faceName="HeiseiKakuGo-W5"/>
    <!-- OR / AND -->
    <registerCidFont faceName="HeiseiMin-W3"/>
  </docinit>
  {% block template %}
<!-- 以下省略 -->

コメント

このブログの人気の投稿

Python から Win32 API 経由で印刷する

財務諸表 (Financial Statements)

Django と Python 3 - #python_adv