Nodejs中使用phantom将html转为pdf或图片格式的方法


Posted in NodeJs onSeptember 18, 2017

最近在项目中遇到需要把html页面转换为pdf的需求,并且转换成的pdf文件要保留原有html的样式和图片。也就是说,html页面的图片、表格、样式等都需要完整的保存下来。

最初找到三种方法来实现这个需求,这三种方法都只是粗浅的看了使用方法,从而找出适合这个需求的方案:

html-pdf 模块
wkhtmltopdf 工具
phantom 模块
最终使用了phantom模块,也达到了预期效果。现在简单的记录三种方式的使用方法,以及三者之间主要的不同之处。

1.html-pdf

github:https://github.com/marcbachmann/node-html-pdf
npm:https://www.npmjs.com/package/html-pdf

安装:

npm install -g html-pdf

使用命令行:

html-pdf /test/index.html index.pdf

这样便可以把index.html页面转换为对应的index.pdf文件。

使用代码:

var express = require('express');
var router = express.Router();
var pdf = require('html-pdf');

router.get('/url',function(req,res){
 res.render('html',function(err,html){
  html2Pdf(html,'html.pdf');
  //........
 });
});

/**
 * 这种方法没有渲染样式和图片
 * @param url
 * @param pdfName
 */
exports.html2Pdf = function(html,pdfName){
 var options = {format:true};
 pdf.create(html,options).toFile(__dirname+'/'+pdfName,function(err,res){
  if (err) return console.log(err);
  console.log(res);
 });
};

在测试过程中发现,生成的pdf文件中并没有支持样式渲染和图片加载,不能支持通过url直接加载html;但是在分页的支持上很好。

结果如下:

Nodejs中使用phantom将html转为pdf或图片格式的方法

2、wkhtmltopdf

github:https://github.com/wkhtmltopdf/wkhtmltopdf
官方文档:https://wkhtmltopdf.org

npm:https://www.npmjs.com/package/wkhtmltopdf
wkhtmltopdf在效果上比较html-pdf要好很多,它支持样式渲染,图片加载,还可以通过url直接生成PDF文件。
但是安装上要麻烦得多。具体安装步骤参考这里

安装完毕之后,使用命令行:

wkhtmltopdf https://github.com github.pdf

即可生成对应的PDF文件。

代码使用:

var wkhtmltopdf = require('wkhtmltopdf');
var fs = require('fs');


// URL 使用URL生成对应的PDF
wkhtmltopdf('http://github.com', { pageSize: 'letter' })
 .pipe(fs.createWriteStream('out.pdf'));

除了可以通过URL生成之外,还能通过HTML文件内容生成,就像HTML-PDF一样,只要有HTML格式的字符串就可以生成相应的PDF。

结果如下:

Nodejs中使用phantom将html转为pdf或图片格式的方法

3、phantom 模块

github:https://github.com/amir20/phantomjs-node
官方文档:http://amirraminfar.com/phantomjs-node/
npm:https://www.npmjs.com/package/phantom
phantomjs是基于webkit的无头浏览器,提供相关的JavaScript API,nodejs就相当于对phantomjs的模块化封装,使得它能够在nodejs中使用。

模块安装:

node版本6.X以上的:

npm install phantom ?save

node版本5.X的:

npm install phantom@3 ?save

node版本4.X及以下的:

npm install phantom@2 ?save

以下的例子都是基于node 4.x

代码使用:

var phantom = require('phantom');

phantom.create().then(function(ph) {
 ph.createPage().then(function(page) {
  page.open("https://www.oracle.com/index.html").then(function(status) {
   page.property('viewportSize',{width: 10000, height: 500});
   page.render('/oracle10000.pdf').then(function(){
    console.log('Page rendered');
    ph.exit();
   });
  });
 });
});

代码中,phantom能够通过URL转换为相应的PDF,而且能够通过 page.property('viewportSize',{width:width,height:height}) 来设置生成的PDF的宽度和高度。

此例phantom中并没有分页,它是以整个浏览器截图的形式,获取全文,转化为PDF格式。

选择phantom的主要原因就是便于设置PDF的宽度,更能兼容HTML的排版。

结果如下:

Nodejs中使用phantom将html转为pdf或图片格式的方法

NodeJs 相关文章推荐
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 NodeJs
nodejs教程之环境安装及运行
Nov 21 NodeJs
Nodejs为什么选择javascript为载体语言
Jan 13 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
nodejs和C语言插入mysql数据库乱码问题的解决方法
Apr 14 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
浅谈nodejs中的类定义和继承的套路
Jul 26 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
NodeJS爬虫实例之糗事百科
Dec 14 NodeJs
用Electron写个带界面的nodejs爬虫的实现方法
Jan 29 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 NodeJs
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
Sep 18 #NodeJs
Nodejs+express+ejs简单使用实例代码
Sep 18 #NodeJs
详解nodejs中express搭建权限管理系统
Sep 15 #NodeJs
nodejs socket服务端和客户端简单通信功能
Sep 14 #NodeJs
ubuntu编译nodejs所需的软件并安装
Sep 12 #NodeJs
nodejs对express中next函数的一些理解
Sep 08 #NodeJs
nodejs 图解express+supervisor+ejs的用法(推荐)
Sep 08 #NodeJs
You might like
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
2011/07/03 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
php+mysql实现无限级分类
2015/11/11 PHP
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
JavaScript经典效果集锦
2010/07/06 Javascript
HTML5附件拖拽上传drop & google.gears实现代码
2011/04/28 Javascript
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
js模拟select下拉菜单控件的代码
2013/05/08 Javascript
Javascript表格翻页效果实现思路及代码
2013/08/23 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
Js跳出两级循环方法代码实例
2020/09/22 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
[39:00]Optic vs VP 2018国际邀请赛淘汰赛BO3 第三场 8.24
2018/08/25 DOTA
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
利用python计算时间差(返回天数)
2019/09/07 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
英国最大的宠物食品和宠物用品网上零售商: Zooplus
2016/08/01 全球购物
戴森美国官网:Dyson美国
2016/09/11 全球购物
留学自荐信
2013/10/10 职场文书
团工委书记自荐书范文
2013/12/17 职场文书
电子工程专业毕业生求职信
2014/03/14 职场文书
高二学生评语大全
2014/04/25 职场文书
行风评议整改报告
2014/11/06 职场文书
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis
我收到了德劲DE1107
2022/04/05 无线电
Smart 2 车辆代号 HC11 全新谍照曝光
2022/04/21 数码科技