图片来源
562 字
3 分钟
脚本化: html 转 pdf
起因
众所周知,我前几天写了两份大物的知识点总结,当时为了排版好看一点,在 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 -ynpm 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,也不能说一定用都没有吧。
部分信息可能已经过时







