
PDF作成の「次」のステップへ
前回の記事では、ReportLabの基本的な使い方を学び、シンプルなテキストや図形を含むPDFを生成する第一歩を踏み出しました。しかし、ビジネスレポートやデータ分析結果を伝える資料など、よりプロフェッショナルなPDFを作成するには、複雑なレイアウトやグラフ描画といった高度な機能が不可欠です。
「ReportLabは学習コストが高い」と感じる方もいるかもしれません。しかし、その強力な機能を使いこなせば、手作業では考えられないほど効率的に、そして美しく、データ駆動型のPDFを自動生成できるようになります。
この記事では、ReportLabの真骨頂とも言える「複雑なレイアウト」と「グラフ描画」に焦点を当て、あなたのPDF作成スキルを次のレベルへと引き上げます。単なる機能紹介に留まらず、具体的なコード例と実践的なシナリオを通して、ReportLabがあなたのプロジェクトでどのように役立つのかを深く掘り下げていきましょう。
対象読者
- PythonでのPDF自動生成に興味がある開発者
- ReportLabの基本を理解し、さらに高度な表現を追求したいエンジニア
- データ分析結果をプロフェッショナルなレポートとして出力したいデータサイエンティストやアナリスト
- 業務でPDFレポートの自動生成やカスタマイズが求められている方
動作検証環境
この記事で紹介する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
目次
- ReportLabのフローアブルフレームとストーリー:テキストの自動流し込みと段組みレイアウト
- テキストの自動流し込み
- 段組みレイアウトの実現
- テーブル(表)の作成とスタイリング:データを美しく整理する
- シンプルなテーブルの作成
- セルの結合、背景色、罫線などのカスタマイズ
- グラフの描画:データを視覚的に表現する
- ReportLab Graphicsの概要
- 棒グラフ、折れ線グラフの作成
- 棒グラフの例
- 折れ線グラフの例
- グラフのカスタマイズとPDFへの埋め込み
- 実践例:データ分析レポートの自動生成
- コード例:月次データ分析レポートの自動生成
- コードの解説
- まとめ:ReportLabで実現する表現豊かなPDF
1. ReportLabのフローアブルフレームとストーリー:テキストの自動流し込みと段組みレイアウト
ReportLabで複雑なレイアウトを実現する上で欠かせないのが、「フローアブルフレーム(Flowable Frame)」と「ストーリー(Story)」の概念です。これらを理解することで、テキストの自動流し込みや段組みといった、DTPソフトウェアのような高度なレイアウトが可能になります。
テキストの自動流し込み
ReportLabでは、Paragraph
オブジェクトを使ってテキストを扱います。この Paragraph
を Frame
に追加することで、フレームの範囲内でテキストが自動的に折り返され、必要に応じて次のフレームへと流し込まれます。
from reportlab.platypus import SimpleDocTemplate, Paragraph, Flowable
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
# 日本語フォントを登録
pdfmetrics.registerFont(UnicodeCIDFont("HeiseiMin-W3"))
styles = getSampleStyleSheet()
# 日本語表示用の新しいスタイルを作成
# 親スタイルを'Normal'とし、フォント名を登録した日本語フォントに設定
japanese_style = ParagraphStyle(
name="Japanese",
parent=styles["Normal"],
fontName="HeiseiMin-W3",
)
doc = SimpleDocTemplate("flowable_text.pdf")
story: list[Flowable] = []
# 長いテキストを用意
long_text = "ReportLabはPythonでPDFドキュメントを生成するための強力なライブラリです。このライブラリを使うことで、テキスト、画像、図形、テーブル、グラフなど、様々な要素をPDFに組み込むことができます。特に、動的なデータからレポートや請求書、契約書などを自動生成する際にその真価を発揮します。ReportLabの学習曲線はやや急ですが、一度習得すれば、手作業では困難な複雑なドキュメント作成も容易になります。このセクションでは、ReportLabのフローアブルフレームとストーリーの概念を深く掘り下げ、テキストの自動流し込みや段組みレイアウトの実現方法について解説します。これにより、よりプロフェッショナルで読みやすいPDFドキュメントを作成するための基盤を築くことができます。"
# 作成した日本語スタイルを適用して段落を作成
p = Paragraph(long_text, japanese_style)
story.append(p)
# ドキュメントをビルド
doc.build(story)
print("flowable_text.pdf を生成しました。")
段組みレイアウトの実現
複数の Frame
を定義し、それらを PageTemplate
に割り当てることで、段組みレイアウトを実現できます。これにより、雑誌や新聞のような視覚的に魅力的なドキュメントを作成できます。
from reportlab.platypus import (
SimpleDocTemplate,
Paragraph,
Frame,
PageTemplate,
NextPageTemplate,
Flowable,
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
# 日本語フォントを登録
pdfmetrics.registerFont(UnicodeCIDFont("HeiseiMin-W3"))
styles = getSampleStyleSheet()
# 日本語表示用の新しいスタイルを作成
japanese_style = ParagraphStyle(
name="Japanese",
parent=styles["Normal"],
fontName="HeiseiMin-W3",
)
doc = SimpleDocTemplate("two_column_layout.pdf", pagesize=A4)
story: list[Flowable] = []
# 長いテキストを用意
long_text = "ReportLabはPythonでPDFドキュメントを生成するための強力なライブラリです。このライブラリを使うことで、テキスト、画像、図形、テーブル、グラフなど、様々な要素をPDFに組み込むことができます。特に、動的なデータからレポートや請求書、契約書などを自動生成する際にその真価を発揮します。ReportLabの学習曲線はやや急ですが、一度習得すれば、手作業では困難な複雑なドキュメント作成も容易になります。このセクションでは、ReportLabのフローアブルフレームとストーリーの概念を深く掘り下げ、テキストの自動流し込みや段組みレイアウトの実現方法について解説します。これにより、よりプロフェッショナルで読みやすいPDFドキュメントを作成するための基盤を築くことができます。ReportLabはPythonでPDFドキュメントを生成するための強力なライブラリです。このライブラリを使うことで、テキスト、画像、図形、テーブル、グラフなど、様々な要素をPDFに組み込むことができます。特に、動的なデータからレポートや請求書、契約書などを自動生成する際にその真価を発揮します。ReportLabの学習曲線はやや急ですが、一度習得すれば、手作業では困難な複雑なドキュメント作成も容易になります。このセクションでは、ReportLabのフローアブルフレームとストーリーの概念を深く掘り下げ、テキストの自動流し込みや段組みレイアウトの実現方法について解説します。これにより、よりプロフェッショナルで読みやすいPDFドキュメントを作成するための基盤を築くことができます。"
# 2つのフレームを定義
frame1 = Frame(
doc.leftMargin,
doc.bottomMargin,
doc.width / 2 - 6,
doc.height,
id="col1",
leftPadding=6,
bottomPadding=6,
rightPadding=6,
topPadding=6,
showBoundary=1,
)
frame2 = Frame(
doc.leftMargin + doc.width / 2 + 6,
doc.bottomMargin,
doc.width / 2 - 6,
doc.height,
id="col2",
leftPadding=6,
bottomPadding=6,
rightPadding=6,
topPadding=6,
showBoundary=1,
)
# ページテンプレートを作成し、フレームを割り当てる
doc.addPageTemplates([PageTemplate(id="TwoCol", frames=[frame1, frame2])])
# ストーリーにテキストを追加
story.append(NextPageTemplate("TwoCol"))
story.append(Paragraph(long_text, japanese_style))
# ドキュメントをビルド
doc.build(story)
print("two_column_layout.pdf を生成しました。")
2. テーブル(表)の作成とスタイリング:データを美しく整理する
ReportLabの Table
オブジェクトは、構造化されたデータをPDFに表示するための強力なツールです。シンプルな表から、セルの結合や複雑なスタイリングを施したプロフェッショナルな表まで、柔軟に作成できます。
シンプルなテーブルの作成
まずは、基本的なテーブルの作成方法を見ていきましょう。データはPythonのリストのリストとして表現します。
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Flowable
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
# 日本語フォントを登録
pdfmetrics.registerFont(UnicodeCIDFont("HeiseiMin-W3"))
doc = SimpleDocTemplate("simple_table.pdf", pagesize=A4)
story: list[Flowable] = []
data = [
["ヘッダー1", "ヘッダー2", "ヘッダー3"],
["データA1", "データA2", "データA3"],
["データB1", "データB2", "データB3"],
["データC1", "データC2", "データC3"],
]
table = Table(data)
# テーブルスタイルを定義
style = TableStyle(
[
("FONT", (0, 0), (-1, -1), "HeiseiMin-W3"),
("GRID", (0, 0), (-1, -1), 1, colors.black),
("BACKGROUND", (0, 0), (-1, 0), colors.lightgrey),
]
)
table.setStyle(style)
story.append(table)
doc.build(story)
print("simple_table.pdf を生成しました。")
セルの結合、背景色、罫線などのカスタマイズ
TableStyle
を使うことで、テーブルの見た目を細かく制御できます。セルの結合、背景色の設定、罫線のスタイル変更など、様々なカスタマイズが可能です。
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Flowable
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
# 日本語フォントを登録
pdfmetrics.registerFont(UnicodeCIDFont("HeiseiMin-W3"))
doc = SimpleDocTemplate("styled_table.pdf", pagesize=A4)
story: list[Flowable] = []
data = [
["結合セル", "", "ヘッダー3"],
["データA1", "データA2", "データA3"],
["データB1", "データB2", "データB3"],
["データC1", "データC2", "データC3"],
]
table = Table(data)
table.setStyle(
TableStyle(
[
("FONT", (0, 0), (-1, -1), "HeiseiMin-W3"), # 日本語フォントを全体に適用
("BACKGROUND", (0, 0), (-1, 0), colors.grey), # ヘッダー行の背景色
("TEXTCOLOR", (0, 0), (-1, 0), colors.whitesmoke), # ヘッダー行のテキスト色
("ALIGN", (0, 0), (-1, -1), "CENTER"), # 全体を中央揃え
("BOTTOMPADDING", (0, 0), (-1, 0), 12), # ヘッダー行の下パディング
("BACKGROUND", (0, 1), (-1, -1), colors.beige), # データ行の背景色
("GRID", (0, 0), (-1, -1), 1, colors.black), # 全体に罫線
("SPAN", (0, 0), (1, 0)), # (0,0)から(1,0)までセルを結合
]
)
)
story.append(table)
doc.build(story)
print("styled_table.pdf を生成しました。")
3. グラフの描画:データを視覚的に表現する
ReportLabは、ReportLab Graphics
というサブパッケージを提供しており、棒グラフ、折れ線グラフ、円グラフなど、様々な種類のグラフをPDFに直接描画できます。これにより、データ分析の結果を視覚的に分かりやすく伝えることができます。
ReportLab Graphicsの概要
ReportLab Graphics
は、グラフのデータ、スタイル、描画領域などをオブジェクトとして定義し、それらを組み合わせてグラフを作成します。
棒グラフ、折れ線グラフの作成
ここでは、棒グラフと折れ線グラフの基本的な作成方法を見ていきましょう。
棒グラフの例
from typing import cast
from reportlab.graphics.shapes import Drawing
from reportlab.graphics.charts.barcharts import VerticalBarChart
from reportlab.graphics.charts.axes import CategoryAxis, ValueAxis
from reportlab.graphics.charts.textlabels import Label
from reportlab.platypus import SimpleDocTemplate, Flowable
from reportlab.lib.pagesizes import A4
# PDFドキュメントを作成する設定
doc = SimpleDocTemplate("bar_chart.pdf", pagesize=A4)
# Flowableオブジェクトを保持するリスト
story: list[Flowable] = []
# 描画領域(幅400、高さ200)の作成
drawing = Drawing(400, 200)
# 棒グラフに表示するデータ(1行分の値)
data = [(10, 20, 30, 40, 50)] # データのリスト
# VerticalBarChart(縦棒グラフ)のインスタンス作成
bc = VerticalBarChart()
# グラフの位置とサイズを設定
bc.x = 50 # 左から50ポイント
bc.y = 50 # 下から50ポイント
bc.height = 125 # 高さ125ポイント
bc.width = 300 # 幅300ポイント
# データを設定
bc.data = data
# 値軸(Y軸)のプロパティを取得し設定
value_axis = cast(ValueAxis, bc.valueAxis)
value_axis.valueMin = 0 # 最小値
value_axis.valueMax = 60 # 最大値
value_axis.valueStep = 10 # ステップ幅
# カテゴリ軸(X軸)のプロパティを取得し設定
category_axis = cast(CategoryAxis, bc.categoryAxis)
labels = cast(Label, category_axis.labels)
# ラベルの配置を設定
labels.boxAnchor = "ne" # 上右(NE)に揃える
labels.dx = 8 # X方向のオフセット
labels.dy = -2 # Y方向のオフセット
# X軸に表示するカテゴリ名を設定
category_axis.categoryNames = ["Jan", "Feb", "Mar", "Apr", "May"]
# グラフを描画領域に追加
drawing.add(bc)
# 描画領域をストーリーリストへ追加
story.append(drawing)
# PDFに描画領域をビルドして保存
doc.build(story)
print("bar_chart.pdf を生成しました。")
折れ線グラフの例
from typing import cast
from reportlab.graphics.shapes import Drawing
from reportlab.graphics.charts.linecharts import HorizontalLineChart
from reportlab.graphics.charts.axes import CategoryAxis, ValueAxis
from reportlab.graphics.charts.textlabels import Label
from reportlab.platypus import SimpleDocTemplate, Flowable
from reportlab.lib.pagesizes import A4
# PDF作成用のドキュメントオブジェクトを生成
doc = SimpleDocTemplate("line_chart.pdf", pagesize=A4)
# Flowable(レイアウト可能なオブジェクト)のリストを用意
story: list[Flowable] = []
# 描画領域(幅400, 高さ200)を作成
drawing = Drawing(400, 200)
# 複数のデータセットを定義(2本の折れ線グラフ)
data = [(10, 20, 30, 40, 50), (50, 40, 30, 20, 10)] # 複数のデータセット
# 水平折れ線チャートを作成
lc = HorizontalLineChart()
# チャートの位置とサイズを設定
lc.x = 50 # X座標(左端からの距離)
lc.y = 50 # Y座標(下端からの距離)
lc.height = 125 # チャートの高さ
lc.width = 300 # チャートの幅
# データをセット
lc.data = data
# 複数ラインを1本の線として描画するかどうか(1なら結合)
lc.joinedLines = 1
# 値軸(Y軸)の設定
value_axis = cast(ValueAxis, lc.valueAxis)
value_axis.valueMin = 0 # 最小値
value_axis.valueMax = 60 # 最大値
value_axis.valueStep = 10 # ステップ幅
# カテゴリ軸(X軸)の設定
category_axis = cast(CategoryAxis, lc.categoryAxis)
labels = cast(Label, category_axis.labels)
# ラベルの配置を調整
labels.boxAnchor = "ne" # 右上にアンカー
labels.dx = 8 # X方向のオフセット
labels.dy = -2 # Y方向のオフセット
# X軸に表示するカテゴリ名を設定
category_axis.categoryNames = ["Jan", "Feb", "Mar", "Apr", "May"]
# チャートを描画領域に追加
drawing.add(lc)
# 描画領域をストーリーリストへ追加
story.append(drawing)
# PDFに描画領域をビルドして保存
doc.build(story)
print("line_chart.pdf を生成しました。")
グラフのカスタマイズとPDFへの埋め込み
ReportLab Graphics
の各グラフオブジェクトは、色、線種、ラベル、凡例など、様々なプロパティをカスタマイズできます。これにより、ブランドイメージに合わせたグラフや、より情報を伝えやすいグラフを作成できます。
4. 実践例:データ分析レポートの自動生成
これまでに学んだフローアブルフレーム、テーブル、グラフ描画の技術を組み合わせることで、データ分析レポートの自動生成が可能になります。例えば、データベースから取得した月次売上データを元に、以下のようなレポートを自動で作成できます。
コード例:月次データ分析レポートの自動生成
from typing import cast
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import (
SimpleDocTemplate,
Paragraph,
Spacer,
Table,
TableStyle,
Flowable,
)
from reportlab.lib import colors
from reportlab.lib.units import inch
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.graphics.shapes import Drawing
from reportlab.graphics.charts.barcharts import VerticalBarChart
from reportlab.graphics.charts.linecharts import HorizontalLineChart
from reportlab.graphics.charts.lineplots import LinePlot
from reportlab.graphics.charts.axes import CategoryAxis, ValueAxis
from reportlab.graphics.charts.textlabels import Label
import pandas as pd
import numpy as np
def generate_data_analysis_report(output_filename: str = "data_analysis_report.pdf"):
doc = SimpleDocTemplate(output_filename, pagesize=letter)
# フォントの登録
pdfmetrics.registerFont(UnicodeCIDFont("HeiseiMin-W3"))
# スタイルの準備
styles = getSampleStyleSheet()
japanese_style_normal = ParagraphStyle(
name="JapaneseNormal", parent=styles["Normal"], fontName="HeiseiMin-W3"
)
japanese_style_h1 = ParagraphStyle(
name="JapaneseH1", parent=styles["h1"], fontName="HeiseiMin-W3"
)
japanese_style_h2 = ParagraphStyle(
name="JapaneseH2", parent=styles["h2"], fontName="HeiseiMin-W3"
)
story: list[Flowable] = []
# 1. データ準備 (サンプルデータ生成)
data = {
"Month": [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
],
"Sales": np.random.randint(100, 500, 12),
"Expenses": np.random.randint(50, 300, 12),
}
df = pd.DataFrame(data)
# 2. タイトルと概要
story.append(Paragraph("<b>月次データ分析レポート</b>", japanese_style_h1))
story.append(Spacer(1, 0.2 * inch))
story.append(
Paragraph(
f"作成日: {pd.Timestamp.now().strftime('%Y年%m月%d日')}",
japanese_style_normal,
)
)
story.append(Spacer(1, 0.5 * inch))
story.append(
Paragraph(
"本レポートは、過去12ヶ月間の売上と経費の動向を分析し、主要な傾向と洞察を提供します。",
japanese_style_normal,
)
)
story.append(Spacer(1, 0.5 * inch))
# 3. データテーブル
story.append(Paragraph("<b>1. 月次データ概要</b>", japanese_style_h2))
story.append(Spacer(1, 0.2 * inch))
table_data = [df.columns.tolist()] + df.values.tolist()
table = Table(table_data)
table.setStyle(
TableStyle(
[
("FONT", (0, 0), (-1, -1), "HeiseiMin-W3"),
("BACKGROUND", (0, 0), (-1, 0), colors.grey),
("TEXTCOLOR", (0, 0), (-1, 0), colors.whitesmoke),
("ALIGN", (0, 0), (-1, -1), "CENTER"),
("BOTTOMPADDING", (0, 0), (-1, 0), 12),
("BACKGROUND", (0, 1), (-1, -1), colors.beige),
("GRID", (0, 0), (-1, -1), 1, colors.black),
]
)
)
story.append(table)
story.append(Spacer(1, 0.5 * inch))
# 4. グラフの描画 (棒グラフ - 売上)
story.append(Paragraph("<b>2. 月次売上推移</b>", japanese_style_h2))
story.append(Spacer(1, 0.2 * inch))
drawing_bar = Drawing(400, 200)
bc = VerticalBarChart()
bc.x = 50
bc.y = 50
bc.height = 125
bc.width = 300
bc.data = [df["Sales"].tolist()]
value_axis_bar = cast(ValueAxis, getattr(bc, "valueAxis"))
value_axis_bar.valueMin = 0
value_axis_bar.valueMax = cast(float, df["Sales"].max()) * 1.2
value_axis_bar.valueStep = 100
category_axis_bar = cast(CategoryAxis, getattr(bc, "categoryAxis"))
labels_bar = cast(Label, category_axis_bar.labels)
labels_bar.boxAnchor = "ne"
labels_bar.dx = 8
labels_bar.dy = -2
labels_bar.angle = 30
category_axis_bar.categoryNames = df["Month"].tolist()
drawing_bar.add(bc)
story.append(drawing_bar)
story.append(Spacer(1, 0.5 * inch))
# 5. グラフの描画 (折れ線グラフ - 売上と経費)
story.append(Paragraph("<b>3. 売上と経費の比較</b>", japanese_style_h2))
story.append(Spacer(1, 0.2 * inch))
drawing_line = Drawing(400, 200)
lc = HorizontalLineChart()
lc.x = 50
lc.y = 50
lc.height = 125
lc.width = 300
lc.data = [df["Sales"].tolist(), df["Expenses"].tolist()]
lc.joinedLines = 1
lines = cast(list[LinePlot], getattr(lc, "lines"))
lines[0].strokeColor = colors.blue
lines[1].strokeColor = colors.red
value_axis_line = cast(ValueAxis, getattr(lc, "valueAxis"))
value_axis_line.valueMin = 0
value_axis_line.valueMax = (
max(cast(float, df["Sales"].max()), cast(float, df["Expenses"].max())) * 1.2
)
value_axis_line.valueStep = 100
category_axis_line = cast(CategoryAxis, getattr(lc, "categoryAxis"))
labels_line = cast(Label, category_axis_line.labels)
labels_line.boxAnchor = "ne"
labels_line.dx = 8
labels_line.dy = -2
labels_line.angle = 30
category_axis_line.categoryNames = df["Month"].tolist()
drawing_line.add(lc)
story.append(drawing_line)
story.append(Spacer(1, 0.5 * inch))
# 6. 分析結果の考察 (テキストの自動流し込み)
story.append(Paragraph("<b>4. 分析結果と考察</b>", japanese_style_h2))
story.append(Spacer(1, 0.2 * inch))
analysis_text = """上記のデータとグラフから、以下の点が明らかになりました。<br/><br/>
・売上は年間を通して変動が見られ、特に夏期(7月〜8月)にピークを迎える傾向があります。<br/>
・経費は比較的安定していますが、売上の変動に若干連動する形で増減している月もあります。<br/>
・特定の月において、売上に対する経費の割合が高い、または低いといった特徴が見られます。これらの月については、詳細な要因分析が必要です。<br/><br/>
今後は、売上ピーク時の経費効率化、および売上が低い時期の販売促進策について検討を進めることが推奨されます。"""
story.append(Paragraph(analysis_text, japanese_style_normal))
story.append(Spacer(1, 0.5 * inch))
doc.build(story)
print(f"レポート '{output_filename}' が生成されました。")
def main():
"""
レポート生成のメイン関数
"""
print("レポート生成を開始します...")
generate_data_analysis_report()
print("レポート生成が完了しました。")
if __name__ == "__main__":
main()
コードの解説
このコードは、ReportLab
ライブラリを使用して、データ分析レポートを自動生成するPythonスクリプトです。以下の主要なステップで構成されています。
- 必要なライブラリのインポート:
reportlab
の各種モジュールに加え、データ操作のためにpandas
とnumpy
、日付処理のためにdatetime
をインポートしています。 - データ準備:
pandas.DataFrame
を使用して、月ごとの売上と経費のサンプルデータを生成しています。実際のアプリケーションでは、この部分をデータベースからのデータ取得やCSVファイルの読み込みに置き換えることができます。 - レポートの基本設定:
SimpleDocTemplate
でPDFドキュメントの基本設定を行い、getSampleStyleSheet()
で標準のスタイルシートを取得しています。 - タイトルと概要の追加:
Paragraph
とSpacer
を用いて、レポートのタイトル、作成日、および概要テキストを追加しています。<b>
タグでテキストを太字にしたり、f-string
で動的に日付を挿入したりしています。 - データテーブルの作成:
Table
オブジェクトとTableStyle
を使用して、月次データを表形式でPDFに描画しています。ヘッダーの背景色、テキスト色、中央揃え、罫線などのスタイリングを細かく設定しています。 - グラフの描画:
- 棒グラフ:
VerticalBarChart
を使用して、月ごとの売上推移を棒グラフで表現しています。グラフのサイズ、位置、軸の範囲、ラベルの角度などを設定し、視覚的に分かりやすいグラフを作成しています。 - 折れ線グラフ:
LineChart
を使用して、売上と経費の月ごとの推移を折れ線グラフで比較しています。各線の色を設定し、両者の関係性を一目で把握できるようにしています。
- 棒グラフ:
- 分析結果の考察:
Paragraph
を使用し、HTMLのようなタグ(<para>
,<ul>
,<li>
)を埋め込むことで、分析結果の考察を整形されたテキストとして追加しています。これにより、テキストの自動流し込みとリスト形式での情報提示が可能です。 - PDFの生成: 最後に
doc.build(story)
を呼び出すことで、これまでにstory
リストに追加した要素が結合され、指定されたファイル名でPDFレポートが生成されます。
このコードを実行することで、動的に生成されたデータに基づいたプロフェッショナルなPDFレポートを簡単に作成できます。
まとめ:ReportLabで実現する表現豊かなPDF
この記事では、ReportLabの高度なレイアウト機能、テーブル作成、そしてグラフ描画について深く掘り下げました。フローアブルフレームとストーリーによるテキストの自動流し込みや段組み、TableStyle
を使った柔軟なテーブルスタイリング、そして ReportLab Graphics
による多様なグラフ描画。これらを組み合わせることで、あなたのPythonアプリケーションは、単なるデータ処理ツールから、プロフェッショナルなドキュメント生成エンジンへと進化します。
ReportLabの学習は挑戦的かもしれませんが、その投資は必ず報われます。ぜひ、この記事で学んだ知識を活かし、あなたのプロジェクトで表現豊かなPDFを自動生成してみてください。
免責事項
この記事は情報提供のみを目的としており、ReportLabの使用に関するいかなる保証も行いません。コード例は説明のために簡略化されており、実際の運用環境での使用には追加の考慮事項が必要となる場合があります。ライセンス、セキュリティ、パフォーマンスに関する最終的な判断は、読者自身の責任において行ってください。