Markdown Preview Enhanced(MPE)是VS Code中导出PDF最稳定插件,支持Mermaid、自定义CSS及真实渲染;需先预览再右键导出,推荐配置YAML主题与字体fallback;pandoc为更可控的替代方案。

用 Markdown Preview Enhanced 插件直接导出 PDF
VS Code 原生不支持 Markdown 导出 PDF,必须依赖插件。目前最稳定、兼容性最好、中文支持最到位的是 Markdown Preview Enhanced(简称 MPE),不是 Markdown PDF 那类老插件——后者早就不维护了,导出时容易乱码、丢样式、不支持 Mermaid 图表。
安装后右键预览窗口 → Export to PDF,或快捷键 Ctrl+K Ctrl+E(Windows/Linux)/Cmd+K Cmd+E(macOS)。它底层调用的是 Puppeteer,所以导出的是真实渲染效果,包括代码块高亮、表格边框、自定义 CSS 等。
- 必须先打开 Markdown 文件,再按
Ctrl+Shift+V预览,否则右键菜单里没有导出选项 - 导出前建议在文件顶部加 YAML front matter 指定主题,比如:
---\ntheme: github\n---
,否则默认用「white」主题,打印出来是白底黑字但无阴影/间距,显得发闷 - 如果用了自定义 CSS(如
style.css),要确保路径写对,且在 front matter 里通过css: ./style.css显式引入,MPE 不会自动加载同目录下的 CSS
导出失败常见报错和对应解法
最常卡在 Puppeteer not found 或 Failed to launch chrome ——这不是你没装 Chrome,而是 MPE 自带的 Puppeteer 版本太老,跟新版系统或 Chromium 冲突。
- 先运行
npm install -g puppeteer(需提前装 Node.js),再在 VS Code 设置里把markdown-preview-enhanced.puppeteerPath改成你全局安装的路径,例如:/usr/local/lib/node_modules/puppeteer/.local-chromium/... - Mac 上遇到
Developer cannot be verified弹窗:去「系统设置 → 隐私与安全性」拉到底,点「仍要打开」;Windows 上杀毒软件可能拦截 Chromium 进程,临时禁用试试 - 中文显示为方框:说明字体没 fallback。在自定义 CSS 里加一行:
@font-face { font-family: 'pdf-font'; src: local('PingFang SC'), local('Microsoft YaHei'), local('sans-serif'); },然后给body设font-family: 'pdf-font'
用命令行 + pandoc 是更可控的替代方案
如果你要批量处理、加页眉页脚、控制页边距,或者 MPE 导出结果总差那么一两点(比如目录层级错乱),直接上 pandoc 更靠谱。它不依赖浏览器,纯文本流处理,稳定、可脚本化。
- 先装 pandoc:
brew install pandoc(macOS)、scoop install pandoc(Windows Scoop)、或去 官网下载 - 基础导出命令:
pandoc input.md -o output.pdf --pdf-engine=xelatex,必须用xelatex(不是 pdflatex),否则中文直接挂 - 想保留 GitHub 风格样式?加
--css=github.css;要生成目录?加--toc --toc-depth=3;页边距调大?加--variable=geometry:"top=1in, bottom=1in, left=1in, right=1in" - 注意:pandoc 不解析 Mermaid 或 LaTeX 数学公式(除非额外装
mermaid-cli和texlive),MPE 能做的,它不一定能原样复现
导出后 PDF 字体发虚、代码块模糊?
这是 Chromium 渲染 PDF 时默认用了 bitmap 字体渲染,尤其在等宽字体(如 Fira Code、JetBrains Mono)上特别明显。不是你的 PDF 阅读器问题,是导出环节就埋下了。
- MPE 用户:在设置里把
markdown-preview-enhanced.scale改成2(默认是1.5),再导出,清晰度立竿见影 - pandoc 用户:改用
weasyprint引擎(pandoc input.md -o output.pdf --pdf-engine=weasyprint),它基于 WebKit,字体渲染更接近浏览器,但不支持 LaTeX 公式 - 终极提示:别用 macOS 预览.app 直接「打印 → 另存为 PDF」,它会二次压缩字体轮廓,模糊加倍;用 Adobe Acrobat 或 Chrome 打印 PDF 才算真正“无损”
PDF 导出看着简单,其实每一步都在字体、引擎、CSS 三者之间找平衡。最容易被忽略的是:MPE 的「导出」和「打印预览」走的是两套渲染逻辑,前者用 Puppeteer 截图,后者用浏览器原生打印 API——同一份文档,两个按钮点出来可能完全不同。











