「WebページをPythonでPDFに変換したい」
「Pythonを用いてHTMLコンテンツからPDFを生成したい」
このような場合には、pdfkitがオススメです。
この記事では、pdfkitのインストールについて解説しています。
本記事の内容
- pdfkitとは?
- pdfkitのシステム要件
- pdfkitのインストール
- pdfkitの動作確認
それでは、上記に沿って解説していきます。
pdfkitとは?
pdfkitとは、HTMLをPDFに変換するためのPythonライブラリです。
ただし、pdfkit単体ではHTMLをPDFに変換することはできません。
HTMLをPDFに変換する処理は、wkhtmltopdfで行います。
wkhtmltopdfについては、次の記事で説明しています。
Pythonからwkhtmltopdfを扱うために、pdfkitが存在するということです。
つまり、pdfkitはwkhtmltopdfのためのラッパーと言えます。
そのため、pdfkitを利用するためにはwkhtmltopdfの存在が前提となります。
別途、wkhtmltopdfをインストールしておく必要があるということです。
HTMLをPDFに変換するとは、具体的には次の3パターンがあります。
- URLからPDFへ
- HTMLからPDFへ
- 文字列からPDFへ
外部コンテンツをPDFとして保存する場合は、「URLからPDFへ」を用います。
この際には、遅延読み込みなどの動的処理を用いる必要があるかもしれません。
内部コンテンツをPDFファイルとして生成する場合は、残りの二つを用いることになります。
一旦HTMlファイルとして保存するのか、そのままPDFとして出力するのかの違いです。
以上、pdfkitについて説明しました。
次は、pdfkitのシステム要件を説明します。
pdfkitのシステム要件
現時点(2023年8月7日)でのpdfkitの最新バージョンは、1.0.0となります。
2021年11月15日に1.0.0をリリースして以降は、動きがありません。
もしかしたら、1.0.0で完成したということかもしれません。
言い方はあれですが、所詮はwkhtmltopdfのラッパーということでしょうか。
サポートOSに関しては、以下を含むクロスプラットフォーム対応です。
- Windows
- macOS
- Linux
サポート対象となるPythonのバージョンは、Python 3.9までとなっています。
これは、2021年11月15日で開発が止まっているからでしょう。
単純にPython 3.10以降でテストをしてないというだけです。
実際、Python 3.11でも動作はできています。
そのため、Python 3.10以降でも問題はなりでしょう。
あと、システム要件で最も重要なことはwkhtmltopdfとなります。
wkhtmltopdfがインストール済みであることがmustです。
もっと具体的に言うと、以下のコマンドがOSのどこからでも利用できる必要があります。
>wkhtmltopdf -V wkhtmltopdf 0.12.6 (with patched qt)
以上、pdfkitのシステム要件を説明しました。
次は、pdfkitのインストールを説明します。
pdfkitのインストール
検証は、次のバージョンのPythonで行います。
> python -V Python 3.11.0
まずは、現状のインストール済みパッケージを確認しておきます。
> pip list Package Version ---------- ------- pdfkit 1.0.0 pip 23.2.1 wheel 0.38.4
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、pdfkitのインストールです。
pdfkitのインストールは、以下のコマンドとなります。
pip install pdfkit
pdfkitのインストールは、すぐに終わります。
終了したら、どんなパッケージがインストールされたのかを確認します。
> pip list Package Version ---------- ------- pdfkit 1.0.0 pip 23.2.1 setuptools 68.0.0 wheel 0.38.4
pdfkitは、他に依存関係もなく簡潔ということがわかりますね。
以上、pdfkitのインストールを説明しました。
次は、pdfkitの動作確認を説明します。
pdfkitの動作確認
pdfkitの動作確認を行います。
pdfkitの機能としては、以下の3パターンがありましたね。
- URLからPDFへ
- HTMLからPDFへ
- 文字列からPDFへ
それぞれの動作を確認します。
URLからPDFへ
def from_url(url: Any, output_path: Any = None, options: Any = None, toc: Any = None, cover: Any = None, configuration: Any = None, cover_first: bool = False, verbose: bool = False) -> bytes | bool
URLからPDFへ変換するには、上記関数を用います。
import pdfkit # 変換したいURL url = 'https://example.com' # 出力となるPDFファイルのパス output_path = 'url.pdf' # URLからPDFに変換 pdfkit.from_url(url, output_path)
このコードを実行すると、次の内容を持つPDFが作成されます。
url.pdf
HTMLからPDFへ
def from_file(input: Any, output_path: Any = None, options: Any = None, toc: Any = None, cover: Any = None, css: Any = None, configuration: Any = None, cover_first: bool = False, verbose: bool = False) -> bytes | bool
HTMLからPDFへ変換するには、上記関数を用います。
コードを確認する前に、変換対象となるHTMLファイルを用意します。
今回は、「Example Domain」のソースをもとに次のようなファイルを生成しています。
example.html
<!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> body { background-color: #f0f0f2; margin: 0; padding: 0; font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } div { width: 600px; margin: 5em auto; padding: 2em; background-color: #fdfdff; border-radius: 0.5em; box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02); } a:link, a:visited { color: #38488f; text-decoration: none; } @media (max-width: 700px) { div { margin: 0 auto; width: auto; } } </style> </head> <body> <div> <h1>例 Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html>
これは、以下のように変更しているだけです。
日本語の検証にもなります。
<h1>Example Domain</h1>
↓ ↓↓
<h1>例 Domain</h1>
実行するコードは、以下。
import pdfkit # 入力となるHTMLファイルのパス input_path = 'example.html' # 出力となるPDFファイルのパス output_path = 'html.pdf' # HTMLファイルをPDFに変換 pdfkit.from_file(input_path, output_path)
このコードを実行すると、次の内容のPDFが作成されます。
html.pdf
文字列からPDFへ
def from_string(input: Any, output_path: Any = None, options: Any = None, toc: Any = None, cover: Any = None, css: Any = None, configuration: Any = None, cover_first: bool = False, verbose: bool = False) -> bytes | bool
文字列からPDFへ変換するには、上記関数を用います。
import pdfkit # 変換したいHTML文字列 html_string = ''' <!DOCTYPE html> <html> <head> <title>Sample Page</title> </head> <body> <h1>Hello, World!</h1> <p>This is a sample HTML string.</p> </body> </html> ''' # 出力となるPDFファイルのパス output_path = 'string.pdf' # HTML文字列からPDFに変換 pdfkit.from_string(html_string, output_path)
このコードを実行すると、次の内容を持つPDFが作成されます。
string.pdf
以上、pdfkitの動作確認を説明しました。