markdown-to-pdf
Markdown to PDF
Convert one or more Markdown files into styled PDFs using WeasyPrint and the Python markdown library. The default styling is intentionally neutral — apply your own brand stylesheet via --css.
How to use
Run the conversion script via uv run:
uv run --with markdown --with weasyprint python3 "${SKILL_DIR}/scripts/convert.py" <files...> [-o output_dir] [--css custom.css]
${SKILL_DIR} is the directory containing this SKILL.md. The script resolves assets/style.css relative to its own location, so it works regardless of install path.
Steps
-
Identify target
.mdfiles from the user's request. If none specified, look for.mdfiles in the current directory and ask which to convert. -
Run the conversion:
uv run --with markdown --with weasyprint python3 <skill-dir>/scripts/convert.py file1.md file2.md- Use
-o <dir>to place PDFs in a specific output directory. - Use
--css <path>to override the default neutral stylesheet (e.g., a brand stylesheet fromnetresearch-branding-skill/assets/markdown-pdf.css). - Glob patterns like
*.mdare supported.
- Use
-
Report which PDF files were created and their locations.
Default styling
The bundled assets/style.css provides:
- system fonts (no external font fetches)
- neutral grayscale headers
- printable code blocks with monospace font
- A4 page size with sensible margins
- page numbers in footer
For branded output, supply a --css value pointing at your organisation's stylesheet (logo, colours, fonts, headers).
Companion skills
netresearch-branding-skillships amarkdown-pdf.cssbrand asset. Internal Netresearch users: install both skills, then--css "$(echo $CLAUDE_PLUGIN_ROOT/.../netresearch-branding-skill/.../assets/markdown-pdf.css)".
Output format
Per file:
✓ converted README.md → README.pdf (12.3 KB)
✓ converted RFC-001.md → RFC-001.pdf (4.7 KB)
Errors
| Error | Action |
|---|---|
No .md files matched |
List directory contents and ask user |
| WeasyPrint missing | uv run should auto-resolve it; if not, suggest uv pip install weasyprint |
--css file not found |
Surface the missing path; do not fall back silently |