PythonでPDFファイルを生成する方法

プログラミング

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の`

`タグとCSSでテーブルを表現します。

ヘッダーとフッター

ページ番号、文書タイトル、日付などを各ページに統一して表示するために、ヘッダーとフッターは重要です。多くのライブラリでは、これらを簡単に設定できる機能が提供されています。

ページネーションとレイアウト

複数ページにわたるドキュメントでは、適切なページネーションとレイアウトが重要です。用紙サイズ、余白、段組みなどの設定を行い、読みやすいドキュメントを作成します。ReportLabでは、`PageTemplate`や`Frame`といった概念を使用して複雑なレイアウトを構築できます。

動的なデータとの連携

Pythonのプログラムは、データベースやAPIから取得した動的なデータをPDFに組み込むことができます。これにより、例えば請求書、レポート、証明書などを自動生成することが可能になります。例えば、CSVファイルからデータを読み込み、それをテーブル形式でPDFに表示する、といった処理が考えられます。

ライブラリ選択のポイント

どのライブラリを選択するかは、プロジェクトの要件によって異なります。

  • ReportLab: 高度なカスタマイズ、複雑なレイアウト、低レベルの描画制御が必要な場合。学習コストはやや高め。
  • xhtml2pdf / WeasyPrint: HTML/CSSの知識があり、Web技術を活かしてPDFを生成したい場合。デザインの柔軟性が高い。
  • fpdf2: シンプルなPDF生成、手軽に始めたい場合。APIが直感的。

まとめ

PythonでPDFを生成する方法は、使用するライブラリによって多岐にわたります。ReportLabは最も汎用性が高く、xhtml2pdfやWeasyPrintはHTML/CSSでのデザインの柔軟性を提供し、fpdf2は手軽さを重視した選択肢となります。これらのライブラリを使い分けることで、様々なニーズに応じたPDFドキュメントをPythonで効率的に作成することが可能です。