PythonのPDFライブラリ「ReportLab」の使い方(用紙サイズ、向き、文字出力、改ページ)
Pythonで使えるPDFライブラリ「ReportLab」をUbuntuで使えるようになりました。Ubuntu 11.04 + Python + ReportLabで日本語を含むPDFファイルを生成する
すぐ忘れる脳のため、使い方を調べた内容をメモしておきます。
基本的な形
# -*- coding:utf-8 -*-
import os, sys
#zipアーカイブからファイルを読み込むため。通常は必要ないはず。
sys.path.insert(0, 'reportlab.zip')
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
fontname = "IPA Gothic"
#フォントファイルを指定して、フォントを登録
pdfmetrics.registerFont(TTFont(fontname, './reportlab.zip/reportlab/fonts/ipag.ttf'))
c = canvas.Canvas("hello.pdf")
c.setFont(fontname, 10)
c.drawString(100, 675, u"日本語でこんにちは!")
c.showPage()
c.save()
print "ok."
生成されるPDF

用紙サイズの指定
デフォルトでは、A4縦になります。
用紙サイズを指定するには、reportlab.lib.pagesizesで定義されている用紙サイズを
Canvas作成時に指定します。
定義済みの用紙サイズは以下のとおり。
A6
A5
A4
A3
A2
A1
A0
B6
B5
B4
B3
B2
B1
B0
LETTER
LEGAL
ELEVENSEVENTEEN
用紙サイズにA0を指定してみました。
# -*- coding:utf-8 -*-
import os, sys
#zipアーカイブからファイルを読み込むため。通常は必要ないはず。
sys.path.insert(0, 'reportlab.zip')
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.pagesizes import A0
fontname = "IPA Gothic"
#フォントファイルを指定して、フォントを登録
pdfmetrics.registerFont(TTFont(fontname, './reportlab.zip/reportlab/fonts/ipag.ttf'))
#用紙サイズにA0を指定
c = canvas.Canvas("hello.pdf", pagesize=A0)
c.setFont(fontname, 10)
c.drawString(100, 675, u"日本語でこんにちは!")
c.showPage()
c.save()
print "ok."
ちょっと分かりにくいですが、用紙が大きくなっていることが確認できました。

用紙向きの指定
用紙の向きを変更するには、reportlab.lib.pagesizesにあるlandscapeとportraitを使います。
landscape:横向き
portrait:縦向き
A4横でPDFを作成するサンプルはこんな感じになります。
# -*- coding:utf-8 -*-
import os, sys
#zipアーカイブからファイルを読み込むため。通常は必要ないはず。
sys.path.insert(0, 'reportlab.zip')
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.pagesizes import A4, landscape, portrait
fontname = "IPA Gothic"
#フォントファイルを指定して、フォントを登録
pdfmetrics.registerFont(TTFont(fontname, './reportlab.zip/reportlab/fonts/ipag.ttf'))
c = canvas.Canvas("hello.pdf", pagesize=landscape(A4))
c.setFont(fontname, 10)
c.drawString(100, 375, u"日本語でこんにちは!")
c.showPage()
c.save()
print "ok."
出力されたPDFは以下のとおり。

文字の出力
Canvasに対して、drawStringを実行します。
座標の意味ですが・・・
c.drawString(0, 0, u"日本語でこんにちは!")

c.drawString(100, 0, u"日本語でこんにちは!")

c.drawString(0, 100, u"日本語でこんにちは!")

用紙左下を原点として、第一引数がX(横)、第二引数がY(縦)の指定となります。
用紙の左上を原点としたい場合には、Canvas作成時、bottomup=Falseを指定します。
まず、bottomup=True(デフォルト)の場合
# -*- coding:utf-8 -*-
import os, sys
#zipアーカイブからファイルを読み込むため。通常は必要ないはず。
sys.path.insert(0, 'reportlab.zip')
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.pagesizes import A4, landscape, portrait
fontname = "IPA Gothic"
#フォントファイルを指定して、フォントを登録
pdfmetrics.registerFont(TTFont(fontname, './reportlab.zip/reportlab/fonts/ipag.ttf'))
c = canvas.Canvas("hello.pdf", bottomup=True)
c.setFont(fontname, 10)
c.drawString(100, 100, u"日本語でこんにちは!")
c.showPage()
c.save()
print "ok."
左下が原点です。

次に、bottomup=Falseを指定してみます。
# -*- coding:utf-8 -*-
import os, sys
#zipアーカイブからファイルを読み込むため。通常は必要ないはず。
sys.path.insert(0, 'reportlab.zip')
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.pagesizes import A4, landscape, portrait
fontname = "IPA Gothic"
#フォントファイルを指定して、フォントを登録
pdfmetrics.registerFont(TTFont(fontname, './reportlab.zip/reportlab/fonts/ipag.ttf'))
c = canvas.Canvas("hello.pdf", bottomup=False)
c.setFont(fontname, 10)
c.drawString(100, 100, u"日本語でこんにちは!")
c.showPage()
c.save()
print "ok."
左上が原点になりました。

改ページ
showPageで、それまでにCanvasに対して行った操作を確定し、ページ作成。
saveでPDFファイルの実体を作成となります。
簡単な改ページのサンプルはこんな感じ。
# -*- coding:utf-8 -*-
import os, sys
#zipアーカイブからファイルを読み込むため。通常は必要ないはず。
sys.path.insert(0, 'reportlab.zip')
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.pagesizes import A4, landscape, portrait
fontname = "IPA Gothic"
#フォントファイルを指定して、フォントを登録
pdfmetrics.registerFont(TTFont(fontname, './reportlab.zip/reportlab/fonts/ipag.ttf'))
c = canvas.Canvas("hello.pdf")
#1ページ目開始
c.setFont(fontname, 10)
c.drawString(100, 700, u"1ページ")
#1ページ目を確定
c.showPage()
#2ページ目開始
c.setFont(fontname, 10)
c.drawString(100, 700, u"2ページ")
#2ページ目を確定
c.showPage()
#pdfファイル生成
c.save()
print "ok."
実行してみると、ちゃんと改ページされています。


2ページ目を開始するとき、
#2ページ目開始
c.setFont(fontname, 10)
としてフォントを再指定していますが、これを行わないと、

2ページ目だけ、文字化けしてしまいます。
showPageを実行した後、フォントを再指定する必要があるようです。
- 関連記事
-
- PythonのPDFライブラリ「ReportLab」の使い方(表描画、線・塗りつぶしの色、線の太さ、破線の指定)
- PythonのPDFライブラリ「ReportLab」の使い方(直線、矩形、円、楕円、丸囲みの矩形の描画)
- PythonのPDFライブラリ「ReportLab」の使い方(用紙サイズ、向き、文字出力、改ページ)
- Ubuntu 11.04 + Python + ReportLabで日本語を含むPDFファイルを生成する
- Pythonで一時ファイル作成(tempfile)
コメント