agentsclimarketplace

Md to pdf

Skill sanoakr/ai-skills/md-to-pdf

pandoc・xelatex・wkhtmltopdf などの CLI ツールが使える環境限定で、 Markdownファイルを高品質なPDF・HTML・LaTeXに変換するスキル。 日本語を含む文書の変換に対応。 Python ライブラリ(pypdf / reportlab など)による PDF 操作が目的の場合は pdf スキルを使うこと。 以下のような場合に使用すること: - 「Markdownを PDF/HTML/LaTeX に変換して」 - 「日本語のMarkdownをきれいなPDFにしたい」 - 「レイアウトを整えてPDFを作りたい」 - 「pandoc で変換して」「レポートをPDF出力したい」 - .md ファイルを受け取り PDF/HTML/tex ファイルを出力するあらゆる作業From its SKILL.md

Install
npx -y skills add sanoakr/ai-skills --skill md-to-pdf

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

8.3 KB, ~2.6k tokens by cl100k_base, as published. Nobody here has run it

Markdown → PDF / HTML / LaTeX 変換スキル

環境の前提条件

以下のツールがすでにインストール済みであることを確認済み:

  • pandoc 3.1.3(Markdown の中核変換エンジン)
  • xelatex(日本語対応 LaTeX エンジン)
  • wkhtmltopdf(HTML → PDF 変換)
  • xeCJK パッケージ(LaTeX 日本語組版)
  • Noto CJK JP フォント(Noto Serif CJK JP / Noto Sans CJK JP

インストール済みパッケージ(セッション内で apt install 実行済み):

texlive-lang-cjk   # xeCJK.sty を含む
lmodern            # lmodern.sty(pandoc テンプレート依存)

変換ルート

Markdown
  ├─► HTML ──► wkhtmltopdf ──► PDF  (スタイル重視・CSS制御)
  ├─► LaTeX(.tex)              (数式・学術文書向け)
  └─► xelatex ──────────────► PDF  (日本語組版・数式両対応)

ルート1: Markdown → HTML

基本コマンド

pandoc input.md -o output.html --standalone

日本語対応・スタイル付き HTML

pandoc input.md -o output.html \
  --standalone \
  --metadata title="文書タイトル" \
  --css=style.css

推奨 CSS(日本語対応)

/* style.css */
body {
  font-family: "Noto Serif CJK JP", "Noto Sans CJK JP", serif;
  margin: 2cm;
  line-height: 1.8;
  font-size: 12pt;
  color: #1a1a1a;
}
h1 { font-size: 22pt; border-bottom: 2px solid #333; padding-bottom: 6px; }
h2 { font-size: 16pt; color: #2c3e50; }
h3 { font-size: 13pt; color: #34495e; }
table { border-collapse: collapse; width: 100%; margin: 1em 0; }
td, th { border: 1px solid #ccc; padding: 6px 10px; }
th { background: #f0f0f0; }
code { background: #f5f5f5; padding: 2px 5px; border-radius: 3px; font-size: 90%; }
pre { background: #f5f5f5; padding: 12px; border-radius: 5px; overflow-x: auto; }
blockquote { border-left: 4px solid #ccc; margin-left: 0; padding-left: 1em; color: #555; }

ルート2: HTML → PDF(wkhtmltopdf)

# HTML → PDF
wkhtmltopdf --encoding utf-8 \
  --page-size A4 \
  --margin-top 20mm --margin-bottom 20mm \
  --margin-left 20mm --margin-right 20mm \
  input.html output.pdf

Markdown → HTML → PDF 一括

# Step 1: Markdown → HTML
pandoc input.md -o /tmp/work.html \
  --standalone \
  --css=style.css

# Step 2: HTML → PDF
wkhtmltopdf --encoding utf-8 \
  --page-size A4 \
  /tmp/work.html output.pdf

ルート3: Markdown → LaTeX(.tex)出力

# スタンドアロン .tex ファイルを生成
pandoc input.md -o output.tex \
  --standalone \
  -V CJKmainfont="Noto Serif CJK JP"

テンプレートのカスタマイズ

# デフォルトテンプレートを取得してカスタマイズ
pandoc -D latex > my_template.tex
# my_template.tex を編集後:
pandoc input.md -o output.tex --template=my_template.tex

ルート4: Markdown → PDF(xelatex 経由)← 推奨:日本語+数式

pandoc input.md -o output.pdf \
  --pdf-engine=xelatex \
  -V documentclass=article \
  -V geometry=margin=2.5cm \
  -V fontsize=11pt \
  -V CJKmainfont="Noto Serif CJK JP" \
  -V lang=ja

よく使うオプション

オプション説明
--pdf-engine=xelatexxelatex を使用(日本語必須)
-V documentclass=article文書クラス(article / report / book)
-V geometry=margin=2.5cm余白設定
-V CJKmainfont="Noto Serif CJK JP"日本語メインフォント
-V CJKsansfont="Noto Sans CJK JP"日本語サンズフォント
-V fontsize=11pt基本フォントサイズ
-V lang=ja言語設定
--toc目次を生成
--number-sectionsセクション番号を付与
-V papersize=a4用紙サイズ(a4 / letter)

Pandoc Markdown YAML ヘッダー(.md ファイル先頭)

---
title: "文書タイトル"
author: "著者名"
date: "2026年5月"
lang: ja
geometry: margin=2.5cm
fontsize: 11pt
CJKmainfont: "Noto Serif CJK JP"
---

Python スクリプト(一括変換)

#!/usr/bin/env python3
"""md_to_pdf.py: Markdown → PDF/HTML/LaTeX 変換スクリプト"""

import subprocess
import sys
from pathlib import Path


def md_to_pdf_xelatex(input_md: str, output_pdf: str, **kwargs):
    """Markdown → PDF(xelatex 経由・日本語対応)"""
    cmd = [
        "pandoc", input_md, "-o", output_pdf,
        "--pdf-engine=xelatex",
        "-V", "documentclass=article",
        "-V", f"geometry=margin={kwargs.get('margin', '2.5cm')}",
        "-V", f"fontsize={kwargs.get('fontsize', '11pt')}",
        "-V", f"CJKmainfont={kwargs.get('cjk_font', 'Noto Serif CJK JP')}",
        "-V", "lang=ja",
    ]
    if kwargs.get("toc"):
        cmd.append("--toc")
    if kwargs.get("number_sections"):
        cmd.append("--number-sections")

    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode != 0:
        print(f"Error: {result.stderr}", file=sys.stderr)
        return False
    return True


def md_to_html(input_md: str, output_html: str, css: str = None, title: str = ""):
    """Markdown → HTML(スタンドアロン)"""
    cmd = ["pandoc", input_md, "-o", output_html, "--standalone"]
    if title:
        cmd += ["--metadata", f"title={title}"]
    if css:
        cmd += ["--css", css]
    result = subprocess.run(cmd, capture_output=True, text=True)
    return result.returncode == 0


def md_to_pdf_via_html(input_md: str, output_pdf: str, css: str = None):
    """Markdown → HTML → PDF(wkhtmltopdf 経由)"""
    tmp_html = "/tmp/_md_to_pdf_tmp.html"
    if not md_to_html(input_md, tmp_html, css=css):
        return False
    cmd = [
        "wkhtmltopdf", "--encoding", "utf-8",
        "--page-size", "A4",
        "--margin-top", "20mm", "--margin-bottom", "20mm",
        "--margin-left", "20mm", "--margin-right", "20mm",
        tmp_html, output_pdf
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    return result.returncode == 0


def md_to_latex(input_md: str, output_tex: str):
    """Markdown → LaTeX(.tex ファイル)"""
    cmd = [
        "pandoc", input_md, "-o", output_tex,
        "--standalone",
        "-V", "CJKmainfont=Noto Serif CJK JP",
    ]
    result = subprocess.run(cmd, capture_output=True, text=True)
    return result.returncode == 0

トラブルシューティング

日本語が文字化けする・表示されない

xelatex ルートで CJKmainfont を明示する:

pandoc input.md -o output.pdf \
  --pdf-engine=xelatex \
  -V CJKmainfont="Noto Serif CJK JP"

wkhtmltopdf ルートでフォントが表示されない場合は CSS で指定:

body { font-family: "Noto Serif CJK JP", sans-serif; }

lmodern.sty が見つからない

apt-get install -y lmodern

xeCJK.sty が見つからない

apt-get install -y texlive-lang-cjk

pandoc の LaTeX 変換で ! Emergency stop. エラー

原因は不足パッケージが多い。以下をインストール:

apt-get install -y texlive-lang-cjk lmodern texlive-xetex

選択ガイド

目的推奨ルート
日本語文書 + 数式Markdown → xelatex → PDF
デザイン重視・CSS制御Markdown → HTML → wkhtmltopdf → PDF
学術論文・カスタム組版Markdown → LaTeX → xelatex → PDF
Web公開用 HTMLMarkdown → pandoc → HTML
簡易確認用 PDFMarkdown → wkhtmltopdf → PDF

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.