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 相关文章推荐
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
nodejs通过phantomjs实现下载网页
May 04 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
详解nodejs中exports和module.exports的区别
Feb 17 NodeJs
NodeJs form-data格式传输文件的方法
Dec 13 NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 NodeJs
nodejs前端模板引擎swig入门详解
May 15 NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 NodeJs
Nodejs模块的调用操作实例分析
Dec 25 NodeJs
NodeJs 模仿SIP话机注册的方法
Jun 21 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
nodejs利用readline提示输入内容实例代码
Jul 15 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 HandlerSocket的使用
2011/05/02 PHP
php自定义时间转换函数示例
2016/12/07 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
JavaScript接口实现代码 (Interfaces In JavaScript)
2010/06/11 Javascript
jQuery总体架构的理解分析
2011/03/07 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
实例分析js事件循环机制
2017/12/13 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
vue 解决在微信内置浏览器中调用支付宝支付的情况
2020/11/09 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
python3之微信文章爬虫实例讲解
2017/07/12 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
python获取array中指定元素的示例
2019/11/26 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
python中pivot()函数基础知识点
2021/01/03 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
中学生自我评价范文
2014/02/08 职场文书
环境整治工作方案
2014/05/18 职场文书
学生会个人总结范文
2015/02/15 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js
css之clearfix的用法深入理解(必看篇)
2023/05/21 HTML / CSS