最近写了一个小功能模块,将html文件转化为pdf文件。
1.需求
现在有这么一个需求:
假设App里面有一份html格式的劳动合同, 需要点击某按钮生成对应的pdf文件保存起来。如图:
这就需要后端来处理,后端为nodejs。依赖了如下的包:
"dependencies": {
"html-pdf": "^2.1.0",
"moment": "^2.18.1",
"phantomjs": "^2.1.7"
}
2.设计函数
/**
* Created by saidesun on 17/8/30.
*/
var pdf = require('html-pdf'); // html-pdf
exports.createPDFProtocolFile = function (template, options, reg, filename) {
/**
template: html 模板
options: 配置
reg: 正则匹配规则
filename: 输出pdf文件路径及文件名
*/
// 将所有匹配规则在html模板中匹配一遍
if (reg && Array.isArray(reg)) {
reg.forEach(item => {
template = template.replace(item.relus, item.match);
});
}
pdf.create(template, options).toFile(filename, function(err, res) {
if (err) {
return console.log(err);
}
console.log(res);
});
}
代码很少,也很简洁。具体功能有:
- 传入的html模板
- 生成pdf文件的一些配置
- 正则替换html模板中的某些字符串(姓名,日期等)的替换规则
- 输出pdf文件路径及文件名
核心功能就是调用pdf.create
来实现。
3.调用
var fs = require('fs');
var moment = require('moment'); // moment.js
var html = fs.readFileSync('./test.html', 'utf8'); // 引入html模板
var create = require('./create.js'); // 引入写好的函数
var options = {
"format": 'A4',
"header": {
"height": "10mm",
"contents": ''
}}; // 一些配置
var name = '张三';
// 匹配规则
var reg = [
{
relus: /__name__/g,
match: name
},
{
relus: /__date__/g,
match: moment().format('YYYY年MM月DD日')
}
];
create.createPDFProtocolFile(html, options, reg, './test.pdf'); // 传入参数 生成pdf
我们的简易的html模板如下:
执行文件试一试:
执行函数后,在相应的文件夹下生成了我们指定的pdf文件:
打开看一眼:
可见 我们的姓名和日期都正确输出了出来。你可以配置更多的正则匹配规则,来修改更多的信息。