PythonでPDFを自動生成したい、でも何から始めればいいか分からない・・・。そんな方におすすめなのが、Pythonの強力なPDFライブラリ「reportlab」です。本記事では、reportlabを使ったPDFの自動生成を、インストールからグラフ描画、セキュリティ設定まで、初心者向けに徹底解説します。Pythonでの帳票自動化を目指すエンジニア必見の内容です!
- reportlabのインストール方法と日本語フォントの設定
- PDFへのテキスト、画像、テーブルの描画方法
- ページ番号・目次の自動追加とテンプレート活用のコツ
- グラフ描画やセキュリティ設定などの高度な機能の使い方
- reportlabを使った業務の自動化・効率化のヒント
reportlabとは?Pythonでの利用メリットを解説
PythonでPDF帳票を自動生成したい、そんな要望にお応えするのがreportlabです。reportlabは、Pythonで最も広く使われているPDF生成ライブラリの1つで、豊富な機能と高い柔軟性を兼ね備えています。
reportlabの概要と特徴
reportlabは、PDFファイルの新規作成はもちろん、既存PDFの読み込みや編集もサポートしています。テキスト、図形、画像などを自在にPDF上に描画できるほか、TrueTypeやOpenTypeなど多様なフォント形式に対応。段組みやテーブル、リストといったレイアウト機能も充実しています。
さらにグラフ、チャート、バーコードの生成機能を標準で備えているのもreportlabの大きな特長です。また、PDF/Aや暗号化など、PDFの高度な機能もサポートされています。
PythonでreportlabによるPDF生成のメリット
reportlabを使えば、手作業でのPDF作成から開放され、業務の自動化・効率化が可能になります。プログラムによる柔軟な制御で、ニーズに合ったPDFを生成できるのも大きなメリットです。Python経験者なら比較的容易に習得・活用できるのも魅力と言えるでしょう。
以下は、reportlabを使ったシンプルなPDF生成のサンプルコードです。
from reportlab.pdfgen import canvas
# PDFファイルを新規作成
c = canvas.Canvas("sample.pdf")
# テキストを描画
c.drawString(100, 700, "Hello, World!")
# ページを確定し、PDFファイルを保存
c.showPage()
c.save()

必要なフォントサイズや座標、画像のサイズを指定するだけで、目的のレイアウトが実現できます。
reportlabは日本語にも対応しています。ただし、デフォルトのフォントには日本語グリフが含まれないため、日本語対応フォント(IPAフォントなど)を用意し、PDFに埋め込む必要があります。
このように、reportlabはPythonでのPDF生成に幅広く活用できるライブラリです。それでは、まずはreportlabのインストール方法から見ていきましょう。
reportlabをインストールする方法
それでは、reportlabのインストール方法を見ていきましょう。reportlabは、以下のpipコマンドを実行することで簡単にインストールできます。
pip install reportlabの実行
pip install reportlab
reportlabは、Python 2.7以降、または3.5以降のバージョンで動作しますが、特にPython 3.7以降を推奨とのことです。お使いのPython環境に合わせて、適切なバージョンをインストールしてください。
また、インストール時に以下のようなエラーが発生する場合があります。
- pipコマンドを認識できない→PythonのPathが通っているかを確認しましょう。
- Pillow(PIL)モジュールのインストールエラー→別途Pillowをインストールする必要があります。
日本語フォントのインストールと埋め込み設定
reportlabでは、デフォルトでは日本語フォントが含まれていません。日本語を扱う場合は、以下の手順で日本語フォントをインストールし、PDFに埋め込む設定を行います。
- IPAフォントなどの日本語対応フォントをダウンロードし、任意のフォルダに配置します。
- 以下のようなコードでフォントを登録し、PDFに埋め込みます。
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
# フォントを登録
pdfmetrics.registerFont(TTFont('IPAGothic', 'ipaexg.ttf'))
# フォントを指定してテキストを描画
c.setFont('IPAGothic', 12)
c.drawString(100, 500, 'これは日本語テキストの例です。')
ここでは、IPAゴシックフォントを例に説明しましたが、他の日本語フォントでも同様の手順で設定できます。
以下は、日本語フォントの埋め込み設定を含む、より詳細なreportlabのサンプルコードです。
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.pagesizes import A4, portrait
from reportlab.lib.units import mm
# フォントを登録
pdfmetrics.registerFont(TTFont('IPAGothic', 'ipaexg.ttf'))
# PDFを新規作成。用紙サイズを指定
c = canvas.Canvas("japanese_sample.pdf", pagesize=portrait(A4))
# 日本語フォントを指定してテキストを描画
c.setFont('IPAGothic', 12)
c.drawString(50*mm, 270*mm, 'これは日本語による描画のテストです。')
c.drawString(50*mm, 260*mm, 'フォントサイズを変更したり、')
c.setFont('IPAGothic', 16)
c.drawString(50*mm, 250*mm, '位置を調整するのも自在です。')
# ページを確定し、PDFファイルを保存
c.showPage()
c.save()

フォントファイルが見つからないエラーが発生する場合は、フォントファイルのパスが正しいかを確認してください。
以上で、reportlabのインストールと日本語フォントの設定方法についての解説は終わりです。次は、reportlabを使った基本的なPDF生成方法について見ていきましょう。
reportlabによる基本的なPDF生成方法
インストールが完了したら、早速reportlabを使ってPDFファイルを生成してみましょう。ここでは、PDFファイルの新規作成、テキストの描画、画像の埋め込みについて解説します。
PDFファイルの作成とページ追加
PDFファイルを新規作成するには、以下のようにCanvasクラスのコンストラクタにファイル名を指定します。
from reportlab.pdfgen import canvas
# PDFファイルを新規作成
c = canvas.Canvas("sample.pdf")
# ページを追加
c.showPage()
c.save()
showPageメソッドでページを確定し、saveメソッドでPDFファイルを保存します。これだけで、空のPDFファイルが生成されます。
文字の描画(フォント、サイズ、色の指定)
PDFにテキストを描画するには、以下のようにします。
# フォントとサイズを指定
c.setFont("Helvetica", 20)
# 描画位置を指定してテキストを描画
c.drawString(100, 700, "Hello, World!")
# 色を指定してテキストを描画
c.setFillColorRGB(1, 0, 0) # 赤色
c.drawString(100, 650, "This is red text.")
setFontメソッドでフォントとサイズを指定し、drawStringメソッドで描画位置とテキスト内容を指定して描画します。色を指定する場合は、setFillColorRGBメソッドを使用します。
画像の埋め込み方法
画像を埋め込むには、以下のようにdrawImageメソッドを使用します。
# 画像を描画
c.drawImage("python-logo.png", 100, 500, width=100, height=100)
画像ファイル名、描画位置、サイズを指定することで、PDFに画像を埋め込むことができます。
以下は、これらを組み合わせた基本的なPDF生成のサンプルコードです。
from reportlab.pdfgen import canvas
# PDFファイルを新規作成
c = canvas.Canvas("sample.pdf")
# テキストを描画
c.setFont("Helvetica", 20)
c.drawString(100, 700, "Hello, World!")
# 色を指定してテキストを描画
c.setFillColorRGB(1, 0, 0)
c.drawString(100, 650, "This is red text.")
# 画像を描画
c.drawImage("python-logo.png", 100, 500, width=100, height=100)
# ページを確定し、PDFファイルを保存
c.showPage()
c.save()
このコードを実行すると、以下のようなPDFファイルが生成されます。
- “Hello, World!”というテキストが描画されている。
- “This is red text.”という赤色のテキストが描画されている。
- Python logoの画像が指定のサイズで埋め込まれている。
以上が、reportlabを使った基本的なPDF生成方法です。テキストや画像の配置を調整することで、より複雑なレイアウトも実現できます。
次は、reportlabを使った実用的なPDF自動生成のTipsを見ていきましょう。
reportlabを使った実用的なPDF自動生成Tips
reportlabを使えば、より実用的なPDFの自動生成が可能です。ここでは、テーブルデータの埋め込み、ページ番号の自動追加、目次の自動生成、テンプレートの活用といったTipsを紹介します。
テーブルデータの埋め込み方法
Tableクラスを使うことで、PDFにテーブルを埋め込むことができます。以下は、テーブルデータを埋め込むサンプルコードです。
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
# テーブルデータを準備
data = [
['商品名', '価格', '在庫'],
['商品A', '1000円', '100個'],
['商品B', '2000円', '50個'],
['商品C', '3000円', '30個'],
]
# テーブルスタイルを設定
style = TableStyle([
('BACKGROUND', (0, 0), (-1, 0), colors.grey),
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
('FONTSIZE', (0, 0), (-1, 0), 14),
('BOTTOMPADDING', (0, 0), (-1, 0), 12),
('BACKGROUND', (0, 1), (-1, -1), colors.beige),
('TEXTCOLOR', (0, 1), (-1, -1), colors.black),
('ALIGN', (0, 1), (-1, -1), 'LEFT'),
('FONTNAME', (0, 1), (-1, -1), 'Helvetica'),
('FONTSIZE', (0, 1), (-1, -1), 12),
('TOPPADDING', (0, 1), (-1, -1), 6),
('BOTTOMPADDING', (0, 1), (-1, -1), 6),
('GRID', (0, 0), (-1, -1), 1, colors.black),
])
# PDFを生成
def generate_pdf(filename, data):
pdf = SimpleDocTemplate(filename, pagesize=A4)
table = Table(data)
table.setStyle(style)
pdf.build([table])
generate_pdf("table.pdf", data)
TableStyleクラスを使ってテーブルのスタイルを詳細に設定できるのが特徴です。
ページ番号や目次の自動追加
ページ番号は、CanvasクラスのdrawPageNumberメソッドを使って自動的に追加できます。
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
def generate_pdf(filename):
pdf = canvas.Canvas(filename, pagesize=A4)
# ページ数を取得
page_count = pdf.getPageNumber()
for i in range(1, page_count + 1):
# ページ番号を描画
pdf.drawPageNumber(550, 20, i, page_count)
# 改ページ
pdf.showPage()
pdf.save()
generate_pdf("page_numbers.pdf")
目次は、ParagraphクラスとPageBreakクラスを使って自動生成できます。
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Paragraph, PageBreak
from reportlab.lib.styles import getSampleStyleSheet
def generate_pdf(filename, toc_data):
pdf = SimpleDocTemplate(filename, pagesize=A4)
styles = getSampleStyleSheet()
story = []
# 目次を追加
story.append(Paragraph("目次", styles["Heading1"]))
for chapter, page in toc_data:
story.append(Paragraph(f"{chapter}・・・{page}", styles["Normal"]))
story.append(PageBreak())
# 本文を追加
for chapter, page in toc_data:
story.append(Paragraph(chapter, styles["Heading2"]))
story.append(Paragraph("本文のサンプルテキストです。" * 20, styles["Normal"]))
story.append(PageBreak())
pdf.build(story)
toc_data = [
("第1章 はじめに", 1),
("第2章 本論", 2),
("第3章 結論", 4),
]
generate_pdf("toc.pdf", toc_data)
テンプレートの活用によるPDF生成の効率化
定型フォーマットのPDFを大量に生成する場合、テンプレートを活用することで効率化できます。
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.styles import getSampleStyleSheet
def generate_pdf(filename, template_data):
pdf = SimpleDocTemplate(filename, pagesize=A4)
styles = getSampleStyleSheet()
story = []
# テンプレートを適用
for text in template_data:
story.append(Paragraph(text, styles["Normal"]))
pdf.build(story)
template_data = [
"これは報告書のテンプレートです。",
"以下のセクションを記入してください。",
"1. はじめに",
"2. 調査方法",
"3. 結果",
"4. 考察",
"5. 結論",
]
generate_pdf("template.pdf", template_data)
テンプレートとなるテキストデータを用意し、それを元にPDFを生成するだけなので、非常に簡潔に記述できます。
以上のように、reportlabには実用的なPDF生成に役立つ様々な機能が用意されています。他のPDFライブラリと比べても、レイアウトの柔軟性や出力の美しさは特に優れているでしょう。
ただし、一方でreportlabはローレベルなライブラリなので、多少のPythonスキルは必要になります。より簡易に利用したい場合は、reportlabをラップしたものや、他のハイレベルなPDFライブラリの利用も検討してみてください。
次は、reportlabのさらに高度な機能について見ていきましょう。
reportlabのさらに高度な機能の紹介
ここまでは、reportlabの基本的な使い方や実用的なTipsを見てきました。最後に、reportlabのさらに高度な機能について紹介しましょう。
グラフ・チャートの描画方法
reportlabのgraphicsモジュールを使うと、様々なグラフやチャートを描画できます。以下は、棒グラフを描画するサンプルコードです。
from reportlab.graphics.shapes import Drawing
from reportlab.graphics.charts.barcharts import VerticalBarChart
from reportlab.lib.pagesizes import A4
from reportlab.graphics import renderPDF
data = [
(2010, 1000, 1500),
(2011, 1500, 1800),
(2012, 1800, 2000),
(2013, 2000, 2500),
]
drawing = Drawing(400, 200)
chart = VerticalBarChart()
chart.x = 50
chart.y = 50
chart.width = 300
chart.height = 125
chart.data = data
chart.valueAxis.valueMin = 0
chart.valueAxis.valueMax = 3000
chart.valueAxis.valueStep = 500
chart.categoryAxis.labels.boxAnchor = 'ne'
chart.categoryAxis.labels.dx = 8
chart.categoryAxis.labels.dy = -2
chart.categoryAxis.labels.angle = 30
drawing.add(chart)
renderPDF.drawToFile(drawing, "barchart.pdf", "Bar Chart Example")

このように、VerticalBarChartクラスを使って棒グラフのプロパティを設定し、Drawingクラスに追加することで、PDFにグラフを描画できます。
暗号化やパスワード保護での高セキュリティPDF生成
canvas.CanvasクラスのsetEncryptメソッドを使うと、暗号化やパスワード保護を設定できます。
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
def generate_secured_pdf(filename, password):
pdf = canvas.Canvas(filename, pagesize=A4)
# 暗号化とパスワード保護を設定
pdf.setEncrypt(password)
pdf.drawString(100, 500, "This is a secured PDF.")
pdf.showPage()
pdf.save()
generate_secured_pdf("secured.pdf", "password")
機密情報を含むPDFを生成する場合などに活用できるでしょう。
その他、reportlabにはPDF/A準拠のPDF生成、フォームの作成と処理、バーコード・QRコードの生成、PDFの結合・分割、テキスト抽出、注釈の追加など、高度な機能が数多く用意されています。用途に応じて、これらの機能を組み合わせることで、より洗練されたPDFを生成することが可能です。
まとめ:reportlabを使いこなしてPDF自動生成を効率化しよう!
以上、reportlabを使ったPDF自動生成の基本から応用までを見てきました。reportlabは、Pythonでの本格的なPDF生成を実現する強力なライブラリです。基本的な使い方をマスターすれば、高品質なPDFを簡単に自動生成できるでしょう。
実際のビジネスシーンでは、大量の帳票やレポート生成が求められるケースも多いはず。そんな時は、ぜひreportlabの出番です。本記事で紹介したテクニックを応用し、業務の自動化・効率化を図ってみてください。
今回の内容を一通り理解したら、次のステップとしておすすめなのは、実際の業務を想定した、より実践的なPDFの自動生成に挑戦してみることです。サンプルコードを参考に、自社の帳票フォーマットに合わせたPDFの自動出力などに取り組んでみるのはいかがでしょうか。
あなたの創意工夫次第で、reportlabの活用の幅はぐんと広がるはずです。ぜひ、PDF自動生成のスペシャリストを目指して、reportlabを存分に使いこなしてください!
関連リンク
公式ドキュメント
pypdf2
PythonでPDFを操作するライブラリには他にpypdf2があります。合わせてお読みください!

