当前位置: 首页 > 后端技术 > Node.js

Node.js实现给PDF加水印

时间:2023-04-03 19:33:19 Node.js

后台项目使用node作为中间层。这期间,有给PDF文件加水印的需求。在网上搜索了很多帖子,发现了以下问题。1、对于单页PDF,可以在PDF中添加PNG图片,但实际使用起来不是很理想。必须满足多页PDF每页加水印的效果。2.想过把PDF转成图片,给图片加水印再转回PDF,但是感觉中间步骤太麻烦,而且清晰度可能会下降。3.有Python和Java的相关解决方案,可以实现。想过用node执行Python脚本给PDF加水印。考虑到开发者都是前端,如果以后需要维护的话,扩展可能就没那么友好了。解决方案我浏览了Github和NPM,发现node-pdftk可以满足需求,但是还得依赖软件PDFTK。进一步了解后,发现PDFTK是支持linux的。好的,就用这个开始吧。环境项目部署用的是docker,那就用docker吧,更适合情况,省事;如果平时在自己电脑上开发,但是需要linux环境来练习或者模拟服务器环境,也可以使用linux镜像运行dokcer容器,这里不再赘述。实现1.app.jsAPI比较简单。在input方法中,我们输入源文件,在stamp方法中,我们输入水印文件,在out方法中,指定保存路径。在这里,我们设置了一个服务。当访问端口3100时,我们去生成我们的水印PDF。'使用严格';constexpress=require('express');constpdftk=require('node-pdftk');constpath=require('path');constapp=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=>{returnres.send('successful');}).catch(err=>{console.error(err);returnres.send('failed');});});app.listen(3100);2.dockerfileFROMnode:7.6.0#创建工作目录RUNmkdir-p/usr/src/appWORKDIR/usr/src/appCOPY./node_modules/usr/src/app/node_modules#下载安装PDFTKRUNapt-getupdateRUNapt-getinstall-ypdftk#使用pm2启动应用CMD["./node_modules/pm2/bin/pm2-docker","process.yml"]3.添加水印后的效果源文件水印文件4.地址Github仓库地址