HTMLからPDFを作成するwkhtmltopdfの開発が終了し、今年に入って多くの配布サイトで非推奨のツールとなった。筆者も長らくお世話になっており、どのライブラリに乗り換えるのか悩んだので、今回はwkhtmltopdfの代替ライブラリを紹介する。
なぜwkhtmltopdfの開発は終了したのか?
HTMLから手軽にPDFを作成できる「wkhtmltopdf」は、とても便利だった。簡単なHTMLタグを書くだけでPDFを作成できた。内部でQtライブラリのブラウザ機能であるWebkitを利用していたため、基本的にChromeやEdge/Safariなどのモダンブラウザと同等の描画機能があったので使い勝手が良かった。
しかし、残念なことにレンダリングエンジンとして使っていたQt Webkitのメンテナンスが止まってしまった。それが原因でwkhtmltopdfの開発も終了することになった。2023年1月にGitHubのリポジトリはアーカイブされ読み取り専用となった。
本連載の66回目で紹介した通り、PythonからもPDFKitなどのライブラリを介してwkhtmltopdfを使っていた人も多いだろう。筆者は、PDFKitとwkhtmltopdfを使って請求書の発行システムを作ったり、Webの資料を自動でクローリングしてPDF化するツールを作ったりと、趣味や仕事で幅広くお世話になっていた。
もちろん、wkhtmltopdfのWebサイトでは、現在も主要OS向けのバイナリを配付しており、今すぐ使えなくなるわけではない。しかし、サポートの切れたソフトウェアを使い続けるのは、不安がある。そのため、緩やかに代替ツールを探して移行していくのが良いだろう。
xhtml2pdfを使ってみよう
そうは言っても、多彩なWebブラウザのレンダリング機能を持った「wkhtmltopdf」と同等のツールは存在していない。それでも、全く代替ツールがないわけではない。
まず、単にHTMLをPDFに変換するだけのライブラリであれば、いくつか候補がある。その一つが「xhtml2pdf」というPythonパッケージだ。このライブラリは、PythonのPDF作成ライブラリを利用して、自力でHTMLをレンダリングしている。
それほど凝ったことはせず、とりあえずHTMLからPDFを作成できれば良いという用途では十分な実力を発揮してくれる。デフォルトでは日本語が表示できないが、日本語フォントを用意してパスを指定すれば、日本語を含むPDFを作成できる。
xhtml2pdfをインストールするには、ターミナル(WindowsならPowerShell、macOSならターミナル.app)を起動して、次のコマンドを実行する。
python -m pip install xhtml2pdf
そして、次のようなプログラムを作ろう。これは、Pythonのコードに書いたHTMLをPDFで出力するプログラムだ。「xhtml2pdf_test.py」という名前で保存しよう。
from xhtml2pdf import pisa
# PDFに変換したいHTMLを用意する
html = """
<html><body>
<h1 style="font-size: 8em">Hello, World!</h1>
</body></html>
"""
# HTMLをPDFに変換する
with open('xhtml2pdf_test.pdf', 'wb') as pdf_file:
pisa.CreatePDF(html, dest=pdf_file)
ターミナルで以下のコマンドを実行すると、「xhtml2pdf_test.pdf」というPDFが作成される。
python xhtml2pdf_test.py
PDFを開くと、次の画像のように表示される。
WeasyPrintを使ってみよう
続いて、xhtml2pdfでも紹介されているライブラリWeasyPrintを紹介しよう。このライブラリをインストールするには、ターミナルで下記のコマンドを実行しよう。
python -m pip install WeasyPrint
Windowsでは、こちらからGTKをインストールする必要がある。
macOSでは、libffiのインストールが必要だ。下記のコマンドを実行してインストールしよう。
sudo port install py-pip pango libffi
そして、以下のようなプログラムを記述することで、PDFを生成できる。WeasyPrintではデフォルトで日本語も問題なくレンダリングできた。下記のプログラムを「weasyprint_test.py」という名前で保存しよう。
from weasyprint import HTML
# PDFに変換したいHTMLを用意する
html = """
<html><body>
<h1 style="font-size: 5em">穏やかな舌は命の木である</h1>
</body></html>
"""
# HTMLをPDFに変換する
HTML(string=html).write_pdf('weasyprint_test.pdf')
上記のプログラムを実行するには、ターミナルで下記のコマンドを実行しよう。
python weasyprint_test.py
すると、次の画像のようにHTMLからPDFを作成できる。
なお、WeasyPrintには、Windowsから手軽に使える実行ファイルのバイナリも配付されている。インストールの手間を省きたい場合には、バイナリ版を使うのも手だろう。
ただし、通常のWebブラウザのような高度なレンダリング機能があるわけではない。試しに、本連載のWebサイトをレンダリングさせてみたところ、次のように、ページが崩れてしまった。