wiki:djang_trml2pdf

tRMLを使ってテンプレートでPDFを生成する(古い方, django_trml2pdf版)

(2010/03/01 ymasuda)

注意: django_trml2pdf は、template2pdf.django に移行しました -- 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 django_trml2pdf でインストールできます。 ソースコードからインストールするには、

svn checkout http://template2pdf.googlecode.com/svn/tags/pre_django_trml2pdf_removal/django_trml2pdf

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

# coding: utf-8

from django.http import HttpResponse
from django_trml2pdf import direct_to_pdf

from django.shortcuts import render_to_response

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

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

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

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