2011年3月11日金曜日

Django + PythonでPDF作成

1.インストール
easy_install -U reportlab

2.実行
from reportlab.pdfgen import canvas
from django.http import HttpResponse

def some_view(request):
    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'
    p = canvas.Canvas(response)

    #帳票レイアウト描画
    p.drawString(100, 100, "Hello world.")

    p.showPage()
    p.save()
    return response

PDFレイアウトをちまちま書いていくのは大変なので、
テンプレート画像を読み込んで、そこに記入していく方式をとってみる。

from reportlab.pdfgen import canvas
#!/user/bin/env python
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from reportlab.pdfgen import canvas  
from reportlab.lib.units import mm  

# Create your views here.
def sample1(request):
 response = HttpResponse(mimetype='application/pdf')
 #response['Content-Disposition'] = 'attachment; filename=c:\\tmp\\somefilename.pdf'
 response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'
 p = canvas.Canvas(response)

 #テンプレート読み込み(A4サイズ[595x841], テンプレートサイズ[453x785])
 _lft = 30
 _top = 10
 _rit = 20
 _btm = 10
 _wid = 210 - _lft - _rit
 _hei = 297 - _top - _btm
 p.drawInlineImage("c:\\tmp\\test.png", 
   _lft*mm,
   _btm*mm,
#   width=_wid*mm,
#   height=_hei*mm,
#   preserveAspectRatio=True
 )

 #記入項目
 p.drawString(0*mm, 0*mm, "Hello world1.")
 p.drawString(40*mm, 100*mm, "Hello world2.")
 p.drawString(40*mm, 200*mm, "width=%d, height=%d" % (_wid*mm, _hei*mm))
    
 p.showPage()
 p.save()
 return response

これで仕上がったPDFを印刷してみるとわかるけど、
テンプレート内に入っている文字はドットが荒くなるので、
線の枠組みだけテンプレートに書いて、文字は別途挿入した方がいい。

あとテンプレートのサイズはソースコード内に記述したサイズにすると
原寸大で描画できる。


参照リンク
http://docs.nullpobug.com/django-doc-ja/trunk/howto/outputting-pdf.html
http://d.hatena.ne.jp/piro_suke/20070704/1183561248
http://tt-house.com/2009/12/python-reportlab-pdf.html
コメントを投稿

Androider