Mobile wallpaper 1Mobile wallpaper 2Mobile wallpaper 3Mobile wallpaper 4Mobile wallpaper 5
562 字
3 分钟
脚本化: html 转 pdf
2025-06-20
统计加载中...

起因#

众所周知,我前几天写了两份大物的知识点总结,当时为了排版好看一点,在 markdown 里面写 html。那两份总结今天要统一上交了,BUT,我的 markdown + html 混合语言太过强大,没法在任何一个本地的编辑器上渲染出来,也就是说没有很好的办法作为一个文件交上去😡😡😡。

于是,我尝试了几个方法把我的总结转成 pdf,如

  • 直接用 typora,obsidian 或者 vscode 的插件,显然都失败了
  • mactex + pandoc 同样失败了,也渲染不出来 html 标签里面的 latex 公式
  • puppeteer 成功了,而且比较完美

过程记录#

折腾之前我先打开博客,找到那两篇笔记,查看源代码,把正文内容复制下来,在本地稍微改了一点 CSS。

puppeteer 是一个 js 包,大致原理是开启一个无头的 Chrome 渲染网页内容,要先有 nodejs

brew install node

然后 cd 到工作目录装一下 puppeteer

npm init -y
npm install puppeteer

然后写一个脚本 render.js

const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({headless: 'new'});
const page = await browser.newPage();
await page.setViewport({width: 1280, height: 800, deviceScaleFactor: 1});
await page.goto(`file://${__dirname}/dawu4/index.html`, {
waitUntil: 'networkidle2',
});
// 确保 MathJax 完成排版
await page.evaluate(() => {
if (window.MathJax && MathJax.typesetPromise) {
return MathJax.typesetPromise();
}
});
await page.pdf({
path: 'out.pdf',
format: 'A4',
scale: 1,
printBackground: true,
});
await browser.close();
})();
node render.js

就成功渲染出一个 pdf,保留了文本和超链接。

成果图

后记#

刚高兴了一会儿,我猛然发现,补兑!

既然他开了一个 Chrome 渲染网页,为什么我不能开个 Chrome 直接手动弄下来呢,思来想去只有一种可能,我打开了一个本地的 html,command + P,保存,打开

……

世界突然安静了。我一直以为直接 print 出来的 pdf 是不能保留可选中的文本和超链接的,但是他可以,所以到底我折腾了些什么😭😭😭

“我的努力,都是小狗屁”

——Lyn

虽然但是,如果网页多了就不好处理了,这个办法可以配合爬虫批量转 pdf,或者配合 marked 批量把本地的 markdown 转成 pdf,也不能说一定用都没有吧。

脚本化: html 转 pdf
https://starlab.top/posts/html-to-pdf/
作者
Star
发布于
2025-06-20
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时