直接用Node脚本生成PDF需依赖puppeteer-core,手动指定浏览器路径,设置networkidle0等待动态内容加载,并显式声明中文字体fallback,避免插件封装带来的不可控问题。

直接用 Node 脚本生成 PDF,不依赖 VSCode 插件
VSCode 本身不提供 PDF 生成能力,所谓“在 VSCode 中通过 Node 环境生成 PDF”,本质是:你在 VSCode 里写 Node 脚本,用命令行执行它,输出 PDF。VSCode 只是编辑器,真正干活的是 Node 进程和你选的库。
推荐首选 puppeteer —— 它调用本地 Chromium/Edge 渲染 HTML 再转 PDF,兼容性好、中文支持稳、样式还原度高。不要用已废弃的 phantomjs 或卡死的 wkhtmltopdf(后者在 macOS 14+/Windows 11 上常因字体或 sandbox 权限失败)。
安装命令:npm install puppeteer-core(比完整版小 70%,你只需自己指定浏览器路径)
关键点:
-
puppeteer-core不自动下载 Chromium,避免首次运行卡在内网/杀软拦截 - 必须手动填浏览器路径,例如:
const browser = await puppeteer.launch({ executablePath: '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser' }); - 导出前务必设置
waitUntil: 'networkidle0',否则动态内容(如 Mermaid、MathJax)可能截空 - PDF 字体 fallback 必须显式声明,比如:
body { font-family: "Noto Sans CJK SC", "Microsoft YaHei", sans-serif; }
用 Markdown 源文件生成 PDF 的最小可行脚本
如果你已有 report.md,不想装一堆插件,只想跑一条命令就出 PDF,可以用 marked + puppeteer-core 组合。
示例脚本 md2pdf.js:
const fs = require('fs');
const marked = require('marked');
const puppeteer = require('puppeteer-core');
const html = `
<html>
<head><meta charset="utf-8">
<style>
body { font-family: "Noto Sans CJK SC", sans-serif; line-height: 1.6; margin: 2cm; }
code { background: #f4f4f4; padding: 2px 4px; }
</style>
</head>
<body>${marked(fs.readFileSync('report.md', 'utf8'))}</body>
</html>
`;
(async () => {
const browser = await puppeteer.launch({
executablePath: process.env.BROWSER_PATH || '/usr/bin/chromium',
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
const page = await browser.newPage();
await page.setContent(html, { waitUntil: 'networkidle0' });
await page.pdf({
path: 'report.pdf',
format: 'A4',
margin: { top: '20mm', right: '15mm', bottom: '20mm', left: '15mm' }
});
await browser.close();
})();
运行前确保:
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
-
BROWSER_PATH环境变量已设(Linux/macOS)或改代码中路径(Windows) -
report.md文件存在且编码为 UTF-8(BOM 会破坏 HTML 解析) - 系统已安装中文字体,如
Noto Sans CJK SC(macOS 自带)、fonts-wqy-zenhei(Ubuntu)或simhei.ttf(Windows)
VSCode 任务集成:一键运行脚本并打开 PDF
把上面脚本变成 VSCode 任务,就能 Ctrl+Shift+P → “Tasks: Run Task” → 选 “Generate PDF”,全程不切窗口。
在项目根目录建 .vscode/tasks.json:
{
"version": "2.0.0",
"tasks": [
{
"label": "Generate PDF",
"type": "shell",
"command": "node md2pdf.js",
"group": "build",
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true
},
"problemMatcher": [],
"dependsOn": []
}
]
}
再加个快捷方式:在 keybindings.json 里绑定快捷键,比如:
[{
"key": "ctrl+alt+p",
"command": "workbench.action.terminal.sendSequence",
"args": { "text": "node md2pdf.js\u000D" }
}]
注意:
- PDF 生成后不会自动打开,需额外加一行
require('child_process').exec('open report.pdf');(macOS)或start report.pdf(Windows) - 如果 PDF 打开报“文件损坏”,大概率是
page.setContent()传入了非法 HTML(比如未转义的<符号),建议先用console.log(html)检查输出
为什么不用 markdown-pdf 或 MPE 插件?
因为你要的是“通过 Node 环境生成”,不是“在 VSCode 图形界面里点一下”。插件隐藏了底层细节,反而不利于调试和定制。
典型问题包括:
-
markdown-pdf(yzane 版)已在 2026 年彻底失效:导出中文全方框、Mermaid 图空白、公式不渲染——不是你配错了,是它底层还在用 PhantomJS -
Markdown Preview Enhanced(MPE)虽可用,但它的导出逻辑是“截图预览页 DOM”,一旦预览没加载完成(比如网络延迟、MathJax 未就绪),PDF 就是白页或错位 - 所有插件都强制走 Puppeteer 自动下载 Chromium,而你的 CI/CD 或公司内网机器往往禁止外网访问,导致构建失败
真正的可控,是把浏览器路径、HTML 构造、PDF 参数全部写死在脚本里,而不是靠插件猜你想要什么。


















