背景
项目中有用到node做中心层,时期有个为PDF文件增加水印的需求,网上搜了不少帖子,发明有以下几点存在的题目。
1、单页PDF的话,能够用PNG图片加到PDF上,然则现实运用状况就没那末抱负,必需满足多页PDF每页都加上水印的结果方可。
2、中心想过,把PDF转成图片,图片加上水印后再转回PDF,然则觉得中心步骤太贫苦,而且碰面临清晰度下落的能够。
3、Python、Java有相干计划,能够完成,有想过用node去实行Python剧本去为PDF加水印,考虑到开辟人员都是前端、假如今后须要保护,扩大能够就不是那末友好了。
解决计划
逛了Github和NPM,发明node-pdftk能够满足需求,不过得依靠PDFTK这个软件,进一步相识,发明PDFTK支撑linux,好,直接用这个开搞。
环境
项目布置是用了docker,那就用docker来吧,比较贴合状况也费事点;假如日常平凡在本身电脑上开辟,但须要linux环境的话练手或许模仿效劳器环境的话,人人也能够用一个linux镜像运转一个dokcer容器,这里就不赘述了。
完成
1、app.js
API相对较为简朴,input要领中我们输入源文件,stamp要领中我们输入水印文件,out要领中指定保留的途径,这里的话我们起了一个效劳,当接见3100端口的时刻就去天生我们带水印的PDF。
'use strict';
const express = require('express');
const pdftk = require('node-pdftk');
const path = require('path');
const app = express();
app.get('/', (req, res) => {
pdftk
.input(path.resolve(__dirname + '/../files/javascript.pdf'))
.stamp(path.resolve(__dirname + '/../files/watermark.pdf'))
.output(path.resolve(__dirname + '/../files/javascript_watermark.pdf'))
.then(buffer => {
return res.send('successful');
})
.catch(err => {
console.error(err);
return res.send('failed');
});
});
app.listen(3100);
2、dockerfile
FROM node:7.6.0
# 建立事情目次
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY ./node_modules /usr/src/app/node_modules
# 下载安装PDFTK
RUN apt-get update
RUN apt-get install -y pdftk
# 运用PM2启动运用
CMD ["./node_modules/pm2/bin/pm2-docker", "process.yml"]
3、结果
源文件
水印文件
增加水印后