PDF生成 (ReportLab) | Python-izm

PDF生成 (ReportLab)

PythonにおけるPDF生成方法はさまざまですが、日本語の使用を前提とした場合、比較的古くからあり、実績のあるライブラリはReportLabです。

ReportLabのインストール

下記コマンドを入力しReportLabをインストールしてください。
※これはpipがインストールされていることを前提としています。インストールしていない場合はpipの使い方とインストールを参照してください。

pip install reportlab

PDF生成例

次の例は、文字列、線、配色の指定などを行ったPDFを生成したものです。

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.lib.units import cm


pdfFile = canvas.Canvas('./python.pdf')
pdfFile.saveState()

pdfFile.setAuthor('python-izm.com')
pdfFile.setTitle('PDF生成')
pdfFile.setSubject('サンプル')

# A4
pdfFile.setPageSize((21.0*cm, 29.7*cm))
# B5
# pdfFile.setPageSize((18.2*cm, 25.7*cm))

pdfFile.setFillColorRGB(0, 0, 100)
pdfFile.rect(2*cm, 2*cm, 6*cm, 6*cm, stroke=1, fill=1)
pdfFile.setFillColorRGB(0, 0, 0)

pdfFile.setLineWidth(1)
pdfFile.line(10*cm, 20*cm, 10*cm, 10*cm)

pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5'))
pdfFile.setFont('HeiseiKakuGo-W5', 12)
pdfFile.drawString(5*cm, 25*cm, 'あいうえおー')

pdfFile.restoreState()
pdfFile.save()

作業ディレクトリへ次のようなPDFファイルpython.pdfが生成されます。


まずは1行目から4行目で必要なものをインポートし、7行目でファイルを生成するパスを指定します。

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.lib.units import cm


pdfFile = canvas.Canvas('./python.pdf')
pdfFile.saveState()

pdfFile.setAuthor('python-izm.com')
pdfFile.setTitle('PDF生成')
pdfFile.setSubject('サンプル')

# A4
pdfFile.setPageSize((21.0*cm, 29.7*cm))
# B5
# pdfFile.setPageSize((18.2*cm, 25.7*cm))

pdfFile.setFillColorRGB(0, 0, 100)
pdfFile.rect(2*cm, 2*cm, 6*cm, 6*cm, stroke=1, fill=1)
pdfFile.setFillColorRGB(0, 0, 0)

pdfFile.setLineWidth(1)
pdfFile.line(10*cm, 20*cm, 10*cm, 10*cm)

pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5'))
pdfFile.setFont('HeiseiKakuGo-W5', 12)
pdfFile.drawString(5*cm, 25*cm, 'あいうえおー')

pdfFile.restoreState()
pdfFile.save()

10行目から12行目でファイル情報をセットしています。これは省略可能ですが、設定しておけばファイルのプロパティより情報を見る事が出来ます。そして15行目でPDFファイルのサイズを指定しています。A4サイズで生成していますが、B5も載せておきました。

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.lib.units import cm


pdfFile = canvas.Canvas('./python.pdf')
pdfFile.saveState()

pdfFile.setAuthor('python-izm.com')
pdfFile.setTitle('PDF生成')
pdfFile.setSubject('サンプル')

# A4
pdfFile.setPageSize((21.0*cm, 29.7*cm))
# B5
# pdfFile.setPageSize((18.2*cm, 25.7*cm))

pdfFile.setFillColorRGB(0, 0, 100)
pdfFile.rect(2*cm, 2*cm, 6*cm, 6*cm, stroke=1, fill=1)
pdfFile.setFillColorRGB(0, 0, 0)

pdfFile.setLineWidth(1)
pdfFile.line(10*cm, 20*cm, 10*cm, 10*cm)

pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5'))
pdfFile.setFont('HeiseiKakuGo-W5', 12)
pdfFile.drawString(5*cm, 25*cm, 'あいうえおー')

pdfFile.restoreState()
pdfFile.save()

19行目と20行目で生成されたファイルの下部にある青色の四角形を描画し、21行目で色設定を元に戻しています。さらに23行目で線の太さを設定し、24行目で線を描画しています。これは生成ファイルの中央部にある線に該当します。

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.lib.units import cm


pdfFile = canvas.Canvas('./python.pdf')
pdfFile.saveState()

pdfFile.setAuthor('python-izm.com')
pdfFile.setTitle('PDF生成')
pdfFile.setSubject('サンプル')

# A4
pdfFile.setPageSize((21.0*cm, 29.7*cm))
# B5
# pdfFile.setPageSize((18.2*cm, 25.7*cm))

pdfFile.setFillColorRGB(0, 0, 100)
pdfFile.rect(2*cm, 2*cm, 6*cm, 6*cm, stroke=1, fill=1)
pdfFile.setFillColorRGB(0, 0, 0)

pdfFile.setLineWidth(1)
pdfFile.line(10*cm, 20*cm, 10*cm, 10*cm)

pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5'))
pdfFile.setFont('HeiseiKakuGo-W5', 12)
pdfFile.drawString(5*cm, 25*cm, 'あいうえおー')

pdfFile.restoreState()
pdfFile.save()

26行目から28行目で、ファイル上部の文字を描画しています。最後に生成ファイルを保存して終了となります。

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.lib.units import cm


pdfFile = canvas.Canvas('./python.pdf')
pdfFile.saveState()

pdfFile.setAuthor('python-izm.com')
pdfFile.setTitle('PDF生成')
pdfFile.setSubject('サンプル')

# A4
pdfFile.setPageSize((21.0*cm, 29.7*cm))
# B5
# pdfFile.setPageSize((18.2*cm, 25.7*cm))

pdfFile.setFillColorRGB(0, 0, 100)
pdfFile.rect(2*cm, 2*cm, 6*cm, 6*cm, stroke=1, fill=1)
pdfFile.setFillColorRGB(0, 0, 0)

pdfFile.setLineWidth(1)
pdfFile.line(10*cm, 20*cm, 10*cm, 10*cm)

pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5'))
pdfFile.setFont('HeiseiKakuGo-W5', 12)
pdfFile.drawString(5*cm, 25*cm, 'あいうえおー')

pdfFile.restoreState()
pdfFile.save()