【Python初心者向け】reportlabを使ってPDFを自動生成する方法を徹底解説!

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に埋め込む設定を行います。

  1. IPAフォントなどの日本語対応フォントをダウンロードし、任意のフォルダに配置します。
  2. 以下のようなコードでフォントを登録し、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があります。合わせてお読みください!

【Python】初心者向けpypdf2の使い方完全ガイド!PDFを自在に操作しよう