lovstudio:any2pdf について
lovstudio:any2pdf は、Markdown 文書を組版した PDF に変換するスキルです。レポートや出版向け文書の作成に使え、reportlab による CJK・ラテン文字の混在やコードブロック、表などの処理に対応します。
主な機能
- 01Markdown を組版 PDF に変換
- 02CJK とラテン文字の混在に対応
- 03コードブロック、表、入れ子リストを処理
- 04画像、コールアウト、絵文字、数式を描画
- 05表紙、目次、透かし、テーマを設定
活用シーン
- 01技術レポートを PDF に出力
- 02CJK 文字を含む文書を作成
- 03PDF に表紙、目次、透かしを追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ lovstudio/ any2pdf --skill lovstudio:any2pdfインストール後、Claude Code で/lovstudio:any2pdfを入力して読み込まれたか確認します。
同梱ファイルreferences/themes.mdscripts/md2pdf.py
詳細
any2pdf — Markdown からプロ品質の PDF を作成
このスキルは、Python の reportlab ライブラリを使用して、あらゆる Markdown ファイルを出版品質の PDF に変換します。実際の中国語の技術レポートを使って何度も改善を重ねて開発されており、単純な MD→PDF 変換ツールがうまく処理できない、いくつかの難しい問題を解決します。
使用する場面
- ユーザーが
.md→.pdfへの変換を希望している - ユーザーが Markdown のレポートやドキュメントを持っていて、プロフェッショナルな組版を希望している
- ドキュメントに CJK 文字とラテン文字が混在している
- ドキュメントにフェンス付きコードブロック、Markdown テーブル、入れ子のリストが含まれている
- ドキュメントにローカル/リモート画像、Obsidian のコールアウト、絵文字、数式が含まれている
- ユーザーが PDF に表紙、目次、透かしを入れたい
クイックスタート
python md2pdf/scripts/md2pdf.py \
--input report.md \
--output report.pdf \
--title "My Report" \
--author "Author Name" \
--theme warm-academic
--input 以外のパラメーターはすべて省略可能です。適切なデフォルト値が適用されます。
変換前のオプション(必須)
重要:変換を実行する前に、必ず AskUserQuestion ツールを使って質問してください。オプションを通常のテキストで列挙しないでください。ユーザーに適切な対話型プロンプトを表示するため、必ずこのツールを使用してください。すべてのオプションを 1 回の AskUserQuestion 呼び出しで質問してください。
以下のテンプレートを使用して AskUserQuestion を実行してください。デザインアシスタントのように、親しみやすく簡潔な口調にします。設定フォームのような口調にはしないでください。
开始转 PDF!先帮你确认几个选项 👇
━━━ 📐 设计风格 ━━━
a) 暖学术 — 陶土色调,温润典雅,适合人文/社科报告
b) 经典论文 — 棕色调,灵感源自 LaTeX classicthesis,适合学术论文
c) Tufte — 极简留白,深红点缀,适合数据叙事/技术写作
d) 期刊蓝 — 藏蓝严谨,灵感源自 IEEE,适合正式发表风格
e) 精装书 — 咖啡色调,书卷气,适合长篇专著/技术书
f) 中国红 — 朱红配暖纸,适合中文正式报告/白皮书
g) 水墨 — 纯灰黑,素雅克制,适合文学/设计类内容
h) GitHub — 蓝白极简,程序员熟悉的风格
i) Nord 冰霜 — 蓝灰北欧风,清爽现代
j) 海洋 — 青绿色调,清新自然
━━━ 🖼 扉页图片(封面之后的全页插图) ━━━
1) 跳过
2) 我提供本地图片路径
3) AI 根据内容自动生成一张
━━━ 💧 水印 ━━━
1) 不加
2) 自定义文字(如 "DRAFT"、"内部资料")
━━━ 📇 封底物料(名片/二维码/品牌) ━━━
1) 跳过
2) 我提供图片
3) 纯文字信息
示例回复:"a, 扉页跳过, 水印:仅供学习参考, 封底图片:/path/qr.png"
直接说人话就行,不用记编号 😄
ユーザーの選択肢と CLI 引数の対応
| 選択肢 | CLI 引数 |
|---|---|
| デザインスタイル a-j | 下の表の値を使った --theme |
| 扉絵(ローカル) | --frontispiece <path> |
| 扉絵(AI) | まず画像を生成し、その後 --frontispiece /tmp/frontispiece.png |
| 透かしテキスト | --watermark "文字" |
| 裏表紙の画像 | --banner <path> |
| 裏表紙のテキスト | --disclaimer "声明" および/または --copyright "© 信息" |
テーマ名の対応
| 選択肢 | --theme の値 | 参考 |
|---|---|---|
| a) 暖かくアカデミック | warm-academic | Lovstudio のデザインシステム |
| b) 古典的な論文 | classic-thesis | LaTeX classicthesis |
| c) Tufte | tufte | Edward Tufte の書籍 |
| d) ジャーナルブルー | ieee-journal | IEEE ジャーナル形式 |
| e) 装丁本 | elegant-book | LaTeX ElegantBook |
| f) 中国の赤 | chinese-red | 中国の公式文書 |
| g) 水墨 | ink-wash | 水墨画 |
| h) GitHub | github-light | GitHub Markdown スタイル |
| i) Nord | nord-frost | Nord のカラースキーム |
| j) 海洋 | ocean-breeze | — |
AI 生成の扉絵の扱い
ユーザーが AI 生成を選んだ場合:ドキュメントのタイトルと冒頭の段落を読み、選択されたデザインスタイルに合うテーマのイラストを画像生成ツールで作成します。ユーザーに確認してもらった後、--frontispiece /path/to/image.png を指定します。
アーキテクチャ
Markdown → Preprocess (split merged headings) → Parse (code-fence-aware) → Story (reportlab flowables) → PDF build
主なコンポーネント:
- フォントシステム:macOS では本文に Palatino(ラテン文字)、Songti SC(CJK)、コードに Menlo を使用します。Linux では自動的に代替フォントに切り替わります
- CJK ラッパー:
_font_wrap()は CJK 文字列を<font>タグで囲み、フォントを自動的に切り替えます - 混在テキストレンダラー:
_draw_mixed()はキャンバス上の CJK/ラテン文字の混在テキスト(表紙、ヘッダー、フッター)を処理します - コードブロックハンドラー:
esc_code()は reportlab の Paragraph 内でインデントと改行を保持します - スマートなテーブル幅:コンテンツの長さに基づいて列幅を比例配分し、最小幅を 18mm にします
- ブックマークシステム:
ChapterMarkフロアブルが PDF のサイドバー用ブックマークと名前付きアンカーを作成します - 見出しプリプロセッサー:
_preprocess_md()は# Part## Chapterのように結合された見出しを個別の行に分割します - 画像ハンドラー:ローカル、相対パス、
file://、リモートの Markdown 画像を本文のフレーム内に収まるよう拡大縮小します。エラー時は代替テキストを表示します - コールアウトレンダラー:Obsidian 形式の
> [!NOTE]ブロックを、テーマに合わせたボックス型のコールアウトとして描画します - 数式レンダラー:ディスプレイ数式には、オプションで matplotlib mathtext の画像を使用します。利用できない場合は、スタイル付きテキストにフォールバックします
- 絵文字のフォールバック:利用可能な場合はキャッシュ済みの Twemoji PNG として絵文字を描画し、そうでない場合はローカルの絵文字フォントにフォールバックします
試行錯誤から得た教訓
CJK 文字が□として表示される
reportlab の Paragraph は、ParagraphStyle 内のフォントのみを使用します。fontName="Mono" でテキストに中国語が含まれている場合、□として表示されます。修正方法:コードブロックを含め、CJK を含む可能性のあるすべてのテキストに _font_wrap() を適用してください。
コードブロックの改行が失われる
reportlab は \n を空白として扱います。修正方法:esc_code() で \n を <br/> に、すべてのスペースを に変換し、_font_wrap() の前にインデントと行内の配置を保持します。
CJK/ラテン文字の行折り返し
reportlab のデフォルトではスペースでのみ改行されるため、「Claude\nCode」のような不自然な分割が発生します。修正方法:本文と箇条書きのスタイルに wordWrap='CJK' を設定し、CJK 文字の境界で改行できるようにします。
CJK を含む Canvas のテキスト(表紙/フッター)
ラテン文字用フォントを指定した drawString()/drawCentredString() では、年/月/日などを描画できません。修正方法:ユーザーの入力内容を含む Canvas のテキスト(日時、統計、免責事項)すべてに _draw_mixed() を使用してください。
設定リファレンス
ほとんどのオプションは、ファイル先頭の YAML 形式のフロントマターでも設定できます。明示的な CLI 引数は、フロントマターの値より優先されます。
| 引数 | フロントマターのキー | デフォルト | 説明 |
|---|---|---|---|
--input | — | (必須) | Markdown ファイルのパス |
--output | — | output.pdf | 出力 PDF のパス |
--title | title | 最初の H1 から取得 | 表紙に表示するドキュメントのタイトル |
--subtitle | subtitle | "" | サブタイトルのテキスト |
--author | author | "" | 著者名 |
--date | date | 今日 | 日付文字列 |
--version | version | "" | 表紙に表示するバージョン文字列 |
--watermark | watermark | "" | 透かしのテキスト(空の場合はなし) |
--theme | theme | warm-academic | 配色テーマ名 |
--theme-file | — | "" | カスタムテーマ JSON ファイルのパス |
--cover | cover | true | 表紙を生成する |
--toc | toc | true | 目次を生成する |
--page-size | page-size | A4 | ページサイズ(A4 または Letter) |
--frontispiece | frontispiece | "" | 表紙の後に配置する全ページ画像 |
--banner | banner | "" | 裏表紙のバナー画像 |
--header-title | header-title | "" | ページヘッダーに表示するレポートタイトル |
--footer-left | footer-left | author | フッターに表示するブランド名/著者名 |
--stats-line | stats-line | "" | 表紙に表示する統計情報 |
--stats-line2 | stats-line2 | "" | 2 行目の統計情報 |
--edition-line | edition-line | "" | 表紙下部に表示する版数 |
--disclaimer | disclaimer | "" | 裏表紙の免責事項 |
--copyright | copyright | "" | 裏表紙の著作権表示 |
--code-max-lines | code-max-lines | 30 | コードブロックあたりの最大行数 |
テーマ
利用可能なテーマ:warm-academic、nord-frost、github-light、solarized-light、
paper-classic、ocean-breeze。
各テーマでは、ページの背景色、文字色、アクセントカラー、薄い文字色、枠線、コードの背景色、透かしの色合いを定義します。
依存関係
pip install reportlab --break-system-packages
# Optional formula rendering:
pip install matplotlib --break-system-packages
推奨する Ubuntu/Debian フォント:
sudo apt install fonts-dejavu-core fonts-liberation fonts-freefont-ttf fonts-noto fonts-noto-cjk fonts-noto-color-emoji