素材牛VIP会员
有什么将网页转换为 PDF 的方法?(Node)
 蝶***7  分类:Node.js  人气:1001  回帖:4  发布于6年前 收藏

需求如题,想请教有什么好的办法可以将网页转换为 PDF 吗?

目前经过调研,我目前发现的方法如下(使用 Node ):

  • 利用 phantom.js 的 render

  • phantomjs-node,对 phantom.js 进行了一层封装

这是我尝试的目前效果最好的方法,可以直接自行封装一个脚本,由前端调用 API 后触发。但渲染速度不尽人意,不过也应该有一些优化的空间。

// demo
const phantom = require('phantom');

(async function() {
    const instance = await phantom.create();
    const page = await instance.createPage();

    await page.property('viewportSize', {width: 1024, height: 600});
    const status = await page.open('https://stackoverflow.com/');
    console.log(`Page opened with status [${status}].`);

    await page.render('stackoverflow.pdf');
    console.log(`File created at [./stackoverflow.pdf]`);

    await instance.exit();
}());
  • node-webshot

生成网页截屏。但只能是 png、jpg、jpeg 形式,且无法滚屏截图,只能指定图片高度或者按照窗口大小截取(目前没有找到合适的方式)

// demo
var webshot = require('webshot');

webshot('google.com', 'google.png', function(err) {
  // screenshot now saved to google.png
});
  • node-html-pdf

暂时还没有尝试,看见在 stackoverflow 上有人推荐,也有人反馈说该库有很奇怪的 bug

  • dom-to-image

相对于上面的方法,该库是在前端调用,将一个指定的 DOM 转为 base64 格式的图片,并可以保留其样式。但缺点很明显,由于是前端使用,在 DOM 数目较多时会有明显的卡顿,体验不好。

// demo
domtoimage.toJpeg(document.getElementById('my-node'))
    .then(function (dataUrl) {
        var link = document.createElement('a');
        link.download = 'my-image-name.jpeg';
        link.href = dataUrl;
        link.click();
    });
  • stackoverflow 上的讨论 - HTML to PDF with Node.js

    • phantomjs

    • window.print()

    • htmltocanvas 或者 rasterizeHTML,然后 jsPDF

    • node-html-pdf

讨论这个帖子(4)垃圾回帖将一律封号处理……

Lv5 码农
龙***4 页面重构设计 6年前#1

一定要用node来实现?

Lv6 码匠
li***28 Linux系统工程师 6年前#2

html-pdf,或者html-to-pdf,前者用的好像是PhantomJS,转换pdf主要控制的是用async/await来同步转换,如果比较多且用异步转换成功率会下降。

Lv3 码奴
wu***su 移动开发工程师 6年前#3

已通过 phantom 实现,速度上也没有很慢

Lv6 码匠
这***2 学生 6年前#4

headless Chrome 也可以方便的截图

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取