こんにちは!データサイエンスやAI開発の現場で、JupyterLabを毎日バリバリ使っていますか?
「コードと可視化結果を綺麗にまとめたはいいけれど、これを非エンジニアの上司やクライアントにどう共有しよう……」
「スクリーンショットを撮ってWordやPowerPointにペタペタ貼り付ける作業、もう終わりにしたい!」
そんな悩みを抱えたことはありませんか?実は、JupyterLabの裏側で静かに、しかし強力に動いている`nbconvert`(ノートブック・コンバート)というツールを使いこなせば、Jupyter Notebookをワンコマンドで美しいPDF、HTML、さらにはインタラクティブなスライド(Reveal.js)へと自動変換できるようになります。
これをマスターすれば、毎日のコーディングや実験結果のレポート化が劇的に楽になりますよ。今日は、単なるコマンドの紹介だけでなく、現場のプロが使っている「独自スタイルの適用テクニック」まで、優しくロジカルに解説していきますね。
—
1. なぜ `nbconvert` なのか?(アーキテクトが語る裏側の仕組み)
まず、Jupyter Notebook(`.ipynb`ファイル)が内部でどうなっているか知っていますか?
実は、あのファイルはJSON形式のテキストデータです。中身を覗くと、コードセル、マークダウンの文章、そして実行結果のグラフ(base64でエンコードされた画像など)が、すべて構造化データとして格納されています。
`nbconvert` は、このJSONデータを入力として受け取り、次のようなパイプライン処理を実行する強力なドキュメント生成エンジンです。
1. パース(解析): JSONを読み込み、AST(抽象構文木)のようなドキュメントモデルに変換。
2. プレプロセッシング(前処理): コードを実行し直したり(オプション)、不要な出力を削ったりする。
3. テンプレート適用(レンダリング): Jinja2というテンプレートエンジンを使い、HTMLやLaTeXなどの形式に流し込む。
4. ポストプロセッシング(後処理): HTMLからPDFへコンパイル(WebRendererやTeXを使用)する。
この仕組みを理解していれば、「なぜCSSを当てるだけでデザインが変わるのか」「なぜPDF出力時に環境構築が必要なのか」がすんなり頭に入ってきます。
—
2. 開発環境のセットアップと最初の一歩
まずは、JupyterLab環境に `nbconvert` を確実に導入し、正しく動くかを確認しましょう。Anaconda環境を使っている場合、通常はデフォルトで入っていますが、PDF出力などを行うために最新のツールチェーンを整えておくのがプロの作法です。
ターミナルでのインストールと依存関係の確認
以下のコマンドをターミナル(またはAnaconda Prompt)で実行してください。
念のため nbconvert と、PDF生成に必要なブラウザエンジン(Playwright)をインストール
conda install -c conda-forge nbconvert
または pip派の方
pip install nbconvert
インストールされたバージョンを確認して、正しくパスが通っているかチェック
jupyter nbconvert –version
> 先輩からのワンポイントアドバイス:
> 以前の `nbconvert` でPDFを出力しようとすると、巨大で難解な LaTeX(TeX Live)をインストールする必要があり、容量が数GBにも膨れ上がる地獄の作業が待っていました。しかし、現在の `nbconvert`(バージョン6以降)では、WebPDF exporter という機能が標準搭載されており、裏側でヘッドレスブラウザ(Chromium)を動かしてHTML経由で綺麗なPDFをレンダリングします。そのため、複雑なTeX環境の構築は不要です!
動作確認:まずはHTMLに変換してみよう
適当なJupyter Notebookファイル(例: `report.ipynb`)を用意し、以下のコマンドを叩いてみてください。
notebook を綺麗でモダンな HTML に変換する
jupyter nbconvert –to html report.ipynb
これだけで、同じディレクトリに `report.html` が生成されます。ブラウザで開いてみてください。JupyterLabの画面そのままではなく、クリーンでスタイリッシュなレポートとして閲覧できるはずです。
—
3. 用途別!HTML・PDF・スライドへの書き出し実践
ここからが本番です。実務で求められる3つのフォーマットへの変換方法を、コマンドとともに見ていきましょう。
A. インタラクティブな「HTMLレポート」の生成
Webで共有したり、社内Wikiに貼り付けたりするのに最も適しています。コードを折りたたんだり、不要な入力プロンプト(`In [1]:` など)を隠したりするオプションを付与するのが実戦的です。
jupyter nbconvert –to html \
–TemplateExporter.exclude_input=False \
–no-input=False \
report.ipynb
- ※ `–no-input=True` にすると、コードセルがすべて消え、マークダウンとグラフ(出力結果)だけの「非エンジニア向け美しいレポート」が一瞬で完成します。これは上司への報告時にめちゃくちゃ重宝します。
B. 紙やメールで配る「PDFレポート」の生成
前述のWebPDF機能を使って、PDFをダイレクトに出力します。
ヘッドレスChromiumを使用してHTMLを経由し、高精度なPDFを生成
jupyter nbconvert –to webpdf –allow-script report.ipynb
- `–allow-script` を付与することで、ノートブック内に含まれるインタラクティブなJavaScriptや可視化ライブラリ(PlotlyやBokehなど)の描画を待ってからPDF化してくれます。これでグラフが真っ白になる悲劇を防げます。
C. プレゼン用の「Reveal.jsスライド」の生成
Jupyter Notebookのセルをそのままスライドの1枚1枚に見立てて、リッチなHTMLスライド(Reveal.js)を生成できます。
スライドショー形式へ変換
jupyter nbconvert –to slides report.ipynb –post serve
- `–post serve` をつけると、変換した瞬間にローカルサーバーが立ち上がり、ブラウザでそのままプレゼンテーションをプレビュー・開始できます。スペースキーでスライドが次々に切り替わる感覚は病みつきになりますよ。
—
4. プロの技:CSSによる独自スタイルの適用法
デフォルトの出力でも綺麗ですが、企業のブランドカラーに合わせたり、フォントや余白をカスタムしたいですよね。`nbconvert` は Jinja2 テンプレートと CSS を組み合わせることで、完全にオリジナルのデザインを適用できます。
ここでは、最も需要の高い「HTML/PDF出力に独自のCSSを適用する方法」をステップバイステップで解説します。
ステップ1: カスタムCSSファイルを作成する
プロジェクトディレクトリに `custom.css` というファイルを作成し、お好みのスタイルを記述します。例えば、見出しの色を変え、フォントを調整し、余白をすっきりさせる設定は以下の通りです。
/ custom.css – 独自レポートスタイル定義 /
/ 全体のフォントとベースカラーの変更 /
body {
font-family: ‘Helvetica Neue’, Arial, sans-serif;
color: #2c3e50;
line-height: 1.6;
background-color: #fdfdfd;
}
/ h1見出しをモダンなアクセントカラーに /
h1 {
color: #2980b9;
border-bottom: 2px solid #3498db;
padding-bottom: 0.3em;
}
/ コードセルの背景色を落ち着いたグレーに /
div.input_area {
background-color: #f8f9fa !important;
border: 1px solid #e9ecef !important;
border-radius: 4px;
}
/ 出力エリアの調整 /
div.output_wrapper {
margin-top: 10px;
}
ステップ2: CSSを読み込ませて変換を実行する
作成したCSSファイルを、`nbconvert` の `–ExecutePreprocessor.enabled` やカスタムCSS引数として渡します。
jupyter nbconvert –to webpdf \
–css custom.css \
–allow-script \
report.ipynb
たったこれだけで、社外秘レポートやクライアント提出用の資料としてそのまま通用する、洗練されたプロフェッショナルなPDFが自動生成されます。
—
5. 自動化の極み:PythonスクリプトやCI/CDへの組み込み
手動でコマンドを叩くだけでも便利ですが、これをPythonスクリプト化しておけば、毎日のデータ更新と同時に自動でPDFレポートを生成し、Slackやメールに飛ばすパイプラインが組めるようになります。
以下は、Pythonから `nbconvert` のAPIを直接叩くスニペットです。
report_generator.py
import nbformat
from nbconvert import WebPDFExporter
from traitlets.config import Config
def generate_pdf_report(notebook_path, output_path, css_path):
# 1. 設定(Config)の初期化とCSSの指定
c = Config()
c.WebPDFExporter.preprocessors = [
“nbconvert.preprocessors.TagRemovePreprocessor”
]
# エクスポーターのインスタンス化
exporter = WebPDFExporter(config=c)
exporter.css_file = css_path
# 2. ノートブックの読み込み
with open(notebook_path, “r”, encoding=”utf-8″) as f:
notebook_content = nbformat.read(f, as_version=4)
# 3. 変換の実行
print(f”Generating PDF from {notebook_path}…”)
(body, resources) = exporter.from_notebook_node(notebook_content)
# 4. ファイルへの書き出し
with open(output_path, “wb”) as f:
f.write(body)
print(f”Successfully generated: {output_path}”)
if __name__ == “__main__”:
# 実行例
generate_pdf_report(
notebook_path=”report.ipynb”,
output_path=”final_report.pdf”,
css_path=”custom.css”,
)
これを例えば `cron` や GitHub Actions などのCI/CDパイプラインに組み込んでおけば、「毎週月曜日の朝8時に、最新データを反映した美しい分析レポートのPDFが自動で生成され、チームのストレージに保存される」という夢のような自動化環境が完成します。
—
まとめ
今回は、JupyterLabの隠れた名機能 `nbconvert` を使って、レポート作成を自動化し、さらにCSSで独自スタイルを適用する実践テクニックを解説しました。
- Jupyter Notebookの裏側はJSONであり、nbconvertはそれを柔軟にレンダリングするエンジンである。
- HTML、WebPDF、Reveal.jsスライドへの変換がワンコマンドで行える。
- CSSを当てれば、誰でも一瞬でプロフェッショナルなデザインの成果物を作れる。
- Python API経由で呼び出せば、定期実行やCI/CDへの組み込みも容易。
「データを集めて分析して終わり」ではなく、「価値をわかりやすく伝えるドキュメントとして自動で出力する」ところまでをコードでデザインできるようになると、あなたのエンジニア・データサイエンティストとしての市場価値は跳ね上がります。
ぜひ今日の業務から取り入れて、手動でのドキュメントコピペ作業から解放されてくださいね!