見出し画像

PythonでHTMLをPDF化してみた ~0からPDFを生成したいのでHTMLxCSSをweasyprintで変換~

こんにちはRcatです。
突然ですが、今回はHTMLをPythonを使ってPDFにしていきます。


次回はこちら


はじめに

利用規約

情報や作品の活用時は事前に利用規約をご確認ください。

https://note.com/rcat999/n/nb6a601a36ef5

コメントについて

利用規約のガイドラインを確認の上コメントしてください


概要

概要

さて、いきなりですが全自動でPDFを作りたいです。
調べた結果、Pythonコードで文字や位置を指定するか、HTMLを変換するかで方法が分かれるみたいです。
私はよくHTMLとCSSは使うので、それを使った方がレイアウトが簡単だと思ったので、HTMLを変換する方でやっていきます。

ちなみになんでこんなことをしたいのかは…それは次回です。

Pythonのインストール

本作はPythonでできています。
そのため、まずはPythonのインストールが必要です。
インストール方法については以下の記事で解説していますので、参考にしてください。


PDFに変換する

事前準備

まずはライブラリのインストールです

pip install weasyprint

ちなみに初回はこんなエラーが出ました

OSError: cannot load library 'libgobject-2.0-0': error 0x7e.  Additionally, ctypes.util.find_library() did not manage to locate a library called 'libgobject-2.0-0'

調べたところ下記をインストールすると出なくなるらしいのでインストールして解決しました。
時間が無いので詳しくは調べませんでしたが、GUIを作るための物らしいので危ないものではないでしょう。

https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer/releases

HTMLを書く

とりあえずサンプルを書きます。私のいつも通りの書き方です。
で、こんな感じ。

これをブラウザで開くとこんな感じ
これでもう何やりたいかバレバレですね。
kindle端末と同じ3:4のサイズになるようにしてみました。

変換する

そして変換コードがこちら。
え、これだけ…。
ちなみに、HTMLは別ファイルになっているのでopenで読んでますが、直にStringで書いてもOKです。

出来上がったPDFがこちら。
いいですね☆。レイアウトがそのまま出てます。

さすがにつまらないのでもうちょい進む

一ページだけ作れても仕方ないので、複数ページにしましょう。
調べてみましたが、明示的にページを分離するのは難しそうなので、単ページ出力を後から結合する感じにします。

というわけでコードがこちら。少し前にpypdfで結合だけやってたのでそれをそのまま適用しました。
管理が煩雑になるのでクラス化しています。

できるPDFがこちら
きちんとファイルごとにページが分かれています。

まとめ

今回はPythonを使って、HTMLページをPDFに変換してみました。0からPDFを生成する前に、HTMLを使ってレイアウトを定義できるというのがかなり便利ですね。
さて、次回は何をやりたいのかをきちんと明かしてツールとして作り込んでいきます。それではまたお会いしましょう。


いいなと思ったら応援しよう!

Rcat999 情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。