From content-creation
Convert Markdown to professionally typeset PDFs using reportlab (primary) or pandoc+XeLaTeX (fallback). Handles CJK/Latin text, tables, code blocks, TOC, watermarks, themes for reports.
npx claudepluginhub lovstudio/skills --plugin content-creationThis skill uses the workspace's default tool permissions.
This skill converts any Markdown file into a publication-quality PDF using Python's
Generates professional PDF whitepapers from Markdown files using Typst templates, Pandoc, and custom fonts. Automatically installs dependencies via Bash, formats with typography hierarchy, and cleans up sources.
Converts Markdown docs to professional Apple-style PDF whitepapers with auto cover, TOC, headers/footers, WebP image processing, and full syntax support via pdfkit + wkhtmltopdf. For technical docs, reports.
Converts Markdown to styled PDFs with Mermaid diagrams, KaTeX math, tables, and syntax-highlighted code blocks. Useful for exporting technical docs.
Share bugs, ideas, or general feedback.
This skill converts any Markdown file into a publication-quality PDF using Python's reportlab library. It was developed through extensive iteration on real Chinese technical reports and solves several hard problems that naive MD→PDF converters get wrong.
.md → .pdfpython md2pdf/scripts/md2pdf.py \
--input report.md \
--output report.pdf \
--title "My Report" \
--author "Author Name" \
--theme warm-academic
All parameters except --input are optional — sensible defaults are applied.
IMPORTANT: You MUST use the AskUserQuestion tool to ask these questions BEFORE
running the conversion. Do NOT list options as plain text — use the tool so the user
gets a proper interactive prompt. Ask all options in a SINGLE AskUserQuestion call.
Use AskUserQuestion with the following template. The tone should be friendly and
concise — like a design assistant, not a config form:
开始转 PDF!先帮你确认几个选项 👇
━━━ 📐 设计风格 ━━━
a) 暖学术 — 陶土色调,温润典雅,适合人文/社科报告
b) 经典论文 — 棕色调,灵感源自 LaTeX classicthesis,适合学术论文
c) Tufte — 极简留白,深红点缀,适合数据叙事/技术写作
d) 期刊蓝 — 藏蓝严谨,灵感源自 IEEE,适合正式发表风格
e) 精装书 — 咖啡色调,书卷气,适合长篇专著/技术书
f) 中国红 — 朱红配暖纸,适合中文正式报告/白皮书
g) 水墨 — 纯灰黑,素雅克制,适合文学/设计类内容
h) GitHub — 蓝白极简,程序员熟悉的风格
i) Nord 冰霜 — 蓝灰北欧风,清爽现代
j) 海洋 — 青绿色调,清新自然
k) LaTeX 清爽 — pandoc+XeLaTeX 原生排版,无封面无装饰,干净学术风(需装 pandoc+texlive)
l) 咨询深蓝 — 深海军蓝色块 + 白底 + 大写左对齐标题,麦肯锡 / BCG / Deloitte 研究报告风格
━━━ 🖼 扉页图片(封面之后的全页插图) ━━━
1) 跳过
2) 我提供本地图片路径
3) AI 根据内容自动生成一张
━━━ 💧 水印 ━━━
1) 不加
2) 自定义文字(如 "DRAFT"、"内部资料")
可选调整:字号(默认52)、透明度(0-1)、角度(默认35°)、间距
━━━ 📇 封底物料(名片/二维码/品牌) ━━━
1) 跳过
2) 我提供图片
3) 纯文字信息
示例回复:"a, 扉页跳过, 水印:仅供学习参考, 封底图片:/path/qr.png"
直接说人话就行,不用记编号 😄
| Choice | CLI arg |
|---|---|
| Design style a-k | --theme with value from table below (k uses pandoc engine) |
| Frontispiece local | --frontispiece <path> |
| Frontispiece AI | Generate image first, then --frontispiece /tmp/frontispiece.png |
| Watermark text | --watermark "文字" |
| Watermark style | --wm-size 30 --wm-opacity 0.1 --wm-angle 45 (all optional) |
| Image as cover | --image-cover true (requires --frontispiece) |
| Back cover image | --banner <path> |
| Back cover text | --disclaimer "声明" and/or --copyright "© 信息" |
| Choice | --theme value | Inspiration |
|---|---|---|
| a) 暖学术 | warm-academic | Lovstudio design system |
| b) 经典论文 | classic-thesis | LaTeX classicthesis |
| c) Tufte | tufte | Edward Tufte's books |
| d) 期刊蓝 | ieee-journal | IEEE journal format |
| e) 精装书 | elegant-book | LaTeX ElegantBook |
| f) 中国红 | chinese-red | Chinese formal documents |
| g) 水墨 | ink-wash | 水墨画 / ink wash painting |
| h) GitHub | github-light | GitHub Markdown style |
| i) Nord | nord-frost | Nord color scheme |
| j) 海洋 | ocean-breeze | — |
| k) LaTeX 清爽 | latex-clean | pandoc+XeLaTeX 原生排版,无封面 |
| l) 咨询深蓝 | consulting-navy | McKinsey / BCG / Deloitte deep-research report |
If user chose AI generation: read the document title + first paragraphs, use an
image generation tool to create a themed illustration matching the chosen design
style, show for approval, then pass via --frontispiece /path/to/image.png
Markdown → Preprocess (split merged headings) → Parse (code-fence-aware) → Story (reportlab flowables) → PDF build
Key components:
_font_wrap() wraps CJK character runs in <font> tags for automatic font switching_draw_mixed() handles CJK/Latin mixed text on canvas (cover, headers, footers)esc_code() preserves indentation and line breaks in reportlab ParagraphsChapterMark flowable creates PDF sidebar bookmarks + named anchors_preprocess_md() splits merged headings like # Part## Chapter into separate linesreportlab's Paragraph only uses the font in ParagraphStyle. If fontName="Mono" but
text contains Chinese, they render as □. Fix: Always apply _font_wrap() to ALL text
that might contain CJK, including code blocks.
reportlab treats \n as whitespace. Fix: esc_code() converts \n → <br/> and
leading spaces → , applied BEFORE _font_wrap().
Default reportlab breaks lines only at spaces, causing ugly splits like "Claude\nCode".
Fix: Set wordWrap='CJK' on body/bullet styles to allow breaks at CJK character boundaries.
drawString() / drawCentredString() with a Latin font can't render 年/月/日 etc.
Fix: Use _draw_mixed() for ALL user-content canvas text (dates, stats, disclaimers).
 in a markdown file used to get skipped without warning
because the image path was resolved against the current working directory, not the
markdown's directory. Fix: main() now passes input_dir (the .md's directory)
into the builder, and the image handler resolves relative paths against it. Missing
images now also emit a WARN: image not found: ... to stderr instead of silently
dropping.
--wrap=auto)When feeding pandoc's output into md2pdf, pandoc's default --wrap=auto (72 cols)
wraps long  across multiple lines, which defeated
the single-line image regex. Fix: _preprocess_md() now collapses multi-line
image references into one line (outside code fences) before parsing.
Pipeline tip: If you're piping HTML → markdown via pandoc, use
pandoc --wrap=none input.html -o output.md to avoid wrap-related parsing issues
for images and tables alike.
This skill takes Markdown files only as input. If you have HTML, DOCX, or
other formats, convert them to markdown first (e.g. pandoc --wrap=none).
Embedded HTML blocks in markdown are passed through as text — pre-process any
visual content (charts, complex tables) into plain markdown tables or image
references before invoking md2pdf.
| Argument | Default | Description |
|---|---|---|
--input | (required) | Path to markdown file |
--output | output.pdf | Output PDF path |
--title | From first H1 | Document title for cover page |
--subtitle | "" | Subtitle text |
--author | "" | Author name |
--date | Today | Date string |
--version | "" | Version string for cover |
--watermark | "" | Watermark text (empty = none) |
--theme | warm-academic | Color theme name |
--theme-file | "" | Custom theme JSON file path |
--cover | true | Generate cover page |
--toc | true | Generate table of contents |
--page-size | A4 | Page size (A4 or Letter) |
--frontispiece | "" | Full-page image after cover |
--banner | bundled assets/backcover-banner.jpg | Back cover banner image (pass none to disable) |
--header-title | "" | Report title in page header |
--footer-left | author | Brand/author in footer |
--stats-line | "" | Stats on cover |
--stats-line2 | "" | Second stats line |
--edition-line | "" | Edition line at cover bottom |
--disclaimer | "" | Back cover disclaimer |
--copyright | "" | Back cover copyright |
--code-max-lines | 30 | Max lines per code block |
--image-cover | false | Use frontispiece as full-bleed cover (page 1), text cover becomes page 2 |
--heading-top-spacer | 5 | Top spacer before H1/H2 chapter titles in mm |
--wm-size | auto (half page width) | Watermark font size; auto-scales so text width ≈ 50% of page width |
--wm-opacity | 0.1 | Watermark opacity (0.0–1.0) |
--wm-angle | 35 | Watermark rotation angle in degrees |
--wm-spacing-x | 9999 | Watermark horizontal spacing in pt (≥2000 = single centered per page) |
--wm-spacing-y | 9999 | Watermark vertical spacing in pt (≥2000 = single centered per page) |
Available: warm-academic, nord-frost, github-light, solarized-light,
paper-classic, ocean-breeze, consulting-navy.
Each theme defines: page background, ink color, accent color, faded text, border, code background, watermark tint.
When reportlab fails (e.g. wide/complex tables cause infinite loops in table width calculation), fall back to pandoc with XeLaTeX. This produces high-quality CJK PDFs with proper table handling.
latex-clean theme (k) — pandoc is the primary engine, not a fallbackpandoc input.md -o output.pdf \
--pdf-engine=xelatex \
-V CJKmainfont="Songti SC" -V mainfont="Palatino" -V monofont="Menlo" \
-V geometry:margin=2.5cm -V fontsize=11pt \
--toc -V toc-title="目录" -V documentclass=article
pandoc input.md -o output.pdf \
--pdf-engine=xelatex \
-V CJKmainfont="Songti SC" -V mainfont="Palatino" -V monofont="Menlo" \
-V geometry:margin=2.5cm -V fontsize=11pt \
-V colorlinks=true -V linkcolor=red -V toccolor=red -V urlcolor=red \
--toc -V toc-title="目录" -V documentclass=article \
-V header-includes='
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyhead[L]{\small 页眉左侧文字}
\fancyhead[R]{\small 页眉右侧文字}
\fancyfoot[C]{\thepage}
\usepackage{draftwatermark}
\SetWatermarkText{水印文字}
\SetWatermarkScale{0.5}
\SetWatermarkColor[gray]{0.9}
'
Each preset defines a complete set of pandoc -V flags. Use the full command from
"Adding watermark + headers/footers" above, replacing the color/link flags per preset.
| Theme | linkcolor | toccolor | urlcolor | Watermark color | Notes |
|---|---|---|---|---|---|
| chinese-red | red | red | red | [gray]{0.9} | 朱红正式,适合政企报告、白皮书 |
| warm-academic | brown | brown | brown | [gray]{0.9} | 陶土色调,温润学术风 |
| classic-thesis | brown | brown | brown | [gray]{0.85} | LaTeX classicthesis 灵感 |
| ieee-journal | blue | blue | blue | [gray]{0.9} | 藏蓝严谨,期刊风格 |
| github-light | blue | blue | blue | [gray]{0.92} | 极简蓝白,程序员友好 |
| ink-wash | black | black | black | [gray]{0.92} | 水墨素雅,文学/设计类 |
| nord-frost | teal | teal | teal | [gray]{0.9} | 北欧冰霜蓝灰 |
| consulting-navy | blue | blue | blue | [gray]{0.88} | 咨询深蓝,研究报告风 |
pandoc input.md -o output.pdf \
--pdf-engine=xelatex \
-V CJKmainfont="Songti SC" -V mainfont="Palatino" -V monofont="Menlo" \
-V geometry:margin=2.5cm -V fontsize=11pt \
-V colorlinks=true -V linkcolor=red -V toccolor=red -V urlcolor=red \
--toc -V toc-title="目录" -V documentclass=article \
-V header-includes='
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyhead[L]{\small 报告标题 | 品牌名}
\fancyhead[R]{\small 商业机密}
\fancyfoot[C]{\thepage}
\usepackage{draftwatermark}
\SetWatermarkText{商业机密}
\SetWatermarkScale{0.5}
\SetWatermarkColor[gray]{0.9}
'
选择 latex-clean 时,跳过 reportlab,直接使用 pandoc 生成。特点:无封面、无扉页、
无装饰色块,纯 LaTeX 排版 + 点线 TOC 引导符,适合内容为王的学术/技术文档。
pandoc input.md -o output.pdf \
--pdf-engine=xelatex \
-V CJKmainfont="Songti SC" -V mainfont="Palatino" -V monofont="Menlo" \
-V geometry:margin=2.5cm -V fontsize=11pt \
-V colorlinks=true -V linkcolor=brown -V toccolor=brown -V urlcolor=brown \
--toc -V toc-title="目录" -V documentclass=article
如需添加页眉页脚或水印,参考上方 "Adding watermark + headers/footers" 追加 -V header-includes。
--include-before-body with a LaTeX snippet if needed)→ ★ ☆ symbols may warn in Palatino — they render via CJK font fallback, safe to ignoreRequires pandoc and a TeX distribution with XeLaTeX:
brew install pandoc
brew install --cask mactex-no-gui # or basictex
pip install reportlab --break-system-packages