Markdown转PDF:我常用的几种方法

12次阅读

写技术文档的时候,经常需要把 Markdown 转成 PDF 分享。Markdown 写起来顺手,但直接导出 PDF 总是差点意思。

今天记录一下我常用的几种方法,各有优劣。

Pandoc 是万能文档转换器,配合无头浏览器可以输出高质量 PDF。

步骤:

pandoc article.md -o output.html

chromium --headless --print-to-pdf=output.pdf \
  --print-to-pdf-no-header \
  --print-to-pdf-landscape=false \
  output.html

优点:

  • 渲染效果和浏览器一致,CSS 支持完整
  • 代码高亮、表格、图片都能正确处理
  • 支持自定义 CSS 样式

缺点:

  • 需要安装 Chromium/Edge
  • 跨平台可能需要调整

如果你需要输出学术风格的 PDF,LaTeX 是最好的选择。

步骤:

pandoc article.md -o output.pdf \
  --pdf-engine=xelatex \
  -V mainfont="Songti SC" \
  -V geometry:margin=1in

需要的包:

  • texliveMacTeX
  • 中文字体支持(xeCJKctex

优点:

  • 排版质量最高
  • 支持复杂公式、交叉引用
  • 学术 / 出版级输出

缺点:

  • 安装包很大(几个 GB)
  • 样式定制需要 LaTeX 知识
  • Windows 上配置复杂

如果你用 Node.js 技术栈,这个工具很顺手。

安装:

npm install -g markdown-pdf

使用:

markdown-pdf article.md -o output.pdf

支持的功能:

  • 代码语法高亮
  • 自定义 CSS
  • 页眉页脚
  • 页面大小、边距
// 自定义配置
const markdownPdf = require('markdown-pdf')
const fs = require('fs')

markdownPdf({
  cssPath: './style.css',
  pageSize: 'A4',
  margins: {top: '1cm', bottom: '1cm'}
}).from('./article.md').to('./output.pdf', () => {console.log('PDF generated')
})

优点:

  • 零配置,上手简单
  • Node.js 生态集成方便
  • 可以编程化处理

缺点:

  • CSS 支持有限
  • 复杂布局可能出问题

用 Python 的 reportlab 库可以完全控制 PDF 生成。

from markdraft import Markdraft

md = Markdraft()
pdf = md.convert('article.md')
pdf.save('output.pdf')

或者用更底层的:

import markdown
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Paragraph, Preformatted
from reportlab.lib.styles import getSampleStyleSheet

with open('article.md', 'r') as f:
    content = f.read()

html = markdown.markdown(content)

doc = SimpleDocTemplate('output.pdf', pagesize=A4)
styles = getSampleStyleSheet()
story = [Paragraph(html, styles['Normal'])]
doc.build(story)

优点:

  • 完全可控
  • 可以批量处理
  • 适合自动化 pipeline

缺点:

  • 需要写代码
  • 样式定制工作量大
方法 质量 难度 依赖 适用场景
Pandoc + 浏览器 ⭐⭐⭐⭐ Chrome/Edge 日常文档、技术博客
Pandoc + LaTeX ⭐⭐⭐⭐⭐ TeX Live 学术论文、正式出版
markdown-pdf ⭐⭐⭐ Node.js 快速转换、简单文档
Python 脚本 ⭐⭐⭐ Python 批量处理、自动化
  • 日常使用 :Pandoc + 浏览器,零配置,效果好
  • 正式文档 :Pandoc + LaTeX,一次配置,长期受益
  • 自动化场景 :Python 脚本,接入 CI/CD pipeline
  • 快速预览 :markdown-pdf,随时随地转换

END

如果你有其他好用的方法,欢迎分享。

正文完