node.js实现为PDF添加水印的示例代码


Posted in Javascript onDecember 05, 2018

背景

项目中有用到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

RUN npm set registry https://registry.npm.taobao.org/

# 下载安装PDFTK
RUN apt-get update
RUN apt-get install -y pdftk

# 使用PM2启动应用
CMD ["./node_modules/pm2/bin/pm2-docker", "process.yml"]

3、效果

源文件

node.js实现为PDF添加水印的示例代码

水印文件

node.js实现为PDF添加水印的示例代码

添加水印后

node.js实现为PDF添加水印的示例代码

4、地址

Github仓库地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JAVASCRIPT keycode总结
Feb 04 Javascript
javascript 面向对象继承
Nov 26 Javascript
jquery struts 验证唯一标识(公用方法)
Mar 27 Javascript
javascript检测对象中是否存在某个属性判断方法小结
May 19 Javascript
JQuery对id中含有特殊字符的转义处理示例
Sep 06 Javascript
setInterval与clearInterval的使用示例代码
Jan 28 Javascript
node.js集成百度UE编辑器
Feb 05 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
Jan 22 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
Dec 28 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
May 21 Javascript
Vue项目接入Paypal实现示例详解
Jun 04 Javascript
微信小程序连续签到7天积分获得功能的示例代码
Aug 20 Javascript
vue组件之间通信实例总结(点赞功能)
Dec 05 #Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
Dec 05 #Javascript
JS获取月的第几周和年的第几周实例代码
Dec 05 #Javascript
JavaScript实现学生在线做题计时器功能
Dec 05 #Javascript
vue-cli3搭建项目的详细步骤
Dec 05 #Javascript
详解vue中async-await的使用误区
Dec 05 #Javascript
Vue中的基础过渡动画及实现原理解析
Dec 04 #Javascript
You might like
解析php中array_merge与array+array的区别
2013/06/21 PHP
PHP中list()函数用法实例简析
2016/01/08 PHP
Yii框架分页技术实例分析
2019/08/30 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
jQuery图片轮播的具体实现
2013/09/11 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
javascript自动恢复文本框点击清除后的默认文本
2016/01/12 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
2018/12/23 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
python学习数据结构实例代码
2015/05/11 Python
详解python多线程、锁、event事件机制的简单使用
2018/04/27 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
python 线性回归分析模型检验标准--拟合优度详解
2020/02/24 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
学生打架检讨书大全
2014/01/23 职场文书
项目施工员岗位职责
2014/03/09 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
幼儿园学前班幼儿评语
2014/12/29 职场文书
幼师求职自荐信
2015/03/26 职场文书
建国大业电影观后感
2015/06/01 职场文书
2016年中学清明节活动总结
2016/04/01 职场文书
详解前端任务构建利器Gulp.js使用指南
2021/04/30 Javascript