MkDocs で作成したドキュメントを PDFにしたい(Windows環境で)
最近いろいろ思うところあって、検証を兼ねて MkDocs と戯れています。
もともと静的HTMLジェネレータを探していたのですが、試しているうちに別の悩み(markdownでドキュメント作成・管理して、PDFでまとめて出力したい)の解決策として使えるのでは……ということに気づきました。
手元のWindows環境でPDF出力できるまで試行錯誤しましたので、その流れをシェアします。はずかしいけど。
今回の環境
Windows10 Home
(普段のお仕事はMacですが、自宅では2016年末に買ったWindows PCが現役です)
python3.11
MkDocs 導入済
Windowsに入れてみよう(失敗)
PDF Generate Plugin for MkDocs を利用して出力する……のですが、WeasyPrint が必要とのこと。
WeasyPrint の Installationを確認していたところ、
Installing WeasyPrint on Windows requires to follow a few steps that may not be easy. Please read this chapter carefully.
Only Windows 11 64-bit is supported. You can find this information in the Control Panel → System and Security → System.
不穏すぎる……。
GTK3 のインストール
これは簡単。
GTK3のインストーラをDLしてきて、デフォルトのままクリックするだけの簡単なお仕事。
インストールが終わったら環境変数PATH
にGTK3のインストールディレクトリを追加します。
pango のインストール
(本当はWeasyPrintのインストールに試行錯誤している最中にインストールしていますが、入れ直したりしているなかで最終的にはこちらが先になったので)
- MSYS2 をインストールする。
- MSYS2 起動する(というかインストール後に起動したターミナルをそのまま利用)
- https://packages.msys2.org/package/mingw-w64-x86_64-pango に書いてあるとおりにインストールする。
WeasyPrint のインストール
WassyPrintの教えに従い、コマンドプロンプトから実施しました。
> pip install weasyprint
インストール自体は問題なく終わったように見えたのですが、ちゃんとインストールされたか確認しようかと思うと、激しいエラーが……。
> weasyprint --version
-----
WeasyPrint could not import some external libraries. Please carefully follow the installation steps before reporting an issue:
https://doc.courtbouillon.org/weasyprint/stable/first_steps.html#installation
https://doc.courtbouillon.org/weasyprint/stable/first_steps.html#troubleshooting
-----
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "E:\Users\youko\AppData\Local\Programs\Python\Python311\Scripts\weasyprint.exe\__main__.py", line 4, in <module>
File "E:\Users\youko\AppData\Local\Programs\Python\Python311\Lib\site-packages\weasyprint\__init__.py", line 336, in <module>
from .css import preprocess_stylesheet # noqa isort:skip
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\Users\youko\AppData\Local\Programs\Python\Python311\Lib\site-packages\weasyprint\css\__init__.py", line 25, in <module>
from . import computed_values, counters, media_queries
File "E:\Users\youko\AppData\Local\Programs\Python\Python311\Lib\site-packages\weasyprint\css\computed_values.py", line 11, in <module>
from ..text.ffi import ffi, pango, units_to_double
File "E:\Users\youko\AppData\Local\Programs\Python\Python311\Lib\site-packages\weasyprint\text\ffi.py", line 427, in <module>
pango = _dlopen(
^^^^^^^^
File "E:\Users\youko\AppData\Local\Programs\Python\Python311\Lib\site-packages\weasyprint\text\ffi.py", line 413, in _dlopen
return ffi.dlopen(names[0]) # pragma: no cover
^^^^^^^^^^^^^^^^^^^^
File "E:\Users\youko\AppData\Local\Programs\Python\Python311\Lib\site-packages\cffi\api.py", line 150, in dlopen
lib, function_cache = _make_ffi_library(self, name, flags)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\Users\youko\AppData\Local\Programs\Python\Python311\Lib\site-packages\cffi\api.py", line 832, in _make_ffi_library
backendlib = _load_backend_lib(backend, libname, flags)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\Users\youko\AppData\Local\Programs\Python\Python311\Lib\site-packages\cffi\api.py", line 827, in _load_backend_lib
raise OSError(msg)
OSError: cannot load library 'pango-1.0-0': error 0x7e. Additionally, ctypes.util.find_library() did not manage to locate a library called 'pango-1.0-0'
環境変数PATHに GTK3 をインストールしたディレクトリを追加したり、こちらにあるとおり、環境変数 WEASYPRINT_DLL_DIRECTORIES
に GTK3 をインストールしたディレクトリを設定してみたが、やっぱり状況変わらず。
ここで、嫌になってコンビニにアイス(スーパーカップ)を買いに行き、アイスクリーム専用酒TSUMI [1]をぶっかけてうまうましました。
WSLに入れてみよう(成功)
Windows に WeasyPrint をインストールするのは難しいと書いてありましたが、Linux や Macは楽そうだったので、だったらWSLでやってみようか[2]、と。
python のインストール
python が入っていたので、pip も入れるべく
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install phython3-pip
したのですが、python3.8 だったので(apt install python3.10 すれば 3.10までは入りました)、方針転換。
WSL に Homebrew を入れてから、python3.11 を入れることに。
インストールしたものの brew にPATHが通ってなかったので、~/.bashrc に一行追加。
(ディレクトリは Homebrew のインストールディレクトに読み替えてください)
export PATH="/home/linuxbrew/.linuxbrew/Homebrew/bin:$PATH"
そしてようやく pythonをインストール。
$ brew insatll python
これで、python3.11 としてインストールされました。
※Homebrew で python を入れたときは実行コマンドが python3 , pip3 じゃないことがあるっぽい。Mac でも同じでした。
pango のインストール
$ brew insatll pango
WeasyPrint のインストール
$ pip3.11 install weasyprint
ここから先が鬼門だったので、どきどきしながら確認。
$ python3.11 -m weasyprint --info
System: Linux
Machine: x86_64
Version: #1 SMP Wed Nov 23 01:01:46 UTC 2022
Release: 5.15.79.1-microsoft-standard-WSL2
WeasyPrint version: 57.2
Python version: 3.11.1
Pydyf version: 0.5.0
Pango version: 15012
ついに勝利した!
MkDocs のインストール
MkDocsはWindows に入れていたものの、WSLに入れた WeasyPrint を使うには WSL上のMkDocsが必要になるので…
MkDocs と必要となる(なりそうな)プラグインを適当に。
$ pip3.11 install mkdocs
$ brew install dk-pixbuf
$ pip3.11 install mkdocs-with-pdf
MkDocs のインストール、初期設定の方法はこちら(公式)
ざっとこんな感じ。
$ cd
$ mkdocs new mkdocs-test # mkdocs-test の部分はお好きに
$ cd mkdocs-test
mkdocs-with-pdf のドキュメントにかかれているとおり、~/mkdocs-test/mkdocs.yml
に以下を追加。
plugins:
- with-pdf
PDFを出力
$ mkdocs build
問題なければ ~/mkdocs-test/site/pdf/document.pdf
に初期設置の ~/mkdocs-test/docs/index.md
をPDF化したものが出力されます。
日本語フォントのインストール
index.md に日本語を入れてPDF化すると、日本語部分から文字が消えました。(私の場合はその箇所が真っ白でした)
ということでWSL上に入っているフォントを確認してみます。
$ fc-list
ずらっと表示されたフォントリストの中に日本語フォントは存在しませんでした(やっぱりねー)
ということで、IPAフォントと Not CJKを入れてみます。
$ sudo apt install fonts-ipafont fonts-noto-cjk
この状態でmkdocs build
すると、日本語入の文書でもPDFに出力できました。
おわりに
本稿は MkDocs + PDF Generate Plugin for MkDocs でのPDF出力までです。
見栄えの調整など、先は長そうなのですがうまくいったらまた書きます。
css組版という点で考えると
本当は MkDocs ではなく Vivliostyle がいいんじゃないかと思ってるんですが、自分だけで使うなら Vivliostyle なんですが、最終的に「Markdownは書けるけど……」という人と一緒に使うことを想定しながら検証していているので、どうしたものか……。
-
超うまいのでおすすめです。スーパーカップが大人のパナップになります。 ↩︎
-
すべてが終わったあとに WeasyPrint のドキュメントを読んでいたら Other Solutions として「On Windows, you can also use WSL and install WeasyPrint the same way it has to be installed on Linux.」と書いてあることに気づきました。ドキュメントは事前にきちんと目を通しましょう(自戒) ↩︎
Discussion