🔖

PythonでPDF出力を試してみる

に公開

こんにちは!TRUSTART株式会社のgoaです!

PDF出力機能を実装するため、今回はPDF生成の実現方法について調べてみました!

PythonのPDF生成ライブラリの主なアプローチ

まず、PythonのPDF生成ライブラリを調べてみると、大きく分けて2つのアプローチがあることが分かりました。

  1. HTML/CSSベース
    HTMLとCSSでPDFの見た目を作り、それをPDFに出力します。
    WeasyPrint, xhtml2pdfなどのライブラリがこちらになります。

  2. Pythonコードベース
    Pythonのコードでレイアウトを作り、PDFに出力します。座標(x, y)を指定してテキストなどを描画していくイメージでした。
    ReportLabfpdf2などのライブラリがこちらになります。

個人的な意見として、ある程度知見のあるHTML/CSSで見た目を作れる点と弊社でよく使用するDjangoのテンプレートと組み合わせることで動的な対応もしやすそうという点からHTML/CSSベースを試してみようと思います。

HTML/CSSベースを試してみる

それでは、HTML/CSSベースのライブラリの中から、調べていく中でよく名前が挙がっていた WeasyPrint と xhtml2pdf の2つを簡単に比較して、どちらを試すか決めていきたいと思います。

まずは、GitHubのスター数の推移を見てみます。
グラフを見てみると、近年ではWeasyPrintの方がより多くのスターを集めています。
GitHubスター数の推移

また、両方のドキュメントを少し眺めてみましたが、どちらも充実している印象でした。

そこで、今回はGitHubスター数の評価からWeasyPrintを試してみようと思います。

インストール

それでは、WeasyPrintをインストールしていきます。
公式ドキュメントを参考に、インストールを進めます。

今回は、私が使っているmacOS環境で、一番手軽そうなHomebrewを使ってインストールしました。ターミナルで以下のコマンドを実行します。

brew install weasyprint

PDF化するHTMLを用意する

次に、PDFに変換するための元となるHTMLとCSSを用意します。

今回はサンプルとして、弊社の採用ページの一部を抜粋して、簡単なHTMLファイル(trustart_page.html)を作成しました。CSSも用意して、簡単なスタイリングを当てています。

※Geminiに即席でHTML, CSSを作成してもらったのでコードの掲載は控えますが、ブラウザ表示は以下のようになっています。

サンプルコード

HTMLの見た目ができたので、PDFを生成するコードを用意します。
trustart_page.htmlと同じ階層にPDF生成を実行するファイル(create_pdf.py)を配置します。

create_pdf.py
from weasyprint import HTML

# 読み込むHTMLファイル
html_filename = 'trustart_page.html'

# 出力するPDFファイル名
output_filename = 'trustart_page.pdf'

# WeasyPrintでHTMLオブジェクトを作成
html = HTML(filename=html_filename)

# PDFをファイルに書き出す
html.write_pdf(output_filename)

生成されたPDF

上記のコードを実行すると、create_pdf.pyと同じ階層に trustart_page.pdfというファイルが生成されました。
以下のようにPDFとして出力されています!

おわりに

今回は、PythonのPDF生成ライブラリWeasyPrintを使って、HTMLとCSSからPDFを作成する方法を試してみました。
Homebrewを使ったmacOSへのインストールを試しましたが、Dockerなど他の環境で導入する際は、依存ライブラリのインストールが必要になりそうなので、調査したいと思います。また、最終的にはDjangoテンプレートなどと連携させて動的なPDFを作成したいと考えているので、そちらも引き続き調査したいと思います!


TRUSTART株式会社は、一緒に働くメンバーを募集しています!
インターンメンバーも大募集中です!
興味を持っていただいた方は、ぜひ弊社のページをご確認ください!!!

https://www.trustart.co.jp/recruit/

TRUSTARTテックブログ

Discussion