mcpField
L
lovstudio:any2pdf

lovstudio:any2pdf

github.com/lovstudioドキュメント211509 回インストール11 週間前に更新
リポジトリ

lovstudio:any2pdf について

lovstudio:any2pdf は、Markdown 文書を組版した PDF に変換するスキルです。レポートや出版向け文書の作成に使え、reportlab による CJK・ラテン文字の混在やコードブロック、表などの処理に対応します。

主な機能

  1. 01Markdown を組版 PDF に変換
  2. 02CJK とラテン文字の混在に対応
  3. 03コードブロック、表、入れ子リストを処理
  4. 04画像、コールアウト、絵文字、数式を描画
  5. 05表紙、目次、透かし、テーマを設定

活用シーン

  1. 01技術レポートを PDF に出力
  2. 02CJK 文字を含む文書を作成
  3. 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-academicLovstudio のデザインシステム
b) 古典的な論文classic-thesisLaTeX classicthesis
c) TuftetufteEdward Tufte の書籍
d) ジャーナルブルーieee-journalIEEE ジャーナル形式
e) 装丁本elegant-bookLaTeX ElegantBook
f) 中国の赤chinese-red中国の公式文書
g) 水墨ink-wash水墨画
h) GitHubgithub-lightGitHub Markdown スタイル
i) Nordnord-frostNord のカラースキーム
j) 海洋ocean-breeze—
AI 生成の扉絵の扱い

ユーザーが AI 生成を選んだ場合:ドキュメントのタイトルと冒頭の段落を読み、選択されたデザインスタイルに合うテーマのイラストを画像生成ツールで作成します。ユーザーに確認してもらった後、--frontispiece /path/to/image.png を指定します。

アーキテクチャ

Markdown → Preprocess (split merged headings) → Parse (code-fence-aware) → Story (reportlab flowables) → PDF build

主なコンポーネント:

  1. フォントシステム:macOS では本文に Palatino(ラテン文字)、Songti SC(CJK)、コードに Menlo を使用します。Linux では自動的に代替フォントに切り替わります
  2. CJK ラッパー:_font_wrap() は CJK 文字列を <font> タグで囲み、フォントを自動的に切り替えます
  3. 混在テキストレンダラー:_draw_mixed() はキャンバス上の CJK/ラテン文字の混在テキスト(表紙、ヘッダー、フッター)を処理します
  4. コードブロックハンドラー:esc_code() は reportlab の Paragraph 内でインデントと改行を保持します
  5. スマートなテーブル幅:コンテンツの長さに基づいて列幅を比例配分し、最小幅を 18mm にします
  6. ブックマークシステム:ChapterMark フロアブルが PDF のサイドバー用ブックマークと名前付きアンカーを作成します
  7. 見出しプリプロセッサー:_preprocess_md() は # Part## Chapter のように結合された見出しを個別の行に分割します
  8. 画像ハンドラー:ローカル、相対パス、file://、リモートの Markdown 画像を本文のフレーム内に収まるよう拡大縮小します。エラー時は代替テキストを表示します
  9. コールアウトレンダラー:Obsidian 形式の > [!NOTE] ブロックを、テーマに合わせたボックス型のコールアウトとして描画します
  10. 数式レンダラー:ディスプレイ数式には、オプションで matplotlib mathtext の画像を使用します。利用できない場合は、スタイル付きテキストにフォールバックします
  11. 絵文字のフォールバック:利用可能な場合はキャッシュ済みの Twemoji PNG として絵文字を描画し、そうでない場合はローカルの絵文字フォントにフォールバックします

試行錯誤から得た教訓

CJK 文字が□として表示される

reportlab の Paragraph は、ParagraphStyle 内のフォントのみを使用します。fontName="Mono" でテキストに中国語が含まれている場合、□として表示されます。修正方法:コードブロックを含め、CJK を含む可能性のあるすべてのテキストに _font_wrap() を適用してください。

コードブロックの改行が失われる

reportlab は \n を空白として扱います。修正方法:esc_code() で \n を <br/> に、すべてのスペースを &nbsp; に変換し、_font_wrap() の前にインデントと行内の配置を保持します。

CJK/ラテン文字の行折り返し

reportlab のデフォルトではスペースでのみ改行されるため、「Claude\nCode」のような不自然な分割が発生します。修正方法:本文と箇条書きのスタイルに wordWrap='CJK' を設定し、CJK 文字の境界で改行できるようにします。

CJK を含む Canvas のテキスト(表紙/フッター)

ラテン文字用フォントを指定した drawString()/drawCentredString() では、年/月/日などを描画できません。修正方法:ユーザーの入力内容を含む Canvas のテキスト(日時、統計、免責事項)すべてに _draw_mixed() を使用してください。

設定リファレンス

ほとんどのオプションは、ファイル先頭の YAML 形式のフロントマターでも設定できます。明示的な CLI 引数は、フロントマターの値より優先されます。

引数フロントマターのキーデフォルト説明
--input—(必須)Markdown ファイルのパス
--output—output.pdf出力 PDF のパス
--titletitle最初の H1 から取得表紙に表示するドキュメントのタイトル
--subtitlesubtitle""サブタイトルのテキスト
--authorauthor""著者名
--datedate今日日付文字列
--versionversion""表紙に表示するバージョン文字列
--watermarkwatermark""透かしのテキスト(空の場合はなし)
--themethemewarm-academic配色テーマ名
--theme-file—""カスタムテーマ JSON ファイルのパス
--covercovertrue表紙を生成する
--toctoctrue目次を生成する
--page-sizepage-sizeA4ページサイズ(A4 または Letter)
--frontispiecefrontispiece""表紙の後に配置する全ページ画像
--bannerbanner""裏表紙のバナー画像
--header-titleheader-title""ページヘッダーに表示するレポートタイトル
--footer-leftfooter-leftauthorフッターに表示するブランド名/著者名
--stats-linestats-line""表紙に表示する統計情報
--stats-line2stats-line2""2 行目の統計情報
--edition-lineedition-line""表紙下部に表示する版数
--disclaimerdisclaimer""裏表紙の免責事項
--copyrightcopyright""裏表紙の著作権表示
--code-max-linescode-max-lines30コードブロックあたりの最大行数

テーマ

利用可能なテーマ: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

コメント