用到的库
- 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
样式展示
签名图片处理
/**
* 下载文件
* @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(function (resolve, reject) {
// URL用来做url的转义,因为传过来的地址不一定是合规的例如带有中文
https.get