wiki:template2pdf

tRMLを使ってテンプレートでPDFを生成する

Kay-framework を使った  デモのページ を作成しました。

django_trml2pdf を使った、古い方のページは こちら

注意: django_trml2pdf は、 template2pdf パッケージに統合されました。 -- 2010/03/03 ymasuda

このところ帳票を作るコードを扱っています。DjangoでPDF...というと、!ReportLabで platypus のコードを 頑張って書いている人、結構いるんじゃないでしょうか。あれは大変ですね。ちょっと変更するたびに、 Pythonコードをいじらなきゃいけない。テーブルの構成とかレイアウトを組み替えるときなんか、すごく大変。 それに、値をいちいちいちいちいちいちいちいち文字列に変える処理を書いていると、とっても疲れます。 表示の部分は、やっぱりテンプレートでカバーしたいですよね。

そこで、 trml2pdf という LGPL のライブラリを使ってみました。trml2pdf は、tRML というXMLの ドキュメントからPDF を生成してくれます。tRML は有償版の ReportLab PLUS がサポートしている RML のサブセットで、RMLの基本的なほんの一部だけを実装したものです。Djangoのテンプレートなら、 XMLの出力はおてのもの。テンプレートからtRMLを生成して、そのままtrml2pdfに通せば、PDFを 動的に生成できます。というわけで、簡単なテンプレートtoPDFライブラリを作ってみました。

 http://code.google.com/p/template2pdf/ で公開しています。 LGPL ライセンス。

PyPI にも egg を登録してあるので、 easy_install template2pdf でインストールできます。 ソースコードからインストールするには、

svn checkout http://template2pdf.googlecode.com/svn/trunk/template2pdf

で取り出してください。

Django で使う

template2pdf.dj を djangoのアプリケーションとしてインストールして (INSTALLED_APPS に入れて) 使います。ビューを書くとこんな感じです:

# coding: utf-8

from django.http import HttpResponse
from template2pdf.dj import direct_to_pdf

def myview(request, template_name='trml2pdf/mytemplate.rml'):
    params = {}
    return HttpResponse(
        direct_to_pdf(request, template_name, params),
        mimetype='application/pdf')

テンプレートのtRMLの書き方は、template2pdf/django/templates/base.rml や、ReportLab のRMLガイドを読んでもらえれば だいたいおわかり頂けると思います。Djangoのテンプレートだから、もちろん継承も{% include %}も{% trans %} もできます。cool!

素の trml2pdf は、フォントをロードする機能がなかったり、日本語のワードラップに対応していません。 django_trml2pdf では、settings にフォント情報を指定しておくことで、初期化時にフォントをロードしてくれます。 また、画像を埋め込みたいときなどに、画像の絶対パスを解決してくれる {% pdf_resource %} タグも用意しておきました。 Enjoy!

Google App Engine (Kay-Framework)で使う

Google App Engine 上の Kay-Framework もサポートしています。 使い方もほぼ同じで、 template2pdf.kfw を Kay の settings.INSTALLED_APPS に追加して使います。注意して欲しいのは、 Kay が使っているテンプレートエンジンは Jinja2 だと いうことです。ほとんど同じだけど、ちょっと違う。templates/base.rml は、 Jinja2 に合わせて書き換えてあります。 また、 {% pdf_resource %} の代わりに、 {{ pdf_resource(...) }} を使ってください。

そうそう、このプロジェクトを手伝ってくれる人募集。ご興味をお持ちの方は whosaysni at twitter まで連絡ください。