mcpField
L
lovstudio-any2pdf

lovstudio-any2pdf

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

lovstudio-any2pdf について

Markdown 文書を整ったレイアウトの PDF に変換するスキルです。レポートや出版向け文書の作成に適し、CJK テキスト、コード、表、画像、複数のデザイン設定に対応します。

主な機能

  1. 01Markdown から PDF への変換
  2. 02CJK テキストとコードブロックの処理
  3. 03表、画像、コールアウトの描画
  4. 04数式と絵文字の描画
  5. 05表紙、目次、透かしの設定
  6. 06複数テーマから選択

活用シーン

  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

コメント