干撸一个Node环境的PDF生成服务

干撸一个Node环境的PDF生成服务

  • 用到的库
  • 介绍
  • 代码片段
    • Http请求处理
    • 生成PDF
      • 样式展示
      • 签名图片处理
      • PDF排版
  • 结语

用到的库

  • express:Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能。许多流行的开发框架都基于 Express 构建。
  • jimp:是一个使用 JavaScript 编写的用于 Node的图像处理库,具有零依赖的特性。
  • pdfkit:PDFKit是一个用于Node和浏览器的PDF文档生成库,它可以轻松创建复杂的、多页的PDF文档。该API既包括低层函数,也包括高层功能的抽象,PDFKit API被设计得很简单,生成复杂的文档就像调用几个函数一样简单(浏览器端的PDF生成与展示建议使用JSPDF)。

介绍

公司的远程问诊项目需要做一个PDF处方生成的功能,后端是使用JAVA写的,本身JAVA有很多优秀的PDF生成库例如:PDFBox 、pdfjet、OpenPDF、itext-7-core,但是要么收费,要么功能不全,要么版本太低(OpenPDF是一个基于iText4的开源免费的分支),经过比较发现pdfkit的API和文档比较完整,pdfkit有一个很有吸引力的功能是自动排盘和文字自动换行自动隐藏。

代码片段

Http请求处理

const express = require('express');
const app = express()
app.post('/createPdfByJson', (req, res,next) => {
   
    if (req.method == 'POST') {
   
        let postData = "";
        req.on('data', function (chuck) {
   
            postData += chuck;
        });
        req.on('end', function () {
   
            // 处理参数转换
            let _postData = JSON.parse(postData);
            let _recipe = _postData.recipe;
            _recipe.medicines = _postData.recipeMedicineList;
            _recipe.createTime = new Date(_recipe.createTime);
            // 生成PDF文件
            console.log("生成处方:"+JSON.stringify(_recipe));
            pdf.createPdf(_recipe, function (data) {
   
                res.statusCode = 200
                res.setHeader('Content-Type', 'application/json')
                res.end(JSON.stringify(data))
            });
        });
    }
});

生成PDF

样式展示

干撸一个Node环境的PDF生成服务_第1张图片

签名图片处理

/**
 * 下载文件
 * @param {文件地址}} url 
 */
function download(url) {
   
  return new Promise(function (resolve, reject) {
   
    https.get(new URL(url).href, (res) => {
   
      let bufferArray = new Array();
      res.on('data', (d) => {
   
        bufferArray.push(d);
      });
      res.on('end', () => {
   
        let imgBuffer = Buffer.concat(bufferArray);
        var ab = new ArrayBuffer(imgBuffer.length);
        var view = new Uint8Array(ab);
        for (var i = 0; i < imgBuffer.length; ++i) {
   
          view[i] = imgBuffer[i];
        }
        resolve(ab);
      });
      res.on('error', (error) => {
   
        reject(error);
      });
    });
  });
}

/**
 * 下载图像并旋转图像
 * @param {地址}} url 
 */
function downloadImagRotate(url,rotate) {
   
  return new Promise(

你可能感兴趣的:(WEB,node.js,pdf)