Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
lovstudio avatar

Lovstudio:Any2pdf

  • 256 installs
  • 198 repo stars
  • Updated May 30, 2026
  • lovstudio/any2pdf

lovstudio:any2pdf is an agent skill that converts Markdown files into professionally typeset PDFs with cover pages, TOC, bookmarks, and CJK/Latin mixed text for developers who need client-ready or compliance-grade docume

About

lovstudio:any2pdf is an agent skill (version 1.3.4) that turns Markdown into publication-quality PDFs using a Python reportlab engine and an optional pandoc + XeLaTeX fallback. Install with `npx lovstudio skills add any2pdf -g -y`; runtime needs Python 3.8+ and `pip install reportlab`. The skill guides an interactive workflow—theme, frontispiece, watermark, back-cover choices—then runs `md2pdf.py` with 30+ CLI flags or YAML frontmatter. Output includes cover pages, clickable tables of contents, PDF bookmark sidebars, running headers/footers, watermarks, and 14 color themes from warm-academic to consulting-navy. Reach for lovstudio:any2pdf when Markdown technical reports, README bundles, or bilingual docs must ship as polished PDFs with code blocks, tables, Obsidian callouts, images, and formulas handled correctly.

  • Multi-format to PDF conversion
  • Template and layout control
  • Batch export workflows
  • CLI-friendly automation
  • Shareable document packaging

Lovstudio:Any2pdf by the numbers

  • 256 all-time installs (skills.sh)
  • Ranked #203 of 688 Office & Documents skills by installs in the Skillselion catalog
  • Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/lovstudio/any2pdf --skill lovstudioany2pdf

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs256
repo stars198
Last updatedMay 30, 2026
Repositorylovstudio/any2pdf

How do you convert Markdown to a professional PDF?

Convert assorted source formats—markdown, HTML, office files, or URLs—into polished PDFs for sharing, archiving, compliance packets, and client deliverables.

Who is it for?

Developers shipping Markdown technical reports, compliance packets, or bilingual documentation who need LaTeX-quality PDF output with one Python dependency.

Skip if: Developers who need direct DOCX, PPT, or URL-to-PDF conversion without first converting source files to Markdown via pandoc.

When should I use this skill?

User mentions markdown to PDF, md2pdf, any2pdf, md转pdf, 报告生成, 导出pdf, or requests a typeset PDF with cover, TOC, or watermark from a .md file.

What you get

A branded PDF file with cover page, clickable table of contents, PDF bookmarks, optional watermark, headers/footers, and correctly rendered CJK, code blocks, tables, and images.

  • Branded PDF with cover and TOC
  • Watermarked compliance or client deliverable PDF
  • CJK-capable technical report PDF

By the numbers

  • Version 1.3.4 with 14 color themes and 30+ CLI configuration flags
  • Primary engine uses one Python dependency: reportlab on Python 3.8+
  • Interactive pre-conversion workflow offers 12 design-style choices mapped to theme names

Files

SKILL.mdMarkdownGitHub ↗

any2pdf — Markdown to Professional PDF

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.

When to Use

  • User wants to convert .md.pdf
  • User has a markdown report/document and wants professional typesetting
  • Document contains CJK characters (Chinese/Japanese/Korean) mixed with Latin text
  • Document has fenced code blocks, markdown tables, or nested lists
  • Document has local/remote images, Obsidian callouts, emoji, or math formulas
  • User wants a cover page, table of contents, or watermark in their PDF

Quick Start

python 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.

Pre-Conversion Options (MANDATORY)

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) 海洋      — 青绿色调,清新自然

━━━ 🖼 扉页图片(封面之后的全页插图) ━━━
 1) 跳过
 2) 我提供本地图片路径
 3) AI 根据内容自动生成一张

━━━ 💧 水印 ━━━
 1) 不加
 2) 自定义文字(如 "DRAFT"、"内部资料")

━━━ 📇 封底物料(名片/二维码/品牌) ━━━
 1) 跳过
 2) 我提供图片
 3) 纯文字信息

示例回复:"a, 扉页跳过, 水印:仅供学习参考, 封底图片:/path/qr.png"
直接说人话就行,不用记编号 😄

Mapping User Choices to CLI Args

ChoiceCLI arg
Design style a-j--theme with value from table below
Frontispiece local--frontispiece <path>
Frontispiece AIGenerate image first, then --frontispiece /tmp/frontispiece.png
Watermark text--watermark "文字"
Back cover image--banner <path>
Back cover text--disclaimer "声明" and/or --copyright "© 信息"

Theme Name Mapping

Choice--theme valueInspiration
a) 暖学术warm-academicLovstudio design system
b) 经典论文classic-thesisLaTeX classicthesis
c) TuftetufteEdward Tufte's books
d) 期刊蓝ieee-journalIEEE journal format
e) 精装书elegant-bookLaTeX ElegantBook
f) 中国红chinese-redChinese formal documents
g) 水墨ink-wash水墨画 / ink wash painting
h) GitHubgithub-lightGitHub Markdown style
i) Nordnord-frostNord color scheme
j) 海洋ocean-breeze

Handling AI-Generated Frontispiece

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

Architecture

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

Key components: 1. Font system: Palatino (Latin body), Songti SC (CJK body), Menlo (code) on macOS; auto-fallback on Linux 2. CJK wrapper: _font_wrap() wraps CJK character runs in <font> tags for automatic font switching 3. Mixed text renderer: _draw_mixed() handles CJK/Latin mixed text on canvas (cover, headers, footers) 4. Code block handler: esc_code() preserves indentation and line breaks in reportlab Paragraphs 5. Smart table widths: Proportional column widths based on content length, with 18mm minimum 6. Bookmark system: ChapterMark flowable creates PDF sidebar bookmarks + named anchors 7. Heading preprocessor: _preprocess_md() splits merged headings like # Part## Chapter into separate lines 8. Image handler: local, relative, file://, and remote markdown images are scaled into the body frame with fallback text on errors 9. Callout renderer: Obsidian-style > [!NOTE] blocks render as themed boxed callouts 10. Formula renderer: display formulas use optional matplotlib mathtext images, with styled text fallback 11. Emoji fallback: emoji are rendered as cached Twemoji PNGs when available, or with a local emoji font fallback

Hard-Won Lessons

CJK Characters Rendering as □

reportlab'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.

Code Blocks Losing Line Breaks

reportlab treats \n as whitespace. Fix: esc_code() converts \n<br/> and all spaces → &nbsp;, preserving indentation and mid-line alignment before _font_wrap().

CJK/Latin Word Wrapping

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.

Canvas Text with CJK (Cover/Footer)

drawString() / drawCentredString() with a Latin font can't render 年/月/日 etc. Fix: Use _draw_mixed() for ALL user-content canvas text (dates, stats, disclaimers).

Configuration Reference

Most options can also be set in top-of-file YAML-style frontmatter. Explicit CLI arguments take precedence over frontmatter values.

ArgumentFrontmatter KeyDefaultDescription
--input(required)Path to markdown file
--outputoutput.pdfOutput PDF path
--titletitleFrom first H1Document title for cover page
--subtitlesubtitle""Subtitle text
--authorauthor""Author name
--datedateTodayDate string
--versionversion""Version string for cover
--watermarkwatermark""Watermark text (empty = none)
--themethemewarm-academicColor theme name
--theme-file""Custom theme JSON file path
--covercovertrueGenerate cover page
--toctoctrueGenerate table of contents
--page-sizepage-sizeA4Page size (A4 or Letter)
--frontispiecefrontispiece""Full-page image after cover
--bannerbanner""Back cover banner image
--header-titleheader-title""Report title in page header
--footer-leftfooter-leftauthorBrand/author in footer
--stats-linestats-line""Stats on cover
--stats-line2stats-line2""Second stats line
--edition-lineedition-line""Edition line at cover bottom
--disclaimerdisclaimer""Back cover disclaimer
--copyrightcopyright""Back cover copyright
--code-max-linescode-max-lines30Max lines per code block

Themes

Available: warm-academic, nord-frost, github-light, solarized-light, paper-classic, ocean-breeze.

Each theme defines: page background, ink color, accent color, faded text, border, code background, watermark tint.

Dependencies

pip install reportlab --break-system-packages
# Optional formula rendering:
pip install matplotlib --break-system-packages

Recommended Ubuntu/Debian fonts:

sudo apt install fonts-dejavu-core fonts-liberation fonts-freefont-ttf fonts-noto fonts-noto-cjk fonts-noto-color-emoji

Related skills

How it compares

Pick lovstudio:any2pdf over raw pandoc or browser print-to-PDF when Markdown reports need branded covers, clickable TOC bookmarks, CJK/Latin mixed rendering, and an agent-guided theme workflow without maintaining LaTeX t

FAQ

What does lovstudio:any2pdf require to run?

lovstudio:any2pdf requires Python 3.8+ and the reportlab library (`pip install reportlab`). Optional matplotlib enables rendered display formulas. The latex-clean theme and wide-table fallback need pandoc plus a TeX distribution with XeLaTeX installed.

What input formats does lovstudio:any2pdf accept?

lovstudio:any2pdf accepts Markdown files as primary input. HTML, DOCX, or other formats must be converted to Markdown first—for example with `pandoc --wrap=none`—before running md2pdf.py.

How many PDF themes does lovstudio:any2pdf support?

lovstudio:any2pdf ships 14 color themes including warm-academic, ieee-journal, chinese-red, consulting-navy, and latex-clean. Themes control page background, ink, accent colors, code blocks, and watermark tint across cover and body pages.

Office & Documentsworkflownotes

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.