📑

MkDocs で作成したドキュメントを PDFにしたい(Windows環境で)

2023/01/22に公開

最近いろいろ思うところあって、検証を兼ねて MkDocs と戯れています。
https://www.mkdocs.org/

もともと静的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のインストールに試行錯誤している最中にインストールしていますが、入れ直したりしているなかで最終的にはこちらが先になったので)

  1. MSYS2 をインストールする。
  2. MSYS2 起動する(というかインストール後に起動したターミナルをそのまま利用)
  3. 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]をぶっかけてうまうましました。
https://kurand.jp/pages/tsumi

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 を入れることに。
https://brew.sh/index_ja

インストールしたものの 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は書けるけど……」という人と一緒に使うことを想定しながら検証していているので、どうしたものか……。
https://vivliostyle.org/ja/

脚注
  1. 超うまいのでおすすめです。スーパーカップが大人のパナップになります。 ↩︎

  2. すべてが終わったあとに WeasyPrint のドキュメントを読んでいたら Other Solutions として「On Windows, you can also use WSL and install WeasyPrint the same way it has to be installed on Linux.」と書いてあることに気づきました。ドキュメントは事前にきちんと目を通しましょう(自戒) ↩︎

Discussion