最近寫了一個小功能模塊,將html文件轉化為pdf文件。
1.需求
現在有這么一個需求:
假設App里面有一份html格式的勞動合同, 需要點擊某按鈕生成對應的pdf文件保存起來。如圖:
image.png
這就需要后端來處理,后端為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模板如下:
模板
執行文件試一試:
image.png
執行函數后,在相應的文件夾下生成了我們指定的pdf文件:
文件
打開看一眼:
image.png
可見 我們的姓名和日期都正確輸出了出來。你可以配置更多的正則匹配規則,來修改更多的信息。