PythonでPDFを簡単に作成!ReportLabの使い方徹底解説

プログラミング
記事内に広告が含まれています。
スポンサーリンク

ReportLabとは?

ReportLabは、PythonでPDFを作成・操作するためのオープンソースライブラリです。PDFは、文書を電子的に配布するための標準的なフォーマットとして広く使用されており、その固定レイアウト特性から、多くのビジネスアプリケーションで使用されています。ReportLabを使うことで、動的にPDFを生成し、カスタマイズしたレポート、請求書、フォームなどをプログラムで作成することが可能です。

このライブラリの利点は、以下のような特徴にあります。

PICKUP
  • レイアウトの自由度:文字、画像、図形、表、グラフなどを柔軟にレイアウトできる。
  • 自動化:Pythonプログラムからデータを元にPDFを自動生成できるため、レポート作成やドキュメント生成の効率を上げることができる。
  • 豊富な機能:高度なレイアウトやデザイン、複雑なレポートも作成可能。

PDF生成を手軽に行うために、ReportLabは2つのレベルで操作できます。基礎的な操作を行うための「低レベルAPI」と、より複雑なレポート作成をサポートする「高レベルAPI(Platypus)」があります。本記事では、低レベルAPIを中心に解説していきますが、最後に高レベルAPIの使用例も紹介します。

brian
brian

PythonでオリジナルのPDFを作ってみたい方にぴったりのガイドです!ReportLabというライブラリを使って、簡単にPDFの生成方法を学べます。初心者でもわかりやすく手順を解説しているので、興味がある方はぜひチェックしてみてくださいね!

ReportLabのインストール

ReportLabを使用するには、まずPythonの環境にインストールする必要があります。以下のコマンドで簡単にインストールできます。

Bash
pip install reportlab

これで、ReportLabの機能を利用する準備が整いました。

スポンサーリンク

基本的なPDFの作成

ReportLabでPDFを作成する基本的な流れは非常にシンプルです。まず、canvasクラスを使って、PDFドキュメントの内容を定義し、それをファイルとして保存します。この章では、シンプルなPDFを作成する手順を紹介します。

canvasクラスを使ったPDFの生成

canvasは、ReportLabの最も基本的なクラスで、PDFのページにテキストや画像、図形を描画する際に使用します。以下のコードは、基本的なPDFを生成する例です。

Python
from reportlab.pdfgen import canvas

# PDFファイルの作成(ファイル名を指定)
pdf_file = "simple_pdf.pdf"
c = canvas.Canvas(pdf_file)

# テキストを追加(左から100ポイント、下から750ポイントの位置)
c.drawString(100, 750, "Hello, ReportLab!")

# PDFを保存(save() を実行しないとファイルが作成されない)
c.save()
コードの解説
  • canvas.Canvas(pdf_file) で 新しいPDFファイルを作成 。
  • drawString(100, 750, "Hello, ReportLab!") で 指定した位置(左から100ポイント、下から750ポイント)にテキストを描画 。
  • save() を実行することで、作成したPDFを保存 。

このコードを実行すると、「Hello, ReportLab!」というテキストが表示されたPDF(simple_pdf.pdf)が作成されます。
テキストの位置を変更したり、フォントを指定することで、よりカスタマイズが可能になります。

フォントの設定とスタイル

ReportLabでは、フォントやテキストのスタイルを簡単に設定することができます。デフォルトではHelveticaフォントが使用されていますが、以下のようにフォントを変更したり、サイズを指定することも可能です。

Python
from reportlab.pdfgen import canvas

# PDFファイルを作成(ファイル名を指定)
c = canvas.Canvas("styled_text.pdf")

# フォントの設定(Times-Romanフォント、サイズ18ポイント)
c.setFont("Times-Roman", 18)

# テキストを追加(左から100ポイント、下から750ポイントの位置)
c.drawString(100, 750, "Styled Text Example")

# PDFを保存(save() を実行しないとファイルが作成されない)
c.save()
コードの解説
  • canvas.Canvas("styled_text.pdf") で 新しいPDFファイルを作成 。
  • setFont("Times-Roman", 18) で フォントを Times-Roman、サイズを18ポイントに設定 。
  • drawString(100, 750, "Styled Text Example") で 左から100ポイント、下から750ポイントの位置にテキストを描画 。
  • save() を実行しないとPDFが保存されないため、必ず最後に呼び出す 。

このコードを実行すると、Times-Romanフォントの18ポイントサイズで「Styled Text Example」というテキストが表示されたPDFが作成 されます。
フォントの種類やサイズを変更すると、PDFのデザインを調整できます。

座標系と位置指定の注意点

ReportLabでは、PDFページの左下を原点 (0, 0) として、右方向をx軸、上方向をy軸として座標を扱います。ページのサイズやマージンを設定する場合、テキストや画像の配置位置が異なるため、意図したレイアウトを実現するために、座標系の理解が重要です。

スポンサーリンク

ページのレイアウト

ReportLabでは、PDFのページサイズやマージンの指定を柔軟に行うことができます。標準的なページサイズだけでなく、カスタムサイズのページも作成可能です。また、複数ページのPDFを生成することも簡単です。この章では、ページレイアウトに関する基本的な設定方法と、複数ページのPDFを作成する方法について解説します。

ページサイズの指定

ReportLabでは、いくつかの標準的なページサイズがあらかじめ定義されています。例えば、A4サイズやLetterサイズなどです。これらのサイズは、reportlab.lib.pagesizesモジュールから簡単に利用できます。以下の例では、A4サイズのページを使用してPDFを作成します。

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

# A4サイズのPDFファイルを作成(ページサイズを指定)
c = canvas.Canvas("a4_pdf.pdf", pagesize=A4)

# ページサイズを取得(横幅と高さを取得)
width, height = A4  # A4のサイズ(595×842ポイント)

# ページにテキストを追加(左から100ポイント、上端から100ポイント下の位置)
c.drawString(100, height - 100, "This is an A4 size PDF.")

# PDFを保存(save() を実行しないとファイルが作成されない)
c.save()
コードの解説
  • canvas.Canvas("a4_pdf.pdf", pagesize=A4) で A4サイズ(595×842ポイント)のPDFを作成 。
  • width, height = A4 で A4の横幅(約595ポイント)と高さ(約842ポイント)を取得 。
  • drawString(100, height - 100, "This is an A4 size PDF.") で 左から100ポイント、上端から100ポイント下の位置にテキストを描画 。
  • save() を実行しないとPDFが保存されないため、必ず最後に呼び出す 。

このコードを実行すると、A4サイズのPDFが作成され、ページの上の方に「This is an A4 size PDF.」というテキストが表示 されます。
位置を調整することで、見やすいレイアウトのPDFを作成 することができます。

カスタムページサイズ

標準サイズに加え、独自のカスタムページサイズを指定することもできます。以下の例では、幅300ポイント、高さ500ポイントのカスタムページサイズを設定しています。

Python
from reportlab.pdfgen import canvas

# カスタムサイズのページを指定(幅300ポイント、高さ500ポイント)
custom_page_size = (300, 500)

# カスタムサイズのPDFを作成(指定したサイズで新しいPDFを作成)
c = canvas.Canvas("custom_size_pdf.pdf", pagesize=custom_page_size)

# ページサイズを取得(横幅と高さ)
width, height = custom_page_size  # (300, 500) のサイズが適用される

# テキストを追加(左から50ポイント、上端から50ポイント下の位置に配置)
c.drawString(50, height - 50, "Custom Page Size PDF.")

# PDFを保存(必ずsave()を実行しないとファイルが作成されない)
c.save()
コードの解説
  • custom_page_size = (300, 500) で カスタムページサイズ(幅300、高さ500ポイント) を設定。
  • canvas.Canvas("custom_size_pdf.pdf", pagesize=custom_page_size) で 指定したサイズのPDFを作成
  • width, height = custom_page_size で ページの横幅と高さを取得 し、テキスト配置の座標指定に利用。
  • drawString(50, height - 50, "Custom Page Size PDF.") で 左から50ポイント、上から50ポイント下の位置にテキストを描画
  • save() を実行しないとPDFが作成されないため、必ず最後に呼び出す。

このコードを実行すると、幅300ポイント×高さ500ポイントのカスタムサイズPDF が作成され、左上に近い位置に「Custom Page Size PDF.」という文字が表示されます。ページサイズを変更すれば、チケットやラベルなどの特殊なレイアウトのPDF作成 にも応用できます。

マージンと座標系の管理

PDFドキュメントにおいて、テキストや画像を配置する際には、マージン(余白)の設定が重要です。ReportLabでは、ページの左下が座標の原点 (0, 0) となっているため、ページの端からコンテンツを少し内側に配置する場合はマージンを計算に入れる必要があります。以下の例では、20ポイントのマージンを設定して、テキストを配置しています。

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

# A4サイズのPDFファイルを作成(ページサイズを指定)
c = canvas.Canvas("margin_example.pdf", pagesize=A4)

# ページサイズ(横幅と高さ)を取得
width, height = A4  # A4のサイズ(595×842ポイント)

# マージンを設定(ページの端から余白を確保)
margin = 20  # 左端と上端から20ポイントの余白を設定

# テキストを追加(左端から20ポイント、上端から20ポイント下に配置)
c.drawString(margin, height - margin, "Text with a 20-point margin.")

# PDFを保存
c.save()
コードの解説
  • canvas.Canvas("margin_example.pdf", pagesize=A4) で A4サイズのPDFを作成 します。
  • width, height = A4 で A4の横幅と高さを取得 します。
  • margin = 20 で 左端と上端から20ポイントの余白 を設定し、ページの端に直接テキストがこないように調整します。
  • drawString(margin, height - margin, "Text with a 20-point margin.") で 余白を考慮した位置にテキストを描画 します。
  • save() を呼び出して PDFをディスクに保存 します。

このコードを実行すると、A4サイズのPDFに、ページの左上から少し下がった位置にテキストが表示されるようになります。マージンの値を調整すれば、より見やすいレイアウトにすることも可能です。

複数ページのPDFを作成する

複数ページにまたがるPDFを作成するには、showPage()メソッドを使用します。このメソッドは、現在のページを完了し、新しいページを開始するために使われます。以下の例では、2ページにわたるPDFを生成します。

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

# A4サイズのPDFファイルを作成
c = canvas.Canvas("multipage_pdf.pdf", pagesize=A4)

# 1ページ目にテキストを追加(左から100ポイント、上から750ポイントの位置)
c.drawString(100, 750, "This is the first page.")

# 次のページに移動(現在のページを確定し、新しいページを開始)
c.showPage()

# 2ページ目にテキストを追加(新しいページの左から100ポイント、上から750ポイントの位置)
c.drawString(100, 750, "This is the second page.")

# PDFを保存(save() を実行しないとファイルが作成されない)
c.save()
コードの解説
  • canvas.Canvas("multipage_pdf.pdf", pagesize=A4) で A4サイズのPDFを作成 。
  • drawString(100, 750, "This is the first page.") で 1ページ目にテキストを描画 。
  • showPage() を呼び出すことで 1ページ目を確定し、次のページへ移動 。
  • drawString(100, 750, "This is the second page.") で 2ページ目にテキストを描画 。
  • save() を実行することで 作成したPDFを保存 。

このコードを実行すると、2ページのPDFが作成され、それぞれのページに異なるテキストが表示 されます。showPage() を使うことで、複数ページのPDFを作成できます。

スポンサーリンク

画像や図形の描画

ReportLabでは、テキストだけでなく、画像や図形をPDFに簡単に追加することができます。この章では、画像の挿入方法と、線や四角形、円などの基本的な図形の描画方法について解説します。

画像の挿入

ReportLabを使うと、JPEGやPNG形式の画像をPDFに埋め込むことができます。画像を挿入するには、drawImage()メソッドを使用します。以下の例では、画像を指定した位置に挿入する方法を示しています。

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

# A4サイズのPDFファイルを作成
c = canvas.Canvas("image_example.pdf", pagesize=A4)

# 画像ファイルのパスを指定
image_path = "example_image.jpg"

# 画像を指定した位置とサイズで挿入(左から100ポイント、下から500ポイント、幅200ポイント、高さ150ポイント)
c.drawImage(image_path, 100, 500, width=200, height=150)

# PDFを保存(save() を実行しないとファイルが作成されない)
c.save()
コードの解説
  • canvas.Canvas("image_example.pdf", pagesize=A4) で A4サイズのPDFを作成 。
  • image_path = "example_image.jpg" で 挿入する画像のパスを指定 。
  • drawImage(image_path, 100, 500, width=200, height=150) で 画像を指定位置(左から100ポイント、下から500ポイント)に配置し、サイズを幅200ポイント、高さ150ポイントに設定 。
  • save() を実行することで 作成したPDFを保存 。

このコードを実行すると、指定した画像がA4サイズのPDFに挿入され、指定位置とサイズで表示 されます。drawImage() の座標やサイズを変更することで、画像の位置や大きさを調整できます。

図形の描画

ReportLabでは、線や四角形、円などの基本的な図形を描画するためのメソッドが用意されています。これらの図形を使うことで、グラフィカルな要素をPDFに追加することができます。

線の描画

線を引くには、line()メソッドを使用します。以下のコードは、ページ上に直線を描画する例です。

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

# A4サイズのPDFファイルを作成
c = canvas.Canvas("line_example.pdf", pagesize=A4)

# 線を描画(始点(100, 750) から 終点(400, 750) までの直線を引く)
c.line(100, 750, 400, 750)

# PDFを保存(save() を実行しないとファイルが作成されない)
c.save()
コードの解説
  • canvas.Canvas("line_example.pdf", pagesize=A4) で A4サイズのPDFを作成 。
  • line(100, 750, 400, 750) で (100, 750) から (400, 750) までの直線を描画 。
    • X座標100から400までの水平な線 を引く。
    • Y座標750の高さで描画されるため、ページの上部に配置される 。
  • save() を実行することで 作成したPDFを保存 。

このコードを実行すると、A4サイズのPDFに長さ300ポイントの水平な直線 が描かれます。line(x1, y1, x2, y2) の座標を変更することで、線の長さや角度を自由に調整できます。

四角形の描画

四角形を描画するには、rect()メソッドを使用します。このメソッドは、指定した位置に四角形を描画し、そのサイズを指定します。

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

# A4サイズのPDFファイルを作成
c = canvas.Canvas("rectangle_example.pdf", pagesize=A4)

# 四角形を描画(左下の座標 (100, 600)、幅 200ポイント、高さ 100ポイント)
c.rect(100, 600, 200, 100)

# PDFを保存(save() を実行しないとファイルが作成されない)
c.save()
コードの解説
  • canvas.Canvas("rectangle_example.pdf", pagesize=A4) で A4サイズのPDFを作成 。
  • rect(100, 600, 200, 100) で 左下の座標 (100, 600) から幅200ポイント、高さ100ポイントの四角形を描画 。
    • X=100, Y=600 の位置から右方向に200ポイント、上方向に100ポイントの長方形が作成される 。
    • 塗りつぶしなしの枠線だけの四角形が描画される 。
  • save() を実行することで 作成したPDFを保存 。

このコードを実行すると、A4サイズのPDFに幅200ポイント×高さ100ポイントの四角形 が描かれます。四角形の位置やサイズを変更することで、カスタムデザインのレイアウトも可能になります。

円や楕円の描画

円や楕円を描くには、ellipse()メソッドを使用します。楕円は、囲む矩形の座標を指定することで描画されます。

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

# A4サイズのPDFファイルを作成
c = canvas.Canvas("ellipse_example.pdf", pagesize=A4)

# 楕円を描画(左下の座標 (100, 500) から 右上の座標 (300, 600) までの範囲)
c.ellipse(100, 500, 300, 600)

# PDFを保存(save() を実行しないとファイルが作成されない)
c.save()
コードの解説
  • canvas.Canvas("ellipse_example.pdf", pagesize=A4) で A4サイズのPDFを作成 。
  • ellipse(100, 500, 300, 600) で (100, 500) から (300, 600) の範囲内に楕円を描画 。
    • X=100, Y=500 の位置から X=300, Y=600 の位置までの範囲に楕円を配置 。
    • 横幅200ポイント(300-100)、高さ100ポイント(600-500)の楕円が描かれる 。
  • save() を実行することで 作成したPDFを保存 。

このコードを実行すると、A4サイズのPDFに幅200ポイント×高さ100ポイントの楕円 が描かれます。
ellipse(x1, y1, x2, y2) の座標を変更することで、楕円のサイズや形状を調整できます。

塗りつぶしと線の色

図形を描画する際、色を指定して塗りつぶしたり、線の色を変更することができます。setFillColor() と setStrokeColor() メソッドを使用して、描画する図形の色をカスタマイズできます。

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

# A4サイズのPDFファイルを作成
c = canvas.Canvas("colored_shapes.pdf", pagesize=A4)

# 線と塗りつぶしの色を設定
c.setStrokeColor(colors.blue)  # 線の色を青に設定
c.setFillColor(colors.red)     # 塗りつぶしの色を赤に設定

# 塗りつぶされた四角形を描画(左下の座標 (100, 600)、幅200ポイント、高さ100ポイント)
c.rect(100, 600, 200, 100, fill=1)  # fill=1 にすると四角形が塗りつぶされる

# PDFを保存(save() を実行しないとファイルが作成されない)
c.save()
コードの解説
  • canvas.Canvas("colored_shapes.pdf", pagesize=A4) で A4サイズのPDFを作成 。
  • setStrokeColor(colors.blue) で 四角形の枠線の色を青に設定 。
  • setFillColor(colors.red) で 四角形の塗りつぶしの色を赤に設定 。
  • rect(100, 600, 200, 100, fill=1) で 左下 (100,600) を基準に幅200ポイント、高さ100ポイントの赤い四角形を描画 。
    • fill=1 を指定すると、塗りつぶし有効(赤色) になる。
    • fill=0 にすると、枠線だけの四角形になる。
  • save() を実行することで 作成したPDFを保存 。

このコードを実行すると、青い枠線と赤く塗りつぶされた四角形 がA4サイズのPDF上に描画されます。
色を変更したり、異なる図形を描画することで、カラフルなデザインのPDFを作成することも可能 です。

スポンサーリンク

表やグラフの作成

ReportLabでは、PDFドキュメントにテーブルやグラフを挿入することも簡単です。特に、データを視覚的に整理するために表を使ったレイアウトは非常に有用です。ReportLabには、Tableクラスや、グラフ作成用のモジュールも用意されています。この章では、シンプルな表の作成方法と、基本的なグラフの描画方法について解説します。

シンプルな表の作成

ReportLabのTableクラスを使うと、表を作成してPDFに挿入することができます。表は、リストやタプルのデータを使って構築し、TableStyleクラスで見た目をカスタマイズすることもできます。

以下は、シンプルな表をPDFに挿入する例です。

Python
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle

# PDFドキュメントの作成(A4サイズのPDFファイルを指定)
pdf_file = "simple_table.pdf"
doc = SimpleDocTemplate(pdf_file, pagesize=A4)

# 表のデータ(ヘッダーと内容)
data = [
    ["項目", "値"],       # ヘッダー行
    ["名前", "山田太郎"], # 1行目のデータ
    ["年齢", "30"],       # 2行目のデータ
    ["職業", "エンジニア"] # 3行目のデータ
]

# 表の作成(データをTableオブジェクトに変換)
table = Table(data)

# PDFに表を追加
elements = [table]  # 追加する要素をリストに格納
doc.build(elements) # PDFにテーブルを組み込む
コードの解説
  • SimpleDocTemplate(pdf_file, pagesize=A4) で A4サイズのPDFを作成 。
  • data リストに 表のデータ(項目と値) を格納。
  • Table(data) を使い、表を作成 。
  • elements = [table] で 作成した表をPDFの要素として追加 。
  • doc.build(elements) を実行し、PDFに表を配置し保存 。

このコードを実行すると、A4サイズのPDFに「名前・年齢・職業」などの情報が表として表示される ようになります。
TableStyle を追加すると、枠線や背景色などのデザインをカスタマイズ することも可能です。

表のスタイルをカスタマイズ

表の見た目を整えるには、TableStyleを使います。枠線やセルの背景色、文字の配置などをカスタマイズすることができます。

以下は、スタイルを適用した表の例です。

Python
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle

# PDFドキュメントの作成(A4サイズのPDFファイル)
pdf_file = "styled_table.pdf"
doc = SimpleDocTemplate(pdf_file, pagesize=A4)

# 表のデータ(ヘッダーと内容)
data = [
    ["項目", "値"],       # ヘッダー行
    ["名前", "山田太郎"], # 1行目のデータ
    ["年齢", "30"],       # 2行目のデータ
    ["職業", "エンジニア"] # 3行目のデータ
]

# 表の作成(データをTableオブジェクトに変換)
table = Table(data)

# スタイルの設定
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'),  # ヘッダー行のフォントを太字に設定
    ('GRID', (0, 0), (-1, -1), 1, colors.black),  # 全セルに黒の枠線を追加
])

# 表にスタイルを適用
table.setStyle(style)

# PDFに表を追加
elements = [table]  # 追加する要素をリストに格納
doc.build(elements) # PDFにテーブルを組み込む
コードの解説
  • SimpleDocTemplate(pdf_file, pagesize=A4) で A4サイズのPDFを作成 。
  • Table(data) で 表を作成 。
  • TableStyle() を使って 表のデザインを設定 。
    • ヘッダー行の背景をグレーに設定。
    • ヘッダーの文字色を白に設定。
    • すべてのセルの文字を中央寄せ。
    • ヘッダーのフォントを太字に。
    • 全セルに黒の枠線を追加。
  • table.setStyle(style) で 表にスタイルを適用 。
  • doc.build(elements) を実行し、PDFに表を配置し保存 。

このコードを実行すると、グレーのヘッダー・中央揃えのデータ・黒枠の表 を持つPDFが生成されます。
TableStyle を調整することで、デザインをさらにカスタマイズすることが可能です。

グラフの作成

ReportLabには、グラフやチャートを描画するためのreportlab.graphicsモジュールが用意されています。Drawingクラスと、さまざまなチャートクラス(BarChartPieなど)を使って、シンプルなグラフを作成することができます。

棒グラフの例

以下は、棒グラフをPDFに描画する例です。

Python
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate
from reportlab.graphics.shapes import Drawing
from reportlab.graphics.charts.barcharts import VerticalBarChart

# PDFドキュメントの作成(A4サイズのPDFファイル)
pdf_file = "bar_chart.pdf"
doc = SimpleDocTemplate(pdf_file, pagesize=A4)

# グラフのデータ(2つの系列を持つ棒グラフ)
data = [[10, 20, 30, 40],  # 1つ目のデータ系列
        [5, 15, 25, 35]]   # 2つ目のデータ系列

# Drawingオブジェクトの作成(グラフを描画する領域)
drawing = Drawing(400, 200)

# 棒グラフの作成
barchart = VerticalBarChart()
barchart.x = 50  # X座標(左から50ポイントの位置)
barchart.y = 50  # Y座標(下から50ポイントの位置)
barchart.height = 125  # グラフの高さ
barchart.width = 300  # グラフの幅
barchart.data = data  # 棒グラフのデータを設定

# X軸のラベル(カテゴリ名を設定)
barchart.categoryAxis.categoryNames = ['Q1', 'Q2', 'Q3', 'Q4']

# Y軸の範囲と目盛りの設定
barchart.valueAxis.valueMin = 0  # 最小値
barchart.valueAxis.valueMax = 50  # 最大値
barchart.valueAxis.valueStep = 10  # 目盛りの間隔

# Drawingに棒グラフを追加
drawing.add(barchart)

# PDFにグラフを追加
elements = [drawing]  # PDFに追加する要素をリストに格納
doc.build(elements)  # PDFにグラフを描画し保存
コードの解説
  • SimpleDocTemplate(pdf_file, pagesize=A4) で A4サイズのPDFを作成 。
  • Drawing(400, 200) で グラフの描画領域を設定 。
  • VerticalBarChart() を使い、棒グラフを作成 。
    • data = [[10, 20, 30, 40], [5, 15, 25, 35]] で 2つの系列のデータを設定 。
    • categoryAxis.categoryNames = ['Q1', 'Q2', 'Q3', 'Q4'] で X軸に四半期(Q1~Q4)のラベルを設定 。
    • valueAxis.valueMin = 0 から valueMax = 50 までの範囲を設定し、valueStep = 10 で Y軸の目盛り間隔を調整 。
  • drawing.add(barchart) で 棒グラフを描画領域に追加 。
  • doc.build(elements) を実行し、PDFにグラフを配置し保存 。

このコードを実行すると、A4サイズのPDFにQ1~Q4の棒グラフが描画 されます。
data を変更すれば、異なるデータのグラフを作成することも可能です。

スポンサーリンク

スタイルのカスタマイズ

PDFドキュメントのデザインを向上させるために、ReportLabでは色やフォント、パラグラフのレイアウトなどを細かくカスタマイズすることができます。この章では、フォントの変更、色の指定、複雑なテキストレイアウトのためのパラグラフスタイルの設定などについて説明します。

フォントのカスタマイズ

ReportLabでは、デフォルトでいくつかの標準フォントが利用可能です。例えば、HelveticaTimes-RomanCourierなどです。以下の例では、これらのフォントを使ってテキストのスタイルを変更しています。

Python
from reportlab.pdfgen import canvas

# PDFファイルの作成(ファイル名を指定)
c = canvas.Canvas("font_example.pdf")

# Helveticaフォント(サイズ12pt)を指定してテキストを追加
c.setFont("Helvetica", 12)
c.drawString(100, 750, "This is Helvetica 12pt.")

# Times-Romanフォント(サイズ14pt)を指定してテキストを追加
c.setFont("Times-Roman", 14)
c.drawString(100, 730, "This is Times-Roman 14pt.")

# Courierフォント(サイズ10pt)を指定してテキストを追加
c.setFont("Courier", 10)
c.drawString(100, 710, "This is Courier 10pt.")

# PDFを保存(save() を実行しないとファイルが作成されない)
c.save()
コードの解説
  • canvas.Canvas("font_example.pdf") で PDFファイルを作成 。
  • setFont("フォント名", サイズ) を使い、異なるフォントとサイズのテキストを設定。
    • "Helvetica", 12 → ヘルベチカ(12ポイント) を設定し、drawString(100, 750, "This is Helvetica 12pt.") で描画。
    • "Times-Roman", 14 → タイムズローマン(14ポイント) を設定し、drawString(100, 730, "This is Times-Roman 14pt.") で描画。
    • "Courier", 10 → クーリエ(10ポイント) を設定し、drawString(100, 710, "This is Courier 10pt.") で描画。
  • save() を実行することで、作成したPDFを保存 。

このコードを実行すると、異なるフォントとサイズのテキストがA4サイズのPDFに表示 されます。
setFont() を活用することで、さまざまなフォントを使用して 見やすいレイアウトのPDFを作成 できます。

色のカスタマイズ

ReportLabでは、テキストや図形の色を簡単に変更できます。setFillColor()を使うことで、テキストや塗りつぶしの色を変更できますし、setStrokeColor()で線の色を設定することができます。色は、reportlab.lib.colorsモジュールに定義された色名、またはRGB値で指定します。

Python
from reportlab.pdfgen import canvas
from reportlab.lib import colors

# PDFファイルの作成(ファイル名を指定)
c = canvas.Canvas("color_example.pdf")

# 塗りつぶしの色を設定(テキストを赤色にする)
c.setFillColor(colors.red)
c.drawString(100, 750, "This text is red.")  # 赤色のテキストを描画

# 線の色を設定(四角形の枠線を青色にする)
c.setStrokeColor(colors.blue)
c.rect(100, 700, 200, 100, stroke=1, fill=0)  # 青枠の四角形を描画(塗りつぶしなし)

# PDFを保存(save() を実行しないとファイルが作成されない)
c.save()
コードの解説
  • canvas.Canvas("color_example.pdf") で PDFファイルを作成 。
  • setFillColor(colors.red) を使い、テキストの色を赤に設定 。
    • drawString(100, 750, "This text is red.") で 赤色のテキストを描画 。
  • setStrokeColor(colors.blue) を使い、四角形の枠線の色を青に設定 。
    • rect(100, 700, 200, 100, stroke=1, fill=0) で 塗りつぶしなしの青い枠線の四角形を描画 。
  • save() を実行し、作成したPDFを保存 。

このコードを実行すると、赤色のテキストと青枠の四角形がA4サイズのPDFに表示 されます。
setFillColor() や setStrokeColor() を活用することで、PDFのデザインを自由にカスタマイズ できます。

パラグラフの書式設定

PlatypusモジュールのParagraphクラスを使うことで、複雑なパラグラフのレイアウトが可能です。このクラスを使うと、テキストを段落単位で整形し、行間やアライメント(左寄せ、中央寄せ、右寄せ)などを設定することができます。

パラグラフの基本的な使い方

Python
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.styles import getSampleStyleSheet

# PDFドキュメントの作成(A4サイズのPDF)
doc = SimpleDocTemplate("paragraph_example.pdf", pagesize=A4)

# スタイルシートの取得(既存のスタイルを利用)
styles = getSampleStyleSheet()

# パラグラフのスタイルを設定
style = styles["Normal"]  # 基本的なテキストスタイルを取得
style.fontName = "Helvetica"  # フォントをHelveticaに設定
style.fontSize = 12  # 文字サイズを12ポイントに設定
style.textColor = colors.black  # 文字色を黒に設定
style.alignment = 1  # 中央寄せ(0=左寄せ, 1=中央, 2=右寄せ, 3=両端揃え)

# パラグラフの作成(指定したスタイルでテキストを整形)
text = "This is a paragraph with custom style. It is centered and uses Helvetica font."
paragraph = Paragraph(text, style)

# PDFにパラグラフを追加
elements = [paragraph]  # 追加する要素をリストに格納
doc.build(elements)  # PDFを作成して保存
コードの解説
  • SimpleDocTemplate("paragraph_example.pdf", pagesize=A4) で A4サイズのPDFを作成 。
  • getSampleStyleSheet() で 標準のスタイルを取得 。
  • styles["Normal"] を使い、基本的なテキストスタイルを取得してカスタマイズ 。
    • fontName = "Helvetica" で フォントをHelveticaに設定 。
    • fontSize = 12 で 文字サイズを12ポイントに設定 。
    • textColor = colors.black で 文字の色を黒に設定 。
    • alignment = 1 で 中央寄せに設定 (0=左寄せ, 1=中央, 2=右寄せ, 3=両端揃え)。
  • Paragraph(text, style) で スタイル付きのパラグラフを作成 。
  • doc.build(elements) を実行し、PDFにパラグラフを配置し保存 。

このコードを実行すると、中央揃えのテキストが表示されたPDF が生成されます。
スタイルを変更することで、フォントの種類やサイズ、配置方法をカスタマイズ できます。

行間やインデントの設定

より詳細なカスタマイズも可能です。たとえば、行間(leading)やインデント(leftIndentrightIndent)などの設定を変更できます。

Python
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib import colors

# PDFドキュメントの作成(A4サイズのPDF)
doc = SimpleDocTemplate("custom_paragraph.pdf", pagesize=A4)

# カスタムスタイルの作成
custom_style = ParagraphStyle(
    name="CustomStyle",  # スタイル名
    fontName="Times-Roman",  # フォントをTimes-Romanに設定
    fontSize=14,  # フォントサイズを14ポイントに設定
    leading=18,  # 行間を18ポイントに設定
    leftIndent=20,  # 左インデント(余白)を20ポイントに設定
    rightIndent=20,  # 右インデント(余白)を20ポイントに設定
    textColor=colors.blue,  # テキストの色を青に設定
    spaceAfter=12  # 段落の後に12ポイントの余白を設定
)

# パラグラフの作成(カスタムスタイルを適用)
text = "This is a custom styled paragraph with blue text, indents, and extra line spacing."
paragraph = Paragraph(text, custom_style)

# PDFにパラグラフを追加
elements = [paragraph]  # 追加する要素をリストに格納
doc.build(elements)  # PDFにパラグラフを追加して保存
コードの解説
  • SimpleDocTemplate("custom_paragraph.pdf", pagesize=A4) で A4サイズのPDFを作成 。
  • ParagraphStyle() を使い、独自のスタイルを定義 。
    • fontName="Times-Roman" で フォントをTimes-Romanに設定 。
    • fontSize=14 で フォントサイズを14ポイントに設定 。
    • leading=18 で 行間を18ポイントに設定 。
    • leftIndent=20, rightIndent=20 で 左右の余白を20ポイントに設定 。
    • textColor=colors.blue で テキストの色を青に設定 。
    • spaceAfter=12 で 段落の後に12ポイントの余白を追加 。
  • Paragraph(text, custom_style) で カスタムスタイルを適用したパラグラフを作成 。
  • doc.build(elements) を実行し、PDFにパラグラフを配置し保存 。

このコードを実行すると、青色のTimes-Romanフォントで、左右に余白のあるカスタムパラグラフ がPDFに表示されます。
スタイルを調整することで、フォントやレイアウトを自由にカスタマイズ できます。

複雑なレイアウトの構築

ReportLabのPlatypusモジュールを使うと、画像、テキスト、表などを組み合わせて複雑なレイアウトを構築できます。要素をリストに追加し、その順序でPDFに出力することができます。

以下は、パラグラフと画像を組み合わせたレイアウトの例です。

Python
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Paragraph, Image
from reportlab.lib.styles import getSampleStyleSheet

# PDFドキュメントの作成(A4サイズのPDF)
doc = SimpleDocTemplate("complex_layout.pdf", pagesize=A4)

# スタイルシートの取得(標準のテキストスタイルを取得)
styles = getSampleStyleSheet()
style = styles["Normal"]  # 通常の段落スタイルを使用

# パラグラフの作成(テキストを作成し、スタイルを適用)
text = "This is a paragraph with an image below."
paragraph = Paragraph(text, style)

# 画像の作成(指定したサイズで画像を読み込む)
image_path = "example_image.jpg"
image = Image(image_path, width=200, height=150)  # 幅200ポイント、高さ150ポイント

# PDFにパラグラフと画像を追加
elements = [paragraph, image]  # 追加する要素をリストに格納
doc.build(elements)  # PDFにパラグラフと画像を配置し保存
コードの解説
  • SimpleDocTemplate("complex_layout.pdf", pagesize=A4) で A4サイズのPDFを作成 。
  • getSampleStyleSheet()["Normal"] を使い、標準のスタイルを取得してパラグラフに適用 。
  • Paragraph(text, style) で 段落を作成し、テキストをPDFに追加 。
  • Image(image_path, width=200, height=150) で 200×150ポイントの画像を読み込む 。
  • elements = [paragraph, image] で パラグラフと画像をリストに格納し、PDFに追加 。
  • doc.build(elements) を実行し、PDFにパラグラフと画像を配置し保存 。

このコードを実行すると、A4サイズのPDFにパラグラフ(テキスト)と、その下に画像が表示 されます。
画像サイズを変更したり、getSampleStyleSheet() を使って異なるスタイルを適用することで、よりレイアウトを調整することが可能です。

このように、複数の要素を順番にリストに追加して、PDF全体に複雑なレイアウトを作成することができます。

スポンサーリンク

PDFの保存と最適化

ReportLabでPDFを生成する際、作成したファイルを保存する方法や、ファイルサイズの最適化、セキュリティオプション(例えば、パスワード保護)などを考慮する必要があります。この章では、PDFの保存方法や最適化のテクニック、セキュリティ設定について解説します。

PDFの保存

ReportLabでPDFを生成した後、通常はsave()メソッドを使ってファイルに内容を保存します。保存の流れは非常にシンプルで、すべての描画操作が完了した後にsave()を呼ぶだけです。

基本的な保存の例は次のようになります。

Python
from reportlab.pdfgen import canvas

# PDFファイルの作成
c = canvas.Canvas("simple_pdf.pdf")

# テキストを追加
c.drawString(100, 750, "Hello, ReportLab!")

# PDFを保存して閉じる
c.save()
  • save():これを呼び出すことで、すべての描画内容がファイルに書き込まれ、PDFファイルとして保存されます。このメソッドを呼ばないと、PDFが作成されないので忘れずに実行します。

ファイルサイズの最適化

ReportLabで生成されるPDFのファイルサイズは、内容によって大きく異なります。特に画像を含む場合、サイズが大きくなりがちです。以下のテクニックを使って、PDFファイルのサイズを最適化することができます。

画像の最適化

PDFに画像を挿入する際、画像の解像度やフォーマットを適切に設定することで、ファイルサイズを減らすことが可能です。

  • 画像のリサイズ
    PDFに挿入する前に、画像のサイズや解像度を調整します。たとえば、高解像度の画像をそのまま挿入するのではなく、必要な解像度に下げるとファイルサイズが小さくなります。
  • 圧縮形式の選択
    JPEGは、圧縮率が高くファイルサイズが小さくなるため、写真やイメージが多い場合に適しています。一方、PNGは、無劣化圧縮でグラフィックスやアイコンなどに向いています。

以下は、リサイズした画像をPDFに挿入する例です。

Python
from reportlab.pdfgen import canvas

# PDFファイルの作成
c = canvas.Canvas("optimized_image_pdf.pdf")

# リサイズした画像を挿入
c.drawImage("example_image.jpg", 100, 500, width=100, height=75)

# PDFを保存
c.save()

圧縮設定の利用

canvasクラスには、画像を圧縮するためのオプションも用意されています。setImageCompression()メソッドを使うと、画像を挿入する際にJPEG圧縮を適用することが可能です。

Python
from reportlab.pdfgen import canvas

# PDFファイルの作成
c = canvas.Canvas("compressed_image_pdf.pdf")

# 画像圧縮を設定
c.setImageCompression(0.5)  # 圧縮率を設定(0〜1の範囲)

# 画像を挿入
c.drawImage("example_image.jpg", 100, 500, width=100, height=75)

# PDFを保存
c.save()
  • setImageCompression(0.5):圧縮率を0(無圧縮)から1(最大圧縮)まで設定します。ここでは0.5の圧縮率を使用して、適度な品質を保ちながらファイルサイズを減らしています。

フォントの最適化

ReportLabでは、埋め込みフォントのサイズもファイルサイズに影響します。通常、標準フォント(HelveticaTimes-Romanなど)はPDFの中で軽量に扱われますが、カスタムフォントを使用する場合は、埋め込むフォントの容量によってファイルサイズが大きくなることがあります。

もしファイルサイズの問題が発生した場合、標準フォントの利用や、必要以上にフォントを埋め込まないようにすることが有効です。

PDFのセキュリティ

ReportLabでは、生成したPDFにパスワードをかけたり、特定の操作(印刷、コピーなど)を制限することができます。これには、canvasクラスのencrypt()メソッドを使用します。PDFにパスワードを設定する場合、閲覧パスワードや、編集パスワードを設定することが可能です。

以下は、PDFに閲覧パスワードを設定する例です。

Python
from reportlab.pdfgen import canvas

# PDFファイルの作成(ファイル名を指定)
c = canvas.Canvas("secured_pdf.pdf")

# PDFにパスワードを設定(ユーザーパスワードとオーナーパスワードを設定)
c.encrypt(userPassword="userpass", ownerPassword="ownerpass")

# テキストを追加(左から100ポイント、下から750ポイントの位置)
c.drawString(100, 750, "This PDF is password protected.")

# PDFを保存(save() を実行しないとファイルが作成されない)
c.save()
コードの解説
  • canvas.Canvas("secured_pdf.pdf") で 新しいPDFファイルを作成 。
  • encrypt(userPassword="userpass", ownerPassword="ownerpass") で PDFにパスワードを設定 。
    • userPassword="userpass" → ユーザーが開くためのパスワード 。
    • ownerPassword="ownerpass" → 管理者用パスワード(編集権限) 。
  • drawString(100, 750, "This PDF is password protected.") で パスワード保護のメッセージを描画 。
  • save() を実行し、PDFを保存 。

このコードを実行すると、開く際に「userpass」を入力しないと閲覧できないPDF が生成されます。
管理者は「ownerpass」を使って、制限を解除したり編集したりすることが可能 です。

PDFのアクセス権の制限

パスワード保護に加えて、PDF内の特定の操作(印刷、コピー、編集など)を制限することも可能です。encrypt()メソッドの引数にオプションを指定して、操作制限を設定できます。

Python
from reportlab.pdfgen import canvas

# PDFファイルの作成(ファイル名を指定)
c = canvas.Canvas("restricted_pdf.pdf")

# 印刷とコピーを制限し、パスワードを設定
c.encrypt(userPassword="userpass", canPrint=0, canCopy=0)

# テキストを追加(左から100ポイント、下から750ポイントの位置)
c.drawString(100, 750, "Printing and copying are disabled.")

# PDFを保存(save() を実行しないとファイルが作成されない)
c.save()
コードの解説
  • canvas.Canvas("restricted_pdf.pdf") で 新しいPDFファイルを作成 。
  • encrypt(userPassword="userpass", canPrint=0, canCopy=0) で PDFのアクセス制限を設定 。
    • userPassword="userpass" → ユーザーがPDFを開くためのパスワード 。
    • canPrint=0 → 印刷を禁止 。
    • canCopy=0 → テキストや画像のコピーを禁止 。
  • drawString(100, 750, "Printing and copying are disabled.") で 制限がかかっていることを示すメッセージを描画 。
  • save() を実行し、PDFを保存 。

このコードを実行すると、「userpass」を入力しないと開けず、印刷とコピーが制限されたPDF が作成されます。
セキュリティが必要な文書の保護に活用できます。

これにより、特定の権限を持つユーザーのみがPDFの操作を行えるようになります。

スポンサーリンク

実用的な例: 請求書の作成

ReportLabを使うと、ビジネスシーンでよく利用される請求書などのドキュメントを動的に生成することができます。この章では、請求書のレイアウトを作成し、データベースや入力データに基づいて動的にPDFを生成する方法を紹介します。

基本的な請求書レイアウト

請求書には、通常以下のような要素が含まれます。

  • 会社情報やロゴ
  • 請求先情報
  • 請求書番号や日付
  • 商品やサービスのリスト、数量、価格
  • 合計金額
  • 備考欄やメッセージ

まずは、これらの要素を含む基本的な請求書のレイアウトを作成してみます。

Python
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
from reportlab.lib.styles import getSampleStyleSheet

# PDFドキュメントの作成(A4サイズの請求書)
doc = SimpleDocTemplate("invoice_example.pdf", pagesize=A4)

# スタイルシートの取得
styles = getSampleStyleSheet()

# 請求書のタイトル(大きなフォントで表示)
title = Paragraph("請求書", styles["Title"])

# 会社情報(ダミーデータ)
company_info = [
    ["会社名:", "株式会社サンプル"],
    ["住所:", "東京都千代田区1-2-3"],
    ["電話番号:", "03-1234-5678"],
    ["Eメール:", "info@sample.co.jp"]
]
company_table = Table(company_info)

# 請求先情報(ダミーデータ)
customer_info = [
    ["請求先:", "株式会社クライアント"],
    ["住所:", "大阪府大阪市中央区1-2-3"],
    ["電話番号:", "06-9876-5432"]
]
customer_table = Table(customer_info)

# 商品情報(ダミーデータ)
item_data = [
    ["商品名", "数量", "単価", "金額"],  # ヘッダー行
    ["商品A", "2", "500", "1000"],
    ["商品B", "1", "1200", "1200"],
    ["商品C", "3", "300", "900"]
]
item_table = Table(item_data, colWidths=[200, 50, 50, 70])  # 列幅を設定

# 商品情報テーブルのスタイル設定
item_table.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), colors.grey),  # ヘッダー行の背景色
    ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),  # ヘッダー行の文字色
    ('ALIGN', (0, 0), (-1, -1), 'CENTER'),  # 全セルを中央揃え
    ('GRID', (0, 0), (-1, -1), 1, colors.black)  # 枠線を追加
]))

# 合計金額(ダミーデータ)
total = [["合計金額:", "3100"]]
total_table = Table(total, colWidths=[300, 70])

# PDFに要素を追加(会社情報・請求先情報・商品情報・合計金額)
elements = [title, company_table, Paragraph(" "), customer_table, Paragraph(" "), item_table, Paragraph(" "), total_table]

# PDFのビルド(ドキュメントを構築し保存)
doc.build(elements)
コードの解説
  1. SimpleDocTemplate("invoice_example.pdf", pagesize=A4) で A4サイズのPDFを作成 。
  2. Paragraph("請求書", styles["Title"]) で タイトル(請求書)を作成 。
  3. Table(company_info) で 会社情報のテーブルを作成 。
  4. Table(customer_info) で 請求先情報のテーブルを作成 。
  5. Table(item_data, colWidths=[200, 50, 50, 70]) で 商品情報の表を作成 。
    • setStyle() を使って ヘッダーの背景色や文字色を変更し、枠線を追加 。
  6. Table(total, colWidths=[300, 70]) で 合計金額のテーブルを作成 。
  7. elements = [title, company_table, Paragraph(" "), customer_table, Paragraph(" "), item_table, Paragraph(" "), total_table] で 各要素をリストに格納 し、適切な間隔を空けるため Paragraph(" ")を追加。
  8. doc.build(elements) を実行し、PDFにデータを追加して保存 。

このコードを実行すると、請求書のフォーマットに従ったPDFが作成 されます。
TableStyle を調整することで、さらにデザインをカスタマイズできます。

データベースと連携したPDF生成

実際のビジネスシナリオでは、請求書のデータはデータベースから取得し、そのデータを基に動的にPDFを生成することが一般的です。たとえば、以下のようにデータベースのデータを取得して、請求書の内容を動的に設定することができます。

Python
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
from reportlab.lib.styles import getSampleStyleSheet

# PDFドキュメントの作成
doc = SimpleDocTemplate("dynamic_invoice.pdf", pagesize=A4)

# スタイルシートの取得
styles = getSampleStyleSheet()

# データベースから請求データを取得(仮想データ)
invoice_data = {
    "company_name": "株式会社サンプル",
    "company_address": "東京都千代田区1-2-3",
    "company_phone": "03-1234-5678",
    "company_email": "info@sample.co.jp",
    "customer_name": "株式会社クライアント",
    "customer_address": "大阪府大阪市中央区1-2-3",
    "customer_phone": "06-9876-5432",
    "items": [
        {"name": "商品A", "quantity": 2, "price": 500},
        {"name": "商品B", "quantity": 1, "price": 1200},
        {"name": "商品C", "quantity": 3, "price": 300}
    ]
}

# 請求書のタイトル
title = Paragraph("請求書", styles["Title"])

# 会社情報のテーブル
company_info = [
    ["会社名:", invoice_data["company_name"]],
    ["住所:", invoice_data["company_address"]],
    ["電話番号:", invoice_data["company_phone"]],
    ["Eメール:", invoice_data["company_email"]]
]
company_table = Table(company_info)

# 請求先情報のテーブル
customer_info = [
    ["請求先:", invoice_data["customer_name"]],
    ["住所:", invoice_data["customer_address"]],
    ["電話番号:", invoice_data["customer_phone"]]
]
customer_table = Table(customer_info)

# 商品リストの作成
item_data = [["商品名", "数量", "単価", "金額"]]
for item in invoice_data["items"]:
    total_price = item["quantity"] * item["price"]
    item_data.append([item["name"], item["quantity"], item["price"], total_price])

# 商品情報のテーブル(カラム幅設定)
item_table = Table(item_data, colWidths=[200, 50, 50, 70])

# 商品情報テーブルのスタイル設定
item_table.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), colors.grey),  # ヘッダー行の背景色
    ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),  # ヘッダー行の文字色
    ('ALIGN', (0, 0), (-1, -1), 'CENTER'),  # 全セルを中央揃え
    ('GRID', (0, 0), (-1, -1), 1, colors.black)  # 枠線を追加
]))

# 合計金額を計算
total_amount = sum(item["quantity"] * item["price"] for item in invoice_data["items"])
total = [["合計金額:", f"{total_amount} 円"]]
total_table = Table(total, colWidths=[300, 70])

# PDFに要素を追加
elements = [title, company_table, Paragraph(" "), customer_table, Paragraph(" "), item_table, Paragraph(" "), total_table]

# PDFのビルド
doc.build(elements)
コードの解説
  1. SimpleDocTemplate("dynamic_invoice.pdf", pagesize=A4) で A4サイズのPDFを作成 。
  2. invoice_data に 仮想データを格納し、動的に請求情報を取得 。
  3. Table(company_info) で 会社情報のテーブルを作成 。
  4. Table(customer_info) で 請求先情報のテーブルを作成 。
  5. item_data に 商品の情報を動的に追加 し、Table(item_data, colWidths=[200, 50, 50, 70]) で 商品情報の表を作成 。
    • setStyle() を使って ヘッダーの背景色や文字色を変更し、枠線を追加 。
  6. total_amount を計算し、合計金額を動的に取得 。
  7. elements = [...] に タイトル・会社情報・請求先情報・商品情報・合計金額を順番に追加 。
  8. doc.build(elements) を実行し、請求書形式のPDFを保存 。

このコードを実行すると、データベースから取得した情報を基に動的な請求書PDFを作成 できます。
データを変更すれば、異なる請求書を簡単に生成することが可能です。

データベースから取得したデータをitem_dataに変換し、PDFに渡すことで、動的に請求書を生成できます。これにより、毎回手動でデータを入力する手間を省き、大量の請求書を効率的に生成することが可能です。

スポンサーリンク

ReportLabの拡張機能

ReportLabは、低レベルのcanvasクラスを使った細かい描画だけでなく、より高度なレポート生成をサポートする高レベルAPIも提供しています。その中心となるのが「Platypus(プラティパス)」です。Platypusは、レイアウトやスタイルを管理しながら、複数の要素を組み合わせてPDFを構築するための便利なツールです。この章では、Platypusの基本機能と、それを活用した拡張的なレポート生成方法について解説します。

Platypusとは?

Platypusは、ReportLabに組み込まれている「Page Layout and Typography Using Scripts」の略で、高度なPDFレイアウトを作成するためのフレームワークです。テキスト、表、画像などの要素(「Flowables」と呼ばれる)を順番に追加し、それらを自動的にレイアウトしてくれます。レポートやニュースレター、複雑なビジネス文書など、複数ページにわたるドキュメントを構築するのに非常に役立ちます。

Platypusの基本構造

Platypusを使ったPDF作成の基本的な流れは次の通りです。

  1. SimpleDocTemplateでPDFのテンプレートを作成。
  2. Flowable(ParagraphTableImageなど)を作成。
  3. Flowableをリストに追加し、それをbuild()メソッドでPDFにレンダリング。

以下のコードは、基本的なPlatypusの使用例です。

Python
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image
from reportlab.lib.styles import getSampleStyleSheet

# PDFドキュメントの作成(A4サイズ)
doc = SimpleDocTemplate("platypus_example.pdf", pagesize=A4)

# スタイルシートの取得
styles = getSampleStyleSheet()

# コンテンツの作成(タイトル、テキスト、画像)
title = Paragraph("PlatypusによるPDF生成", styles["Title"])  # タイトル(大きなフォント)
text = Paragraph("これはPlatypusを使って作成したPDFの例です。段落や画像、表などを簡単にレイアウトできます。", styles["Normal"])  # 段落
image = Image("example_image.jpg", width=200, height=100)  # 画像の挿入(指定サイズ)

# スペーサー(要素間の余白)
spacer = Spacer(1, 12)  # 12ポイントの空白を挿入

# Flowableをリストに追加(タイトル→間隔→テキスト→間隔→画像)
elements = [title, spacer, text, spacer, image]

# PDFのビルド(要素を追加して保存)
doc.build(elements)
コードの解説
  1. SimpleDocTemplate("platypus_example.pdf", pagesize=A4) で A4サイズのPDFを作成 。
  2. getSampleStyleSheet() で 標準のスタイルを取得 し、テキストに適用。
  3. Paragraph("PlatypusによるPDF生成", styles["Title"]) で タイトルを作成 。
  4. Paragraph("これは...") で 本文を作成 。
  5. Image("example_image.jpg", width=200, height=100) で 画像を追加 。
  6. Spacer(1, 12) で タイトル・本文・画像の間に12ポイントの余白を追加 。
  7. elements = [title, spacer, text, spacer, image] で PDFに追加する要素をリストに格納 。
  8. doc.build(elements) を実行し、PDFにコンテンツを配置して保存 。

このコードを実行すると、タイトル・本文・画像を適切にレイアウトしたPDF が作成されます。
Spacer() を活用することで、要素間の余白を調整 し、読みやすいレイアウトを作成できます。

テーブルとグラフを組み合わせたレイアウト

Platypusでは、Flowableを使って表やグラフを複雑なレイアウトに組み込むこともできます。以下は、テーブルと棒グラフをPDFに挿入する例です。

Python
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.graphics.shapes import Drawing
from reportlab.graphics.charts.barcharts import VerticalBarChart
from reportlab.lib import colors

# PDFドキュメントの作成(A4サイズ)
doc = SimpleDocTemplate("table_chart_example.pdf", pagesize=A4)

# スタイルシートの取得
styles = getSampleStyleSheet()

# テーブルデータ(売上レポート)
data = [
    ["項目", "値"],  # ヘッダー
    ["売上", "50000"],  # 売上データ
    ["利益", "12000"],  # 利益データ
    ["コスト", "38000"]  # コストデータ
]

# テーブルの作成(データをテーブルに変換)
table = Table(data)

# テーブルのスタイル設定(ヘッダーの背景色、文字色、中央揃え、枠線)
table.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), colors.grey),  # ヘッダー行の背景をグレーに
    ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),  # ヘッダー行の文字を白に
    ('ALIGN', (0, 0), (-1, -1), 'CENTER'),  # 全セルを中央揃え
    ('GRID', (0, 0), (-1, -1), 1, colors.black)  # 全セルに枠線を追加
]))

# グラフの作成
drawing = Drawing(400, 200)  # グラフの描画領域
barchart = VerticalBarChart()
barchart.x = 50  # X座標(左からの位置)
barchart.y = 50  # Y座標(下からの位置)
barchart.height = 125  # グラフの高さ
barchart.width = 300  # グラフの幅
barchart.data = [[50000, 12000, 38000]]  # グラフデータ
barchart.categoryAxis.categoryNames = ['売上', '利益', 'コスト']  # X軸のラベル
barchart.bars[0].fillColor = colors.blue  # 棒の色を青に設定
drawing.add(barchart)  # グラフを描画領域に追加

# スペーサー(要素間の余白)
spacer = Spacer(1, 12)

# PDFに要素を追加(タイトル→間隔→テーブル→間隔→グラフ)
elements = [Paragraph("売上レポート", styles["Title"]), spacer, table, spacer, drawing]

# PDFのビルド(要素を追加して保存)
doc.build(elements)
コードの解説
  1. SimpleDocTemplate("table_chart_example.pdf", pagesize=A4) で A4サイズのPDFを作成 。
  2. Table(data) で 売上データのテーブルを作成 し、TableStyle() で ヘッダーの背景色や枠線を設定 。
  3. Drawing(400, 200) で グラフを描画する領域を作成 。
  4. VerticalBarChart() を使い、売上・利益・コストの棒グラフを作成 。
  5. Spacer(1, 12) で タイトル・表・グラフの間に余白を追加 。
  6. elements = [...] に タイトル・テーブル・グラフを追加 し、適切に配置。
  7. doc.build(elements) を実行し、売上レポートのPDFを生成 。

このコードを実行すると、売上レポートのテーブルと棒グラフがセットになったPDFが作成 されます。
数値を変更すれば、異なるデータの売上レポートを簡単に作成できます。

ReportLab Platypusの活用例

Platypusを使うことで、以下のような高度なレイアウトを実現できます。

  • 複数ページのレポート
    Platypusは、複数ページにわたるレポートを自動的にレイアウトします。テキストがページの最後に到達すると、新しいページに移動して内容を続けます。
  • 複雑なグリッドレイアウト
    複数のテーブルや画像をページ全体に均等に配置することができます。スタイルを細かく設定することで、プロフェッショナルなドキュメントを作成できます。
  • ダッシュボードの作成
    グラフや表を組み合わせ、ビジネスレポートやダッシュボード風のレイアウトを作成できます。データを視覚的に表示するためのツールとしても非常に強力です。

さらに学びたい方へ

ReportLabの使い方をもっと深く学びたい方におすすめのリソースを紹介します。

🎥 Udemy講座

実際に動画を見て勉強したい方には今回は特に以下の講座がオススメですよ!
以下のリンクからぜひ内容を確認してみてくださいね。

まとめ

Platypusは、より高機能で複雑なPDFレイアウトを構築するための便利なフレームワークです。テキスト、画像、表、グラフなどの複数の要素を簡単に組み合わせ、ビジネス文書やレポートなど、さまざまなドキュメントを動的に生成するのに最適です。

これでReportLabの解説は終了です。ReportLabを使うことで、PythonでのPDF生成が非常に強力で柔軟になることが分かったかと思います。ぜひ、実際にプロジェクトで使用してみてください!

brian
brian

ここまで読んでいただきありがとうございます!

UdemyのPythonコースにはオンラインで学習ができる動画コンテンツがたくさんあります。

当ブログのような文章メインの説明では足りない箇所を補えると思うので、もっと詳しく勉強したいという方はぜひチェックしてみてください!

コメント

タイトルとURLをコピーしました