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 相关文章推荐
Ubuntu中搭建Nodejs开发环境过程分享
Jun 01 NodeJs
NodeJS中Buffer模块详解
Jan 07 NodeJs
NodeJS的Promise的用法解析
May 05 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 NodeJs
nodejs入门教程六:express模块用法示例
Apr 24 NodeJs
修改Nodejs内置的npm默认配置路径方法
May 13 NodeJs
NodeJS服务器实现gzip压缩的示例代码
Oct 12 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 NodeJs
nodejs微信开发之接入指南
Mar 17 NodeJs
Nodejs libuv运行原理详解
Aug 21 NodeJs
nodejs中的异步编程知识点详解
Jan 17 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对象转换为数组函数(递归方法)
2012/02/04 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
js使用DOM设置单选按钮、复选框及下拉菜单的方法
2015/01/20 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
2015/05/29 Javascript
jQuery插件实现无缝滚动特效
2015/11/24 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
javaScript产生随机数的用法小结
2018/04/21 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
2018/05/03 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
python 数据加密代码
2008/12/24 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
简单实现python聊天程序
2018/04/01 Python
Django中使用Celery的方法示例
2018/11/29 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
python中dict使用方法详解
2019/07/17 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
python删除文件、清空目录的实现方法
2020/09/23 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
百度吧主申请感言
2014/01/12 职场文书
超市开店计划书
2014/09/15 职场文书
学校施工安全责任书
2015/01/29 职场文书
考研英语辞职信
2015/05/13 职场文书
nginx设置资源请求目录的方式详解
2022/05/30 Servers