NaN/NaN/NaN

技術ドキュメント、議事録、README――エンジニアが日常的に書くMarkdownを、そのままPDFとして出力したい場面は多くあります。しかし、Markdownから美しいPDFを生成するには、HTMLへの変換、CSSの適用、レンダリングエンジンの用意と、意外に手間がかかります。

FUNBREW PDFの Markdown → PDF API を使えば、Markdownテキストを送るだけで、テーマ付きの美しいPDFが即座に生成されます。この記事では、APIの使い方からテーマの選び方、各言語でのSDK利用例まで、体系的に解説します。

HTML→PDF変換の全体像を先に把握したい方はHTML→PDF変換 完全ガイドを、各言語のセットアップから始めたい方は言語別クイックスタートをご覧ください。

なぜMarkdown→PDF変換が必要なのか

Markdownは軽量で読みやすいフォーマットですが、PDFに変換する際にはいくつかの課題があります。

  • スタイリング: Markdownにはスタイル情報がないため、PDF化するとプレーンテキストのような見た目になりがち
  • テーブル・コードブロック: GFMの拡張構文を正しくレンダリングするにはパーサーの対応が必要
  • 一貫性: プロジェクトごとに異なるスタイルを適用するのが煩雑
  • インフラ: Chromiumヘッドレスやwkhtmltopdfの管理が必要

これらの課題をすべて解決するのが、FUNBREW PDFのMarkdown → PDF APIです。

APIの基本的な使い方

エンドポイント

POST /api/pdf/generate-from-markdown

最小リクエスト

curl -X POST https://api.funbrew.dev/api/pdf/generate-from-markdown \
  -H "Authorization: Bearer sk-your-api-key" \
  -H "Content-Type: application/json" \
  -d '{"markdown": "# Hello World\n\nThis is **bold** text."}'

パラメータ一覧

パラメータ 必須 説明
markdown string o Markdownテキスト(最大5MB)
theme string テーマ名(デフォルト: business
filename string ダウンロード時のファイル名
options.page-size string A3, A4, A5, Letter, Legal
options.engine string quality(Chromium)/ fast(wkhtmltopdf)
email.to string PDF添付メールの送信先

5つのビルトインテーマ

テーマを変えるだけで、同じMarkdownからまったく異なるデザインのPDFが生成されます。

テーマ名 特徴 おすすめ用途
business 落ち着いた配色、プロフェッショナルなレイアウト 報告書、提案書
modern 洗練されたタイポグラフィ、アクセントカラー プレゼン資料、技術仕様書
minimal 余白を活かしたシンプルデザイン メモ、議事録
academic セリフ書体、論文スタイル 学術論文、レポート
creative カラフルで独創的なレイアウト ポートフォリオ、ニュースレター

HTMLテンプレートから独自デザインのPDFを生成したい場合はPDFテンプレートエンジン活用ガイドも参考にしてください。

テーマ一覧はAPIでも取得できます:

curl https://api.funbrew.dev/api/markdown/themes

テーマ詳細比較

各テーマのCSS特性と最適な利用シーンを詳しく見ていきましょう。

business はセリフ体の見出し、ネイビー系のアクセントカラー、行間1.6のゆったりしたレイアウトが特徴です。クライアント向けの報告書や提案書など、フォーマルな書類に最適です。見出しと本文のコントラストがはっきりしており、長文でも読みやすい設計になっています。

modern はサンセリフ体を全面的に採用し、#2563EB(ブルー系)のアクセントカラーとタイトな行間で、情報密度の高いドキュメントに向いています。社内の技術仕様書やプレゼン資料の配布用PDFに適しています。

minimal はシステムフォントを使用し、装飾色を一切排除したシンプルなデザインです。広めのマージンで余白を活かし、テキストの読みやすさを最優先にしています。議事録やちょっとしたメモなど、素早く作成してすぐ共有したい場面に向いています。

academic はTimes New Romanスタイルのセリフ体、ダブルスペーシング、脚注サポートを備えた論文向けテーマです。大学のレポートや学術論文のドラフト作成に最適です。

creative はグラデーション付きの見出し、カード風のコードブロック、カラフルな配色パレットが特徴です。ポートフォリオやニュースレターなど、ビジュアルインパクトを重視したい場面で力を発揮します。

すべてのテーマを一括で比較したい場合は、以下のようにプログラムで各テーマのPDFを生成して見比べることができます。

const themes = ['business', 'modern', 'minimal', 'academic', 'creative'];
for (const theme of themes) {
  const result = await pdf.fromMarkdown(markdown, theme);
  console.log(`${theme}: ${result.data.download_url}`);
}

各言語のSDKで使う

Python

from funbrew_pdf import FunbrewPdf

pdf = FunbrewPdf("sk-your-api-key")

# シンプルな変換
result = pdf.from_markdown("# 月次レポート\n\n売上は前月比120%でした。")
print(result["data"]["download_url"])

# テーマ指定
result = pdf.from_markdown("# 論文タイトル\n\n## 要旨\n\n...", theme="academic")

Node.js

const { FunbrewPdf } = require('@funbrew/pdf');
const pdf = new FunbrewPdf('sk-your-api-key');

// テーマ付きで変換
const result = await pdf.fromMarkdown('# Meeting Notes\n\n- Item 1\n- Item 2', 'modern');
console.log(result.data.download_url);

PHP

$pdf = new Funbrew\Pdf\FunbrewPdf('sk-your-api-key');

// ファイルから読み込んで変換
$markdown = file_get_contents('report.md');
$result = $pdf->fromMarkdown($markdown, 'business');
echo $result['data']['download_url'];

GFM(GitHub Flavored Markdown)対応

FUNBREW PDFのMarkdown変換エンジンは、GitHub Flavored Markdownに完全対応しています。以下の拡張構文がすべてPDFに正しくレンダリングされます。

テーブル

| 機能 | Free | Starter | Basic |
|------|:---:|:---:|:---:|
| HTML → PDF | o | o | o |
| Markdown → PDF | o | o | o |
| テンプレート | 1個 | 3個 | 5個 |

コードブロック(シンタックスハイライト)

```python
def generate_pdf(markdown_text):
    pdf = FunbrewPdf("sk-key")
    return pdf.from_markdown(markdown_text)
```

タスクリスト

- [x] API設計
- [x] バックエンド実装
- [ ] フロントエンド統合
- [ ] ドキュメント作成

HTMLプレビューAPI

PDF生成前に見た目を確認したい場合は、プレビューAPIが便利です。

curl -X POST https://api.funbrew.dev/api/markdown/preview \
  -H "Content-Type: application/json" \
  -d '{"markdown": "# Preview Test", "theme": "modern"}'

このエンドポイントは認証不要なので、フロントエンドから直接呼び出してリアルタイムプレビューを表示することも可能です。

CI/CDパイプラインでの自動PDF生成

MarkdownファイルをGitで管理している場合、GitHub Actionsを使ってプッシュ時に自動でPDFを生成できます。ドキュメントの更新がそのままPDF成果物に反映される仕組みを構築しましょう。

GitHub Actions ワークフロー

# .github/workflows/generate-pdf.yml
name: Generate PDF from Markdown

on:
  push:
    paths:
      - 'docs/**/*.md'
    branches: [main]

jobs:
  generate-pdf:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install SDK
        run: npm install @funbrew/pdf

      - name: Generate PDFs from Markdown
        env:
          FUNBREW_API_KEY: ${{ secrets.FUNBREW_API_KEY }}
        run: |
          node scripts/generate-pdfs.js

      - name: Upload PDF artifacts
        uses: actions/upload-artifact@v4
        with:
          name: generated-pdfs
          path: output/*.pdf
          retention-days: 30

変換スクリプト

// scripts/generate-pdfs.js
const { FunbrewPdf } = require('@funbrew/pdf');
const fs = require('fs');
const path = require('path');
const glob = require('glob');

const pdf = new FunbrewPdf(process.env.FUNBREW_API_KEY);

async function main() {
  const files = glob.sync('docs/**/*.md');
  fs.mkdirSync('output', { recursive: true });

  for (const file of files) {
    const markdown = fs.readFileSync(file, 'utf-8');
    const basename = path.basename(file, '.md');

    console.log(`Converting: ${file}`);
    const result = await pdf.fromMarkdown(markdown, 'business');

    // ダウンロードURLからPDFを取得
    const response = await fetch(result.data.download_url);
    const buffer = Buffer.from(await response.arrayBuffer());
    fs.writeFileSync(`output/${basename}.pdf`, buffer);

    console.log(`Generated: output/${basename}.pdf`);
  }
}

main().catch(console.error);

テーマを自動切り替える

ファイルパスに応じてテーマを自動選択することもできます。

function getThemeForPath(filePath) {
  if (filePath.includes('reports/')) return 'business';
  if (filePath.includes('papers/')) return 'academic';
  if (filePath.includes('notes/')) return 'minimal';
  return 'modern';
}

// 使用例
const theme = getThemeForPath(file);
const result = await pdf.fromMarkdown(markdown, theme);

この自動化パターンはチームのドキュメント運用に特に有効です。GitHubにMarkdownをプッシュするだけで、常に最新のPDFが自動生成されます。サーバーレス環境での応用や、本番運用のベストプラクティスもあわせて確認してください。

レポート生成への応用

Markdownで定型レポートを管理する場合、変数の差し込みと組み合わせることで強力なレポート生成パイプラインが構築できます。詳細はレポートPDF生成ガイドを参照してください。

const template = fs.readFileSync('templates/monthly-report.md', 'utf-8');

// 変数を置換
const markdown = template
  .replace('{{month}}', '2026年3月')
  .replace('{{revenue}}', '¥1,250,000')
  .replace('{{growth}}', '+15%');

const result = await pdf.fromMarkdown(markdown, 'business');

Puppeteerからの移行

これまでPuppeteerやPlaywrightでMarkdownをHTML変換してからPDF化していた場合、FUNBREW PDFに移行することでインフラ管理が不要になります。ヘッドレスブラウザの管理コストやメモリ消費の問題を解消できます。移行の詳細はPuppeteer移行ガイドを参照してください。

比較項目 Puppeteer FUNBREW PDF API
インフラ Chromium管理が必要 不要(API呼び出しのみ)
テーマ 自前でCSS作成 5種類のビルトインテーマ
GFM対応 プラグイン追加が必要 標準対応
CI/CD Docker + Chromiumが重い npm installだけで完結

他のPDF APIとの機能・料金比較はPDF API比較ガイド料金プラン比較をご覧ください。

エラーハンドリングとセキュリティ

本番環境でMarkdown→PDF APIを運用する際は、タイムアウトやレート制限への対策が重要です。エラーハンドリング完全ガイドで指数バックオフの実装方法を確認してください。APIキーの安全な管理はセキュリティガイドで解説しています。

大量のMarkdownファイルを一括変換する場合はPDF一括生成ガイドのバッチ処理パターンが活用できます。

無料で試す

FUNBREW PDFでは、Markdown → PDFページでAPIキーなしで無料変換を体験できます。.mdファイルのドラッグ&ドロップにも対応しています。

より本格的に使いたい場合は、PlaygroundでAPIリクエストを試すか、ダッシュボードから透かしなしのMarkdownツールを利用してください。

日本語Markdownの注意点

日本語を含むMarkdownをPDFに変換する際には、英語のみのドキュメントとは異なる考慮点があります。

全角文字と行の長さ

日本語の全角文字は半角文字の約2倍の幅を取ります。テーブルのセル内容や見出しが長くなりがちなので、1行あたりの文字数を意識して改行を入れると、PDF上のレイアウトが崩れにくくなります。

フォント選択

FUNBREW PDFでは Noto Sans JP がプリインストールされています。本文テキストに最適化されたフォントで、見出しから本文まで美しく表示されます。CSSでfont-familyを指定する場合は、日本語フォントを英語フォントより先に記述するのがポイントです。

font-family: "Noto Sans JP", "Helvetica Neue", Arial, sans-serif;

この優先順位により、日本語文字はNoto Sans JPで、英数字はHelveticaやArialでレンダリングされます。

日英混在テキスト

日本語と英語が混在する技術文書では、font-familyの優先順序が特に重要です。日本語フォントを先に指定しないと、英語フォントのフォールバックで日本語が正しく表示されないことがあります。

ルビ(ふりがな)について

標準的なMarkdown構文ではルビ(ふりがな)はサポートされていません。ルビが必要な場合は、Markdown内にHTMLの<ruby>タグを直接記述してください。

通常のテキストに<ruby>漢字<rp>(</rp><rt>かんじ</rt><rp>)</rp></ruby>のルビを付けられます。

縦書き(たてがき)

縦書きレイアウトはMarkdown→PDF APIではサポートされていません。縦書きが必要な場合は、HTMLテンプレートを使ったPDF生成をご検討ください。詳しくはPDFテンプレートエンジン活用ガイドを参照してください。

よくある変換トラブルと対策

Markdown→PDF変換で遭遇しやすい問題と、その解決方法をまとめます。

テーブルの列が潰れる

テーブルのセル内容が長い場合、列幅が圧縮されて読みにくくなることがあります。対策としては、セル内のテキストを短くするか、options.page-sizeA3Letterに変更してページ幅を広げてください。

{
  "markdown": "...",
  "theme": "business",
  "options": {
    "page-size": "A3"
  }
}

コードブロックが途切れる

非常に長い行を含むコードブロックは、デフォルトで折り返しが行われます。折り返しを避けたい場合は、options.enginequality(Chromium)を指定してください。Chromiumエンジンはオーバーフロー処理がより適切に行われます。

{
  "markdown": "...",
  "options": {
    "engine": "quality"
  }
}

画像が表示されない

Markdownの![alt](url)構文で参照する画像は、パブリックにアクセス可能なURLである必要があります。ローカルファイルパスは使用できません。代わりに、Base64データURIを使用することも可能です。

![図表](https://example.com/public-image.png)

絵文字が正しく表示されない

Markdown内の絵文字(例: 完了、未完了など)は、qualityエンジン(Chromium)では正しくレンダリングされます。fastエンジン(wkhtmltopdf)では四角い記号(トーフ)として表示される場合があるため、絵文字を含むドキュメントにはqualityエンジンの使用をおすすめします。

まとめ

  • Markdownテキストを送るだけでテーマ付きPDFが生成される
  • 5種類のテーマで用途に応じたデザインを選択可能
  • GFM完全対応でテーブル・コードブロック・チェックリストも美しくレンダリング
  • Python / Node.js / PHP のSDKからワンライナーで利用可能
  • プレビューAPIで事前に仕上がりを確認できる

Markdown → PDF変換の詳細はAPIリファレンスをご覧ください。APIキーの取得はダッシュボードから無料で始められます。請求書や証明書など実務でのPDF活用事例は請求書PDF自動化ガイド証明書PDF自動化ガイドも参考にしてください。Next.jsやNuxtでの統合はNext.js・Nuxt PDF APIガイド、Django/FastAPIでの利用はDjango/FastAPIガイドもあわせてどうぞ。

Powered by FUNBREW PDF