PythonでPDFファイルを生成する方法
PythonでPDFファイルを生成する方法は、多岐にわたります。目的に応じて様々なライブラリを選択することで、簡単なテキストベースのPDFから、複雑なレイアウトや画像、グラフを含むPDFまで、柔軟に作成することが可能です。ここでは、代表的なライブラリとその使い方、さらに生成されるPDFのカスタマイズ方法について解説します。
主要なPDF生成ライブラリ
PythonでPDFを生成するために利用できるライブラリは数多く存在しますが、特に広く使われているのは以下のものです。
ReportLab
ReportLabは、PythonでPDFを生成するための最も強力で多機能なライブラリの一つです。低レベルのAPIと高レベルのAPIの両方を提供しており、細かい描画から複雑なドキュメント構造の生成まで幅広く対応できます。
ReportLabの基本的な使い方:
まず、ReportLabをインストールします。
pip install reportlab
次に、簡単なテキストを含むPDFを生成する例を見てみましょう。
from reportlab.pdfgen import canvas
def create_simple_pdf(filename="simple_report.pdf"):
c = canvas.Canvas(filename)
c.drawString(100, 750, "これはPythonで生成されたPDFです。")
c.save()
create_simple_pdf()
このコードは、指定されたファイル名でPDFを生成し、左下を原点とした座標(100, 750)にテキストを描画します。ReportLabでは、座標系は左下隅が(0, 0)となり、単位はポイント(1/72インチ)です。
xhtml2pdf (または WeasyPrint)
HTMLとCSSの知識がある場合、xhtml2pdfやWeasyPrintといったライブラリは非常に強力な選択肢となります。これらはHTML/CSSを解釈してPDFに変換するため、Web開発の経験がある方には親しみやすいでしょう。
xhtml2pdfの基本的な使い方:
xhtml2pdfをインストールします。
pip install xhtml2pdf
HTML文字列からPDFを生成する例:
from xhtml2pdf import pisa
import io
def create_pdf_from_html(html_content, filename="report_from_html.pdf"):
with open(filename, "wb") as pdf_file:
pisa_status = pisa.CreatePDF(
html_content,
dest=pdf_file
)
return pisa_status.err
html = """
HTMLから生成されたPDF
body { font-family: Arial, sans-serif; }
h1 { color: blue; }
p { font-size: 12pt; }
HTMLからPDFへ
このPDFはHTMLとCSSを使用して生成されました。
太字や斜体などの書式も利用できます。
"""
create_pdf_from_html(html)
xhtml2pdfは、HTMLの要素やCSSのスタイルを解釈して、それらをPDFのレイアウトに変換します。これにより、複雑なレイアウトやデザインもHTML/CSSで記述できます。
WeasyPrintも同様にHTML/CSSからPDFを生成しますが、よりモダンなCSS仕様に対応しており、パフォーマンスも優れている場合があります。
fpdf2
fpdf2は、PHPのFPDFライブラリのPythonポートであり、シンプルで使いやすいAPIを提供します。ReportLabよりも手軽に始めたい場合に適しています。
fpdf2の基本的な使い方:
fpdf2をインストールします。
pip install fpdf2
簡単なPDFを生成する例:
from fpdf import FPDF
class MyPDF(FPDF):
def header(self):
self.set_font("Arial", "B", 15)
self.cell(0, 10, "ヘッダータイトル", 0, 1, "C")
def footer(self):
self.set_y(-15)
self.set_font("Arial", "I", 8)
self.cell(0, 10, f"ページ {self.page_no()}/{{nb}}", 0, 0, "C")
def chapter_title(self, title):
self.set_font("Arial", "B", 12)
self.cell(0, 10, title, 0, 1, "L")
def chapter_body(self, text):
self.set_font("Arial", "", 10)
self.multi_cell(0, 5, text)
def create_fpdf_report(filename="fpdf_report.pdf"):
pdf = MyPDF()
pdf.alias_nb_pages() # 総ページ数を表示するための設定
pdf.add_page()
pdf.chapter_title("はじめに")
pdf.chapter_body("これはfpdf2ライブラリを使用して生成されたレポートです。")
pdf.add_page()
pdf.chapter_title("次のセクション")
pdf.chapter_body("このセクションでは、さらに詳細な情報を提供します。")
pdf.output(filename)
create_fpdf_report()
fpdf2では、クラスを継承してヘッダーやフッター、ページ番号などをカスタマイズすることが一般的です。`FPDF`クラスは、ページ追加、フォント設定、セルの配置といった機能を提供します。
PDF生成のカスタマイズ
PythonでPDFを生成する際には、単にテキストを配置するだけでなく、様々な要素を組み合わせてよりリッチなドキュメントを作成できます。
テキストとフォント
フォントの種類、サイズ、色、スタイル(太字、斜体、下線など)を設定することで、テキストの見た目を調整できます。ReportLabやfpdf2では、フォントファイルを指定して埋め込むことも可能です。xhtml2pdf/WeasyPrintではCSSでフォントを制御します。
画像と図形
画像ファイルの埋め込みや、線、矩形、円などの図形を描画することも可能です。これにより、レポートやプレゼンテーション資料などで視覚的な要素を効果的に利用できます。ReportLabは特に高度な図形描画機能を持っています。
テーブル
データを整理して表示するために、テーブルは不可欠な要素です。各ライブラリは、テーブルの作成、セルの結合、罫線、背景色などの設定をサポートしています。xhtml2pdf/WeasyPrintでは、HTMLの`
