pfpdf は、Markdown を印刷品質の PDF に変換する CLI です。Preferred Networks(pfnet-research)が公開していて、ライセンスは MIT。特徴は日本語組版を最初から重視していることで、全角の約物に隣接した強調が効き、OS のフォントに依存しない埋め込みフォントで組版します。組版エンジンには Vivliostyle CLI と Chromium を使います。この記事は、v0.2.1 を実際に動かし、日本語の Markdown(数式・表・コードつき)を PDF へ変換するところまで確かめた結果を整理します。

HOW IT WORKS変換の流れ

Markdown を 印刷品質の PDF にするまで

  1. Markdown を書く

    GFM+front matter。表・数式・コード・Mermaid・BibTeX も使える

  2. pfpdf に渡す

    npx で起動。front matter かCLIでテンプレ・目次・ロゴを指定

  3. Vivliostyle+Chromium で組版

    CSS 組版エンジンが改ページ・目次・日本語の行組版を処理

  4. PDF を出力

    表紙・目次つきの印刷品質 PDF。フォントは埋め込み

出典: pfpdf README / package.json(v0.2.1・@vivliostyle/cli 依存)を実測(2026-10-28 確認)

30秒でわかる

  • ・何をする:Markdown → 印刷品質 PDF。表紙・目次・数式・コード・Mermaid・BibTeX に対応
  • ・強み:日本語組版ファースト。全角約物に隣接した強調、OS 非依存の埋め込みフォント
  • ・導入:npx 一発(Node 22.12+)。初回だけ Chromium を自動取得
  • ・注意:信頼できる自分の文書だけ変換する(生 HTML・script は無サンドボックス実行)

まず最小の使い方です。Node.js と npm があれば、インストールせずに変換できます。

npx @pfnet-research/pfpdf@latest --input document.md --output document.pdf

pfpdf で何ができるのか

pfpdf は、素の Markdown を配布できる日本語文書に仕上げるための機能を内蔵しています。読者がやりたい「何ができて・何を解決し・何を代替するか」に即して並べると、次のようになります。

WHAT YOU GETできること

素の Markdown から、整った日本語文書へ

  1. 1.GFM と日本語フレンドリーな強調

    表・タスクリスト・脚注に加え、全角約物に隣接した 「重要」 も <strong> になる

  2. 2.数式・コード・Mermaid 図

    MathJax の数式、ハイライト付きコード、Mermaid の作図をバンドル資産で描画

  3. 3.BibTeX 引用・目次・表紙・改ページ

    front matter で .bib を指定し \cite{} で番号付き引用と参考文献を生成

  4. 4.テンプレ7種+埋め込みフォント

    academic / book / compact / default / notebook / pfn / technical。OS フォント非依存

出典: pfpdf README の Features(v0.2.1・2026-10-28 確認)

・GFM と日本語の強調:表・タスクリスト・脚注に加え、これは**「重要」**です のように全角約物へ隣接した強調も正しく効きます
・数式・コード・Mermaid:$...$ の数式、ハイライト付きコード、Mermaid の作図を、バンドルした資産で描きます
・BibTeX 引用:front matter で .bib を指すと、\cite{key} で番号付き引用・参考文献一覧・PDF 内リンクが出ます
・テンプレと埋め込みフォント:academic / book / compact / default / notebook / pfn / technical の7種を同梱し、OS のフォントに依存しません

こうした機能が解決するのは、「Markdown は書けるが、配布できる体裁の日本語 PDF にするのが面倒」という問題です。代替する相手は、LaTeX のテンプレ整備や、ブラウザ印刷・wkhtmltopdf を手で組み合わせる運用です。どれも最終的な PDF は作れますが、日本語の体裁を整えるための設定や、環境ごとのフォント差への対処に手間がかかりがちで、pfpdf はそこを既定とテンプレで肩代わりする、という狙いのツールです。

既存の方法と何が違うのか

Markdown から PDF を作る方法は他にもあります。pfpdf の位置づけは、日本語組版と再現性に寄せた点にあります。

方法 組版エンジン 日本語組版 テンプレ・引用
pfpdf Vivliostyle(CSS 組版)+Chromium ファースト(約物・埋め込みフォント) テンプレ7種・BibTeX 内蔵
Pandoc → LaTeX LaTeX 設定すれば高品質(整備が要る) 強力だが自前整備
md-to-pdf / wkhtmltopdf ブラウザ印刷/WebKit 追加設定が要る 基本は素

Vivliostyle は CSS で組版する方式なので、紙面の設計を CSS テンプレートで持てます。LaTeX のように専用のマクロ言語を覚える必要はなく、Web の技術(HTML と CSS)で版面を作れるのが特徴です。pfpdf はそこに日本語向けの既定とテンプレ・フォントを足して、npx 一発で使えるようにした、という位置づけです。日本語の文書では、行頭・行末に来てはいけない約物の処理(禁則)や、全角と半角が混じる行の見え方が品質を左右しますが、こうした細部を既定で面倒みてくれるのが、汎用の Markdown→PDF 変換との違いになります。

pfpdf はどんな場面で効くか

pfpdf が向くのは、「中身は Markdown で管理したいが、最終的な配布物は体裁の整った日本語 PDF にしたい」という場面です。具体的には、社内の設計書・仕様書・手順書、研究やレポートの配布版、勉強会の資料、長めの技術ドキュメントなどが当てはまります。章ごとに Markdown を分けて書き、ディレクトリ単位で1本の PDF にまとめる使い方は、こうした長文に向いています。テンプレートは用途ごとに分かれていて、研究寄りの academic、長文向けの book、余白を詰めた compact、くだけた雰囲気の notebook、企業向けの pfn、コード中心の technical、無難な default から選べます。front matter でテンプレート・目次・ロゴを指定しておけば、変換のたびに同じ体裁で出せます。

生成 AI を使う文書ワークフローとも相性がよい一方で、pfpdf 自体に AI 機能は含まれていません。たとえば Claude や ChatGPT にドラフトを Markdown で書かせ、人が手を入れたうえで pfpdf に通して配布用 PDF にする、という出力段としての使い方が自然です。入力が Markdown である限り、生成元が人か AI かを問わず同じように扱えます。ここで大切なのは次節の信頼モデルで、生成 AI の出力をそのまま変換するのではなく、埋め込まれた HTML やリンク先を確認してから渡すことです。

再現性の面では、環境変数 SOURCE_DATE_EPOCH を設定するとビルドを再現可能にできます(設定しないと「再現できないビルド」と警告が出ます)。CI で版(@0.2.1 など)とこの変数を固定しておけば、同じ入力から同じ PDF を繰り返し得られます。

使い方(ディレクトリ変換と診断)

ディレクトリを渡すと、直下の *.md をファイル名順に連結して1つの PDF にします。章ごとにファイルを分けた文書に向きます。

npx @pfnet-research/pfpdf@latest --input docs --output docs.pdf

環境の不足(Linux の追加ライブラリなど)は、同梱の診断で確認できます。

npx @pfnet-research/pfpdf@latest --doctor

テンプレートや目次は front matter で指定し、CLI の --template / --no-toc で上書きできます。ブラウザを自前で用意している場合は --browser-path で既存の Chromium を指せます。

注意点:信頼できる文書だけを変換する

pfpdf でいちばん大事なのは、変換してよい文書の範囲です。README の「Trust model」が明言しているとおり、pfpdf は自分の信頼できる文書を変換する前提で作られています。

TRUST MODEL信頼モデル

変換してよい文書と、してはいけない文書

変換してよい

変換してはいけない

変換してよい: 自分で書いた・信頼できる Markdown

変換してはいけない: 出所の不明な・第三者から受け取った Markdown

変換してよい: raw HTML も自分の管理下にある

変換してはいけない: raw HTML や <script> が無サンドボックスで実行される

変換してよい: 参照するローカル/リモート資源を把握している

変換してはいけない: プロセスが読める任意のローカルファイルに手が届きうる

出典: pfpdf README「Trust model」/ SECURITY.md(v0.2.1・2026-10-28 確認)

生 HTML や <script> は変換中のブラウザでそのまま実行され、pfpdf は無害化もサンドボックス化もしません。文書はプロセスが読めるローカルファイルを参照でき、リモート資源にもアクセスしえます。だから、出所の不明な Markdown を変換しないことが前提です。生成 AI に書かせた Markdown を変換する場合も、中身(埋め込まれた HTML やリンク先)を自分で確認してから渡してください。

実際に試す(要件とつまずき)

手元で v0.2.1 を動かし、日本語の Markdown($E=mc^2$ の数式・表・コードブロック入り)を既定テンプレートで変換したところ、表紙つきの3ページ PDF が生成され、本文も表紙も埋め込みフォントの日本語で正しく組まれました。表紙には front matter の title と日付が入り、全角約物に隣接した強調もそのまま反映されます。OS に日本語フォントを入れていない環境でも豆腐(□)にならないのは、フォントを同梱して埋め込むためで、ここが「日本語組版ファースト」を名乗る根拠になっています。確認・導入で押さえておく点は次の通りです。

・Node.js 22.12.0 以上が要ります(package.json の engines で指定)
・初回はレンダリング用 Chromium を自動ダウンロードします(数百 MB)。2回目以降はキャッシュを使います
・Linux では Chromium に追加のシステムライブラリが要ります。--doctor で不足を確認します
・ライセンスは pfpdf 本体が MIT ですが、同梱する Vivliostyle CLI は AGPL-3.0 です。自分で使う分には問題になりませんが、再配布や自社サービスへの組み込みを考えるなら、この差と同梱フォントの条件を先に確認してください(THIRD_PARTY_LICENSES.md)

変換がうまくいかないときの手がかりも用意されています。--print-effective-config を付けると、front matter と CLI オプションを解決した最終的な設定が JSON で出るので、どのテンプレートやフォントが実際に使われるかを確かめられます。--keep-work-dir で一時作業ディレクトリを残せば、生成された中間 HTML を見て組版の崩れを追えます。レンダリングには時間の上限(既定 300 秒)があり、--render-timeout-ms で調整できます。長い文書や画像の多い文書で時間切れになるときは、ここを延ばします。

対応環境は、macOS(Apple Silicon)と Linux x86_64 が Primary、Windows x86_64 と Linux aarch64 が Additional で、CI が4環境すべてで実ブラウザによる PDF 生成を検証しています。なお pfpdf 自体に AI 機能はありません。生成 AI に書かせた Markdown を整った配布用 PDF にする、という文書ワークフローの出力段として素直に組み合わせられるツールです。

参照ソース