nodejs 通过html生成pdf文件

最近写了一个小功能模块,将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模板如下:

nodejs 通过html生成pdf文件_第1张图片
执行文件试一试:

image.png

执行函数后,在相应的文件夹下生成了我们指定的pdf文件:

nodejs 通过html生成pdf文件_第2张图片

打开看一眼:

nodejs 通过html生成pdf文件_第3张图片

可见 我们的姓名和日期都正确输出了出来。你可以配置更多的正则匹配规则,来修改更多的信息。

你可能感兴趣的:(后端技术)