PythonのPDFライブラリ「ReportLab」の使い方(画像の埋め込み)

Pythonで使えるPDFライブラリ「ReportLab」をUbuntuで使えるようになりました。
Ubuntu 11.04 + Python + ReportLabで日本語を含むPDFファイルを生成する

すぐ忘れる脳のため、使い方を調べた内容をメモしておきます。



画像の埋め込み



PDFファイルに画像を埋め込むには、drawInlineImageを使用します。


canvas.drawInlineImage(self, image, x,y, width=None,height=None)




ちなみに、imageはPython Imaging Library (PIL)のImageオブジェクトを渡しますので、
PILを事前にインストールしておく必要があります。
※Ubuntu 11.04ではデフォルトでインストールされていました。

サンプルとして、Google Chart APIで生成したQRコードを埋め込んでみます。


# -*- coding:utf-8 -*-
import os, sys

#zipアーカイブからファイルを読み込むため。通常は必要ないはず。
sys.path.insert(0, 'reportlab.zip')

import Image
import urllib
from cStringIO import StringIO
from reportlab.pdfgen import canvas

c = canvas.Canvas("sample.pdf")

url = "http://chart.apis.google.com/chart?chs=150x150&cht=qr&chl=http://symfoware.blog68.fc2.com/"

buffer = urllib.urlopen(url).read()
image = Image.open(StringIO(buffer))

c.drawInlineImage(image, 50, 650)

#1ページ目を確定
c.showPage()

#pdfファイル生成
c.save()





実行結果

20_001_20110505224106.png





力技で一覧を作成してみる



Tableっていう便利なオブジェクトが用意されているようなのですが、勉強もかねて
今までのテクニックを使用して一覧の帳票を作成してみます。


頑張った結果がこちら。



# -*- coding:utf-8 -*-
import os, sys
import Image
import urllib2
from cStringIO import StringIO


#zipアーカイブからファイルを読み込むため。通常は必要ないはず。
sys.path.insert(0, 'reportlab.zip')

import reportlab
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

FONT_NAME = "IPA Gothic"

def create_row(c, index, data):
    
    y_shift = -120 * index
    
    #姓名
    c.setFont(FONT_NAME, 14)
    name = data['name_sei'] + u" " + data['name_mei'] + u"(" + data['kana_sei'] + u" " + data['kana_mei'] + u")"
    c.drawString(55, 720 + y_shift, name)

    c.setFont(FONT_NAME, 12)
    #電話番号
    c.drawString(55, 690 + y_shift, u"tel : " + data['tel'])
    #メール
    c.drawString(55, 675 + y_shift, u"mail : " + data['mail'])
    #メモ
    c.drawString(55, 660+ y_shift, u"メモ : " + data['note'])
    
    #QRコード貼り付け
    #DoCoMo
    c.drawInlineImage(create_docomo_qr(data), 320, 640 + y_shift)
    #SoftBank / au
    c.drawInlineImage(create_softbank_qr(data), 440, 640 + y_shift)


def create_docomo_qr(data):
    data_string = make_docomo_qr(data)
    return create_qr_image(data_string)

def create_softbank_qr(data):
    data_string = make_softbank_qr(data)
    return create_qr_image(data_string)

def create_qr_image(data_string):
    url = make_url(data_string)
    buffer_data = urllib2.urlopen(url).read()
    return Image.open(StringIO(buffer_data))

def make_docomo_qr(data):
    result = ""
    result += "MECARD:N:" + data['name_sei'] + "," + data['name_mei'] + ";"
    result += "SOUND:" + data['kana_sei'] + "," + data['kana_mei'] + ";"
    result += "TEL:" + data['tel'] + ";"
    result += "EMAIL:" + data['mail'] + ";"
    result += "NOTE:" + data['note'] + ";;"
    return result
        
def make_softbank_qr(data):
    result = ""
    result += "MEMORY:" + data['note'] + "\r\n"
    result += "NAME1:" + data['name_sei'] + " " + data['name_mei'] + "\r\n"
    result += "NAME2:" + data['kana_sei'] + " " + data['kana_mei'] + "\r\n"
    result += "TEL1:" + data['tel'] + "\r\n"
    result += "MAIL1:" + data['mail'] + "\r\n"
    return result
        
def make_url(data_string):
    urlprefix = 'http://chart.apis.google.com/chart?cht=qr&chs=120x120&chld=M|2&choe=Shift_JIS&chl='
    return urlprefix + urllib2.quote(data_string.encode('utf-8'))



def print_page(c, page_data_list):
    #タイトル描画
    c.setFont(FONT_NAME, 20)
    c.drawString(50, 795, u"モンデンキント・ジャパン")

    c.setFont(FONT_NAME, 12)

    #グリッドヘッダー設定
    xlist = [40, 320, 440, 560]
    ylist = [760, 780]
    c.grid(xlist, ylist)

    c.drawString(55, 765, u"名前 / 電話番号 / メールアドレス")
    c.drawString(355, 765, u"DoCoMo")
    c.drawString(445, 765, u"SoftBank / au")
    
    #データを描画
    for i, data in enumerate(page_data_list):
        create_row(c, i, data)

    #最後にグリッドを更新
    ylist = [40, 160, 280, 400, 520, 640, 760]
    c.grid(xlist, ylist[6 - len(page_data_list):])
    
    #ページを確定
    c.showPage()


def main():

    #フォントファイルを指定して、フォントを登録
    folder = os.path.dirname(reportlab.__file__) + os.sep + 'fonts'
    pdfmetrics.registerFont(TTFont(FONT_NAME, os.path.join(folder, 'ipag.ttf')))
    
    #出力するPDFファイル
    c = canvas.Canvas("sample.pdf")
    
    data_list = []
    #ダミーデータ読み込み
    import codecs
    f = codecs.open('dummy.txt', 'r', 'utf-8')
    for line in f:
        tmp = line.strip().split(",")
        data = {}
        data['name_sei'] = tmp[0]
        data['name_mei'] = tmp[1]
        data['kana_sei'] = tmp[2]
        data['kana_mei'] = tmp[3]
        data['tel'] = tmp[4]
        data['mail'] = tmp[5]
        data['note'] = tmp[6]
        data_list.append(data)

    
    page_data_list = []
    for data in data_list:
        page_data_list.append(data)
        if len(page_data_list) == 6:
            print_page(c, page_data_list)
            page_data_list = []
    
    if len(page_data_list) > 0:
        print_page(c, page_data_list)
    
    #pdfファイル生成
    c.save()

    print "ok."


if __name__ == '__main__':
    main()






読み込んだサンプルデータのdummy.txt


天海,春香,アマミ,ハルカ,09011110001,amami.haruka@mail.example.com,血液型O型
萩原,雪歩,サギハラ,ユキホ,09011110002,sagihara.yukiho@mail.example.com,血液型A型
水瀬,伊織,ミナセ,イオリ,09011110003,minase.iori@mail.example.com,血液型AB型
高槻,やよい,タカツキ,ヤヨイ,09011110004,takatsuki.yayoi@mail.example.com,血液型O型
菊地,真,キクチ,マコト,09011110005,kikuchi.makoto@mail.example.com,血液型O型
秋月,律子,アキズキ,リツコ,09011110006,akizuki.ritsuko@mail.example.com,血液型A型
双海,亜美,フタミ,アミ,09011110007,futami.ami@mail.example.com,血液型B型
双海,真美,フタミ,マミ,09011110008,futami.mami@mail.example.com,血液型B型
三浦,あずさ,ミウラ,アズサ,09011110009,miura.azusa@mail.example.com,血液型O型





実行結果

20_002_20110505224106.png


それっぽいPDFファイルが作成できました。









【その他のReportLabに関するURL】
Ubuntu 11.04 + Python + ReportLabで日本語を含むPDFファイルを生成する
PythonのPDFライブラリ「ReportLab」の使い方(用紙サイズ、向き、文字出力、改ページ)
PythonのPDFライブラリ「ReportLab」の使い方(直線、矩形、円、楕円、丸囲みの矩形の描画)
PythonのPDFライブラリ「ReportLab」の使い方(表描画、線・塗りつぶしの色、線の太さ、破線の指定)



[QRコードは(株)デンソーウェーブの登録商標です]
関連記事

コメント

非公開コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
Symfoware まとめ

PR




検索フォーム

月別アーカイブ