真正能用的 VSCode Markdown 导出 PDF 方案只有 Markdown Preview Enhanced(MPE)或 Pandoc + XeLaTeX:MPE 依赖预览渲染成功并满足四项条件,Pandoc 则适用于出版级定制需求。

别指望 VSCode 原生支持导出 PDF —— 所有“一键导出”都依赖扩展,且默认配置几乎必然失败。真正能用的只有两个路径:Markdown Preview Enhanced(推荐)或 Pandoc,其他方案要么已停更,要么中文乱码、公式不渲染、Mermaid 空白。
为什么 Markdown PDF 插件(yzane)现在基本不能用
它底层还在用 phantomjs 或过时的 wkhtmltopdf,这两者都不执行 JavaScript:
- Mermaid 图表 → 导出后只剩文字描述
graph TD; A-->B - MathJax 公式(如
$$ \int_0^1 x^2 dx $$)→ 直接显示原始 LaTeX 字符串 - highlight.js 代码高亮 → 无样式,纯黑白文本
- 中文显示为方框 → 因为没 fallback 字体,且不支持 CSS
@font-face加载本地字体 - 报错
Failed to launch chrome或phantomjs binary does not exist→ 不是配置问题,是工具链已淘汰
Markdown Preview Enhanced(MPE)导出前必须满足的 4 个条件
MPE 的导出本质是“截取当前预览页的 DOM 快照”,预览没正确加载,导出必废:
- 必须先用
Ctrl+K V(Windows/Linux)或Cmd+K V(macOS)打开 MPE 自己的预览窗,不能用 VS Code 原生Ctrl+Shift+V - 预览窗口里要能看到 Mermaid 图、
$$公式已转成 SVG、代码块带颜色 —— 否则导出就是空白或残缺 - 首次导出会自动下载 Chromium(约 150MB),需联网;若卡住,可手动装 Puppeteer:
npm install -g puppeteer,再在 VS Code 设置中填markdown-preview-enhanced.puppeteerPath指向它 - 文档顶部加 YAML front matter 显式声明 PDF 行为,例如:
---\npdf_options:\n format: 'A4'\n margin: {top: '20mm', right: '15mm', bottom: '20mm', left: '15mm'}\nstylesheet: ./style.css\n---其中style.css必须放在同目录,且含中文字体 fallback(如font-family: "Microsoft YaHei", "PingFang SC", sans-serif;)
Pandoc + XeLaTeX 是唯一可控的出版级方案
如果你需要目录页、页眉页脚、自动编号、跨页表格,或者导出结果必须和 Word/LaTeX 团队交付物一致,就绕不开 Pandoc:
- macOS 安装:
brew install pandoc && brew install --cask mactex(后者含 XeLaTeX 和中文字体) - Windows 安装:
scoop install pandoc && scoop install texlive,再手动安装思源宋体等中文字体到系统字体库 - 基础命令:
pandoc input.md -o output.pdf --pdf-engine=xelatex -V mainfont="Noto Serif CJK SC" - VS Code 中可用
tasks.json封装该命令,但注意:pandoc路径必须配对(设置项markdown-preview-enhanced.pandocPath),且xelatex必须在PATH中可执行 - 不推荐用 MPE 内置的 “Export to PDF via Pandoc” 模式 —— 它只传固定参数,无法控制字体、页眉、目录深度等关键项
最常被忽略的点:PDF 导出效果完全取决于预览是否真实渲染成功。不是“点了导出就完事”,而是“预览里看到什么,PDF 里才有什幺”。所有样式、字体、图表、公式的调试,必须在 MPE 预览窗口里完成,而不是靠改 markdown-pdf.styles 或瞎试 CSS。



















