本文へ移動
ブログに戻る
2026年11月2日月曜日

Markdown PDF 一括変換:ブラウザ ZIP・CLI・Pandoc・CI

ブラウザで最大 15 個の Markdown を ZIP に一括出力し、CLI で個別 PDF を自動生成、Pandoc で章を結合する方法を解説します。実行枠や失敗ファイルも確認します。章順、画像パス、フォント、CI の手順も残しています。

Markdown PDF 一括変換:ブラウザ ZIP・CLI・Pandoc・CI

短い答え

よくある 3 つのバッチタスク:

  1. 1 つの Markdown → 1 つの PDF を多文書分繰り返す: md-to-pdf *.md(npm CLI)。
  2. 複数の Markdown → 1 つの結合 PDF(本、章付きレポート): pandoc chapter*.md -o book.pdf。
  3. 複数の Markdown → コミットごとに PDF: GitHub Actions + npm CLI。

ブラウザにも一括処理があります。一括出力なら CLI の導入なしで個別の出力を作成できます。/markdown-to-pdfは単独の文書向けです。成果物に応じてブラウザ一括処理、ローカル自動化、結合 PDF を選びます。

ブラウザ一括出力:個別 PDF を 1 つの ZIP に

一括出力を開き、最大 15 個の Markdown をアップロードします。PDF と共通の描画設定を選び、出力を実行します。出力形式は PNG、JPEG、WebP、PDF、DOCX に対応しています。有料機能で、Creator は月 20 回の一括実行を含みます。

ZIP には成功した入力ごとに 1 つの出力が入ります。失敗したファイルは .error.txt の内容を確認し、全件成功したと思い込まないでください。少なくとも 1 ファイルが成功すると 1 回分を消費します。15 個の PDF を含む ZIP は 15 文書の集合であり、1 冊の結合 PDF ではありません。

下のサンプルを入力ファイルの 1 つとして使います。見出し、リスト、末尾の注記をプレビューとダウンロード用 PDF で確認し、ほかの出力も個別に点検してください。

# Chapter 01: export checks

## Scope
This sample represents one source file in a multi-file export.

- Keep one output per input file
- Check every generated file
- Inspect the ZIP for error notes

> A ZIP of PDFs is different from one merged PDF.

個別ファイルと結合 PDF の違いを示す章サンプルの出力

サンプル PDF をダウンロード

シナリオ 1 — N → N(Markdown ファイルごとに PDF)

最もシンプルなケース。chapter01.md、chapter02.md、… があり、chapter01.pdf、chapter02.pdf、… が欲しい。

npm install -g md-to-pdf
md-to-pdf 'chapters/*.md'

以上 — デフォルトで各 .md の隣に .pdf を書き出します。スタイルシートで見た目を制御:

md-to-pdf 'chapters/*.md' --stylesheet ./style.css

何百ものファイルを並列化:

find chapters -name '*.md' -print0 | xargs -0 -P 4 -I {} md-to-pdf '{}'

低い並列数から始め、CPU とメモリを見ながら増やします。各ワーカーがブラウザプロセスを起動する場合があります。

シナリオ 2 — N → 1(複数の .md を 1 つの PDF に)

本、技術レポート、多ファイルオンボーディングドキュメントに適しています。

Pandoc(順序付き章に最適)

pandoc chapter01.md chapter02.md chapter03.md -o book.pdf

落とし穴: ファイル名の順序が重要。Pandoc は引数順、アルファベット順ではありません。シェル展開を意識的に:

pandoc chapter*.md -o book.pdf  # alphabetical order, fine if you've zero-padded

目次付き:

pandoc chapter*.md --toc -o book.pdf

章単位の構造を選び、対応する PDF エンジンとテンプレートを確認します。

pandoc chapter*.md --toc --top-level-division=chapter -o book.pdf

連結してから md-to-pdf で描画する

Pandoc をインストールしたくないなら先に連結します:

: > combined.md
for f in chapter*.md; do
  cat "$f" >> combined.md
  printf '\n\n<div style="page-break-before: always;"></div>\n\n' >> combined.md
done
md-to-pdf combined.md

挿入した HTML は、ここで使う HTML/Chromium 経路への改ページの指示です。生成した PDF を確認してください。生の HTML や印刷 CSS の扱いは Markdown 変換ツールごとに異なります。

シナリオ 3 — CI/CD(コミット毎に PDF)

main へのプッシュごとに PDF を生成する GitHub Actions:

# .github/workflows/build-pdfs.yml
name: Build PDFs
on:
  push:
    branches: [main]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 24
      - run: npm install -g md-to-pdf
      - run: md-to-pdf 'docs/**/*.md'
      - uses: actions/upload-artifact@v4
        with:
          name: pdfs
          path: 'docs/**/*.pdf'

docs/ 以下のすべての Markdown に md-to-pdf を走らせ、PDF をビルドアーティファクトとしてアップロード。タグプッシュに切り替えると Release に添付できます。

よくある落とし穴

  1. 結合 PDF で画像パスが壊れる。 chapter01.md が ./images/a.png を参照している場合、連結したファイルでパスが壊れます。絶対パスに、もしくは data URI として埋め込む、または Pandoc で --resource-path=. を使います。
  2. front matter。 Pandoc では後の YAML メタデータブロックが、前の同名フィールドを上書きします。書籍全体の情報を統一し、メタデータの規則を確認してください。
  3. ページ番号。 --top-level-division=chapter が変えるのは見出しの区分で、ページ番号の規則ではありません。エンジンとテンプレートで設定し、PDF を確認します。区分の設定も参照してください。
  4. Unicode / CJK フォント。 Pandoc + XeLaTeX はインストール済みフォントを明示します。例:--pdf-engine=xelatex -V mainfont:"Source Han Serif CN"。ローカル Chromium は実行環境のフォントを使い、ホスト型は実文字で対応範囲を試します。
  5. 大規模バッチのメモリ。 ブラウザ系変換は資源を使います。並列数を制限し、メモリを監視し、巨大な処理は再開可能な単位に分けます。

ウェブ vs CLI の使い分け

  • 文書が 1 つ → /markdown-to-pdf。
  • 共通設定の最大 15 ファイル → 有料一括出力。
  • コミットごとに再生成 → CI の CLI。
  • 章順を指定した 1 冊の本 → Pandoc と --top-level-division=chapter --toc。
  • 異なるレイアウトの既存 PDF → pdfunite または qpdf で結合。

ツールのトレードオフの詳細は Markdown PDF 方法比較 と PDF でのコードハイライト を参照。

既存 PDF のマージ

個別 PDF がある場合は、保持すべき内容に合わせてページの組み立てか PDF の再生成を選びます。

# pdfunite (poppler-utils)
pdfunite chapter01.pdf chapter02.pdf chapter03.pdf book.pdf

# or qpdf
qpdf --empty --pages chapter*.pdf -- book.pdf

# or ghostscript
gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sOutputFile=book.pdf chapter*.pdf

ページの組み立てには pdfunite や qpdf を使います。Ghostscript の pdfwrite は新しい PDF を作るため、無損失の連結ではありません。処理後にフォント、リンク、しおり、画像圧縮を確認し、機能の文書を参照してください。

よくある質問

ブラウザで一括出力できますか?

複数ファイルは有料の一括出力を使えます。1 回に最大 15 個の Markdown を受け付け、入力ごとに 1 つの出力を ZIP で取得できます。Creator は月 20 回の実行を含みます。PDF を選ぶと個別の PDF ができ、1 つの文書にまとめる場合は Pandoc を使います。

バッチでコードハイライトを保つには?

CLI は --stylesheet で渡したものを全ファイルに適用。同じテーマを一貫して使用。詳しくは コードハイライトを保持した Markdown PDF 変換。

結合 PDF の上限は?

共通のページ上限はありません。メモリ、画像、フォント、レンダラー、PDF 閲覧ソフトが影響します。代表的な大文書を試し、CI にタイムアウトを設け、巨大な手引きは分冊してください。

Pandoc はバッチで Mermaid を保ちますか?

Mermaid のフェンスが自動的に図へ変わると考えず、使う描画ツールを確認します。ローカル手順では図を画像にするか、対応する前処理を設定してください。PDF で欠けや未表示を点検します。

まとめ

何を生成したいかによる:

  • 個別ファイルを ZIP に → 有料一括出力。
  • スクリプトで個別 PDF → md-to-pdf '*.md'。
  • 複数章を 1 冊に → pandoc chapter*.md --toc -o book.pdf。
  • 継続的ビルド → GitHub Actions + CLI。
  • 既存 PDF → pdfunite または qpdf。

ときどき処理するファイル群なら、ブラウザ一括出力から始めて ZIP を確認します。複数の PDF を 1 文書に結合する機能ではありません。1 つの PDF が必要なら、上の章順を指定する Pandoc 手順か、既存 PDF の専用結合ツールを使います。

今回の更新で確認した一次資料

上記の制限とコマンドは、次の最新一次資料で確認しました:

実際に試す

MarkdownToImage を開いて Markdown を描画し、用途に合う形式を選びます。バッチ自動化の前に代表的な文書 1 件で検証してください。

ブラウザで一括出力を始める.

関連ガイド