Jupyter Notebook を PDF に変換する方法

🍪この記事の内容:
  • Jupyter Notebook を HTML 経由で PDF に変換する (Playwright 使用)。この方法は、
    • HTML の段階でコード行頭の空白を記号に置換するため、PDF からコードをコピーしてもインデント情報を保つ (ペースト後に記号を空白に再置換する必要はある)。
    • HTML の段階でフォントをカスタマイズしたり、「関係者外秘」と挿入したりもできる。
    • Playwright を使用することで用紙サイズや倍率や余白を固定 (OR 引数指定) できる。
Jupyter Notebook を PDF に変換する方法は色々ある (以下)。この記事には方法 4. で変換するスクリプトの例を示す。ただし、方法 2. で十分であればこちらのほうがチームメンバー全員がやりやすいはずである。
  1. Jupyter Notebook / JupyterLab をインストールすると自動的にノートブック変換パッケージ nbconvert もインストールされるので、jupyter nbconvert --to pdf notebook.ipynb (または Jupyter Notebook を開いていればブラウザ上のメニューからエクスポートしても同じ) というコマンドが用意されている。が、この方法は LaTeX を経由するため LaTeX が必要である。また、HTML をレンダリングしないため、pandas.DataFrame (の Styler) をアウトプットセルに表示している場合は無視される。
  2. Jupyter Notebook のメニューから印刷を選んで PDF に印刷する方法もある。これは内部的に HTML を経由するため LaTeX が不要で pandas.DataFrame もレンダリングされる。ただし、(a) 印刷された PDF からテキストをコピーするとき空白が崩れることが多いので、コードをコピーしたい場合は不便である (これは 1. でも同様)。また、(b) ブラウザから他の Web ページを印刷するために用紙サイズや余白や倍率を変更した場合、設定を戻す必要がある。
  3. 方法 2. の課題 (a) を克服したい場合は、一旦コマンドまたはブラウザ上のメニューで HTML に変換し、この段階でコードの行頭の空白を明示的に記号に置換しておくのが一つの方法である (コードをコピー&ペースト後に記号を空白に再置換する必要はある)。必要なら、その他の好きな修正もできる。あとは修正した HTML をブラウザの印刷メニューから OR ブラウザのヘッドレスモードを呼び出して PDF に印刷すればよい (参考)。
  4. さらに方法 2. の課題 (b) も克服したい場合は、ブラウザ操作ライブラリで用紙サイズや余白や倍率を指定して変換するのが一つの方法である。

参考文献

  1. Using as a command line tool — nbconvert 7.16.6 documentation, , 2025年10月9日参照.
  2. Page | Playwright Python#page-pdf, , 2025年10月9日参照.

Jupyter Notebook を HTML 経由で PDF に変換するスクリプトの例 (Playwright 使用)

以下のスクリプトにノートブックのパスを指定し python nb2pdf.py aaa/bbb/ccc.ipynb と実行すると aaa/bbb/tmp.html を経由して aaa/bbb/ccc.pdf にする。Playwright for PythonBeautiful Soup 4 が必要である。
  • 中間 HTML への加工処理 [2a] [2b] [2c] が不要な場合は Beautiful Soup 4 は不要であり、html_path.read_text(encoding='utf8') をそのまま page.set_content() に渡せばよい。ただし [2a] を省くと PDF からコードをコピーした際にインデント情報が失われる。