【2025年版】ReportLab入門:PythonでPDFをゼロから生成する基礎

PythonでPDFを「ゼロから」生成する力

PDFはビジネス文書、レポート、請求書など、多岐にわたる用途で利用される不可欠なドキュメント形式です。しかし、既存のPDFを操作するだけでなく、「ゼロから」自由にレイアウトされたPDFを生成する必要に迫られることはありませんか?例えば、動的なデータに基づいたカスタムレポートの作成、特定のデザインガイドラインに沿った帳票の自動生成などです。

多くの開発者が、PythonでPDFを扱う際に既存ファイルの読み込みや編集から始めるかもしれません。しかし、完全に新しいPDFを作成するとなると、途端にハードルが高く感じられることがあります。特に、複雑なレイアウトやグラフィック要素を自由に配置したい場合、どのライブラリを選び、どう使いこなせば良いのか迷ってしまうでしょう。

この記事は、まさにそんなあなたのためのガイドです。PythonでPDFをゼロから生成するための強力なライブラリ「ReportLab」に焦点を当て、その基本的な使い方からシンプルなテキストや図形を含むPDFファイルの作成方法までを、ステップバイステップで解説します。

この記事を読み終える頃には、あなたはReportLabの基本をマスターし、Pythonコードで思い通りのPDFドキュメントを生成する第一歩を踏み出せるようになります。


対象読者

  • Pythonを使ってPDFをゼロから生成したいと考えている開発者
  • ReportLabに興味はあるものの、学習コストの高さに躊躇していたエンジニア
  • 動的なデータに基づいたカスタムレポートや帳票の自動生成に挑戦したい方

動作検証環境

この記事で紹介するPythonを使ったPDF動作は、以下の環境で検証しています。

  • OS : macOS Tahoe Version 26.0
  • ハードウェア : MacBook Air 2024 M3 24GB
  • uv : 0.8.22 (ade2bdbd2 2025-09-23)
  • python : 3.13.7
  • PyMuPDF : 1.26.4
    • pymupdf-stubs : 1.26.1.post1
  • pandas : 2.3.3
    • numpy : 2.3.3
    • python-dateutil : 2.9.0.post0
      • six : 1.17.0
    • pytz : 2025.2
      • types-pytz (型ヒント) : 2025.2.0.20250809
    • tzdata : 2025.2
    • pandas-stubs : 2.3.2.250926

目次

  1. ReportLabとは?:特徴とインストール
    • ReportLabの主な特徴
    • インストール
  2. ReportLabの基本概念
    • CanvasとDocument
    • 座標系と単位
  3. シンプルなPDFドキュメントの作成
    • テキストの描画
    • フォントと色の設定
    • 図形(線、四角、円)の描画
  4. ページ送りと複数ページのPDF
  5. まとめ:ReportLabで始めるPDF生成の第一歩
  6. FAQセクション
    • Q1: ReportLabはどんな時に使うべきですか?
    • Q2: ReportLabの学習は難しいですか?
    • Q3: 他のPython PDF生成ライブラリとの違いは何ですか?
    • Q4: ReportLabで日本語対応は可能ですか?
    • Q5: ReportLabでWebページからPDFを生成できますか?
  7. 参考資料
  8. 免責事項

1. ReportLabとは?:特徴とインストール

ReportLabは、Pythonで高品質なPDFドキュメントをプログラム的に生成するためのオープンソースライブラリです。特徴は、PDFのあらゆる要素(テキスト、画像、図形、テーブル、グラフなど)を細かく制御し、自由に配置できる点です。これにより、静的なテンプレートに依存せず、動的なデータに基づいた複雑なレイアウトのPDFを生成することが可能になります。

ReportLabの主な特徴:

  • 低レベルな制御: PDFの描画コマンドに直接アクセスできるため、非常に柔軟なドキュメント生成が可能です。
  • 豊富な機能: テキスト、図形、画像、テーブル、グラフなど、PDFに必要なあらゆる要素をサポートしています。
  • クロスプラットフォーム: Pythonが動作する環境であれば、どこでも利用できます。
  • 商用利用可能: オープンソースであり、商用プロジェクトでも安心して利用できます。

インストール

ReportLabはpipを使って簡単にインストールできます。

pip install reportlab
[!NOTE]
ReportLabは、その柔軟性の高さゆえに学習コストがやや高いと感じられるかもしれません。しかし、この記事ではその敷居を下げるため、基礎的な概念とシンプルなコード例に絞って解説していきます。

2. ReportLabの基本概念

ReportLabでPDFを生成する上で、まず理解すべき重要な概念がいくつかあります。


CanvasとDocument

ReportLabでは、PDFドキュメントは「Canvas(キャンバス)」と呼ばれる描画領域に要素を描画していくことで作成されます。Canvasは、私たちが絵を描くキャンバスのようなもので、テキストや図形、画像を配置する場所を提供します。

一方、「Document(ドキュメント)」は、複数のCanvas(ページ)を管理し、最終的なPDFファイルとして出力するための上位概念です。ReportLabには、SimpleDocTemplate のような高レベルなドキュメントテンプレートも用意されており、複雑なドキュメント構造を簡単に扱えるようになっています。

ReportLabの概念図

図1: ReportLabの概念図


座標系と単位

ReportLabのCanvasは、左下を原点 (0, 0) とする座標系を採用しています。これは一般的なグラフィックライブラリとは異なり、数学のグラフのようなイメージです。

[!TIP]
多くのグラフィックツールやWebの座標系は左上を原点とすることが多いため、ReportLabの左下原点には慣れが必要です。最初は戸惑うかもしれませんが、慣れてしまえば直感的に要素を配置できるようになります。

単位はデフォルトで「ポイント (point)」が使用されます。1ポイントは約1/72インチです。A4用紙のサイズは (595.27, 841.89) ポイントとなります。


3. シンプルなPDFドキュメントの作成

それでは、実際にReportLabを使ってシンプルなPDFドキュメントを作成してみましょう。


テキストの描画

まずは、PDFにテキストを描画する方法です。canvas.drawString(x, y, text) メソッドを使用します。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4


def create_simple_pdf():
    # PDFドキュメントを作成し、ファイル名とページサイズを指定
    c = canvas.Canvas("simple_text.pdf", pagesize=A4)
    # テキストを描画 (x座標, y座標, テキスト内容)
    # ReportLabの座標系は左下を原点(0,0)とします
    c.drawString(100, 750, "Hello, ReportLab!")
    c.drawString(100, 730, "This is a simple PDF document created with Python.")
    # 変更を保存してPDFファイルを生成
    c.save()


if __name__ == "__main__":
    create_simple_pdf()

上記のコードを実行すると、「simple_text.pdf」というファイルが生成され、指定した位置にテキストが描画されていることが確認できます。


フォントと色の設定

テキストのフォントや色も自由に設定できます。canvas.setFont(font_name, font_size)canvas.setFillColor(color) を使用します。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.colors import blue, red


def create_styled_text_pdf():
    # PDF用のキャンバスオブジェクトを作成し、ページサイズをA4に設定
    c = canvas.Canvas("styled_text.pdf", pagesize=A4)

    # フォントをHelvetica-Bold、サイズ24ポイントに設定
    c.setFont("Helvetica-Bold", 24)
    # 塗りつぶし色を青に設定
    c.setFillColor(blue)
    # 指定されたフォントと色で座標(100, 750)に文字列を描画
    c.drawString(100, 750, "Styled Text Example")

    # フォントをTimes-Roman、サイズ12ポイントに変更
    c.setFont("Times-Roman", 12)
    # 塗りつぶし色を赤に変更
    c.setFillColor(red)
    # 新しいフォントと色で座標(100, 720)に別の文字列を描画
    c.drawString(100, 720, "This text is red and in Times-Roman font.")

    # PDFファイルを保存
    c.save()


if __name__ == "__main__":
    create_styled_text_pdf()
[!NOTE]
ReportLabで利用できる標準フォントは限られています。日本語フォントなど、特定のフォントを使用したい場合は、別途フォントファイルを登録する必要があります。これについては、[関連記事「ReportLab応用:動的データからの帳票生成と日本語対応の完全ガイド」へのリンク]で詳しく解説します。

図形(線、四角、円)の描画

ReportLabでは、線、四角、円などの基本的な図形も簡単に描画できます。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.colors import green, black, red


def create_shapes_pdf():
    c = canvas.Canvas("shapes.pdf", pagesize=A4)

    # 線の描画
    c.setStrokeColor(black)  # 線の色を黒に設定
    c.setLineWidth(2)  # 線幅を2ポイントに設定
    c.line(50, 700, 200, 700)  # (x1, y1, x2, y2) の座標で水平線を描く

    # 四角形の描画 (塗りつぶしなし)
    c.rect(50, 600, 150, 50)  # (x, y, width, height) の座標で枠線だけの四角形を描く

    # 塗りつぶしありの四角形
    c.setFillColor(green)  # 塗りつぶし色を緑に設定
    c.rect(250, 600, 150, 50, fill=1)  # 塗りつぶしフラグを立てた四角形

    # 円の描画 (塗りつぶしなし)
    c.circle(125, 500, 50)  # (cx, cy, radius) の座標で円を描く

    # 塗りつぶしありの円
    c.setFillColor(red)  # 塗りつぶし色を赤に設定
    c.circle(325, 500, 50, fill=1)  # 塗りつぶしフラグを立てた円

    c.save()


if __name__ == "__main__":
    create_shapes_pdf()
[!TIP]
fill=1 を指定すると図形が塗りつぶされます。setStrokeColor で線の色、setFillColor で塗りつぶしの色を設定できます。

4. ページ送りと複数ページのPDF

ReportLabで複数ページのPDFを作成するには、canvas.showPage() メソッドを使用します。このメソッドを呼び出すと、現在のページが終了し、新しい空白のページが作成されます。

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4

def create_multi_page_pdf():
    c = canvas.Canvas("multi_page.pdf", pagesize=A4)

    # 1ページ目
    c.drawString(100, 750, "This is Page 1")
    c.showPage() # 新しいページを開始

    # 2ページ目
    c.drawString(100, 750, "This is Page 2")
    c.drawString(100, 730, "More content on the second page.")
    c.showPage() # 新しいページを開始

    # 3ページ目
    c.drawString(100, 750, "This is Page 3")
    c.save()

if __name__ == "__main__":
    create_multi_page_pdf()

showPage() を呼び出すたびに、新しいページが追加され、そのページに描画を続けることができます。最後に save() を呼び出すことで、すべてのページを含むPDFファイルが生成されます。


まとめ:ReportLabで始めるPDF生成の第一歩

この記事では、PythonでPDFをゼロから生成するための強力なライブラリ「ReportLab」の基本的な使い方を解説しました。

  • ReportLabの特徴インストール方法を理解しました。
  • CanvasDocument座標系と単位といったReportLabの基本概念を学びました。
  • テキストフォント、そして基本的な図形(線、四角、円)をPDFに描画する方法を習得しました。
  • showPage() メソッドを使って複数ページのPDFを作成する方法を学びました。

ReportLabは、その学習コストの高さから敬遠されがちですが、一度基本をマスターすれば、Pythonで思い通りのPDFドキュメントを自由に生成できる強力なツールとなります。

次のステップとして、[関連記事「ReportLab実践:複雑なレイアウトとグラフ描画でプロフェッショナルなPDFを作成」]では、ReportLabのより高度な機能であるテーブルやグラフ描画、複雑なレイアウトの実現方法について掘り下げていきます。

ReportLabを使いこなし、あなたのプロジェクトにおけるPDF生成の自動化を加速させましょう!


FAQセクション

Q1: ReportLabはどんな時に使うべきですか?

A1: ReportLabは、既存のPDFを編集するのではなく、完全にゼロからPDFを生成したい場合に最適です。特に、動的なデータに基づいてカスタムレポート、請求書、証明書、グラフを含むドキュメントなど、複雑なレイアウトやデザインの自由度が求められるPDFを作成する際にその真価を発揮します。

Q2: ReportLabの学習は難しいですか?

A2: ReportLabは低レベルなAPIを提供するため、他の高レベルなPDF生成ライブラリと比較して学習コストはやや高いかもしれません。しかし、この記事で紹介したような基本的な概念とシンプルなコード例から始めることで、段階的にスキルを習得できます。特に、座標系や描画の概念を理解することが重要です。

Q3: 他のPython PDF生成ライブラリとの違いは何ですか?

A3: ReportLabは、PDFの描画要素を非常に細かく制御できる点が最大の特徴です。例えば、HTMLからPDFを変換するライブラリ(WeasyPrintなど)や、既存PDFの編集に特化したライブラリ(pypdfなど)とは異なり、ReportLabは「プログラムによる自由な描画」に強みがあります。用途に応じて最適なライブラリを選択することが重要です。

Q4: ReportLabで日本語対応は可能ですか?

A4: はい、可能です。ただし、ReportLabの標準フォントは日本語をサポートしていないため、別途日本語フォントファイル(TrueTypeフォントなど)を準備し、ReportLabに登録する作業が必要です。これを行うことで、日本語テキストをPDFに正確に描画できるようになります。詳細な手順は、[関連記事「ReportLab応用:動的データからの帳票生成と日本語対応の完全ガイド」へのリンク]で解説します。

Q5: ReportLabでWebページからPDFを生成できますか?

A5: ReportLab自体にはWebページを直接PDFに変換する機能はありません。ReportLabはあくまでPythonコードからPDF要素を描画するためのライブラリです。Webページ(HTML)からPDFを生成したい場合は、WeasyPrintやwkhtmltopdfのようなHTML-to-PDF変換ツールやライブラリの利用を検討してください。ReportLabとこれらのツールを組み合わせることで、より高度なワークフローを構築することも可能です。


参考資料


免責事項

この記事は、ReportLabの基本的な使い方を解説することを目的としています。提供されるコードスニペットは学習用であり、実際のプロダクション環境で使用する際は、エラーハンドリングやセキュリティ対策などを適切に実装してください。また、ReportLabのバージョンアップにより、APIの変更や新たな機能が追加される可能性があります。常に最新の公式ドキュメントを参照することをお勧めします。


SNSでもご購読できます。

コメントを残す

*