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 相关文章推荐
jquery 必填项判断表单是否为空的方法
Sep 14 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
Dec 28 Javascript
js实现内容显示并使用json传输数据
Mar 16 Javascript
jQuery表格插件datatables用法汇总
Mar 29 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
May 09 Javascript
AngularJs bootstrap搭载前台框架——js控制部分
Sep 01 Javascript
js带闹铃功能的倒计时代码
Sep 29 Javascript
jquery实现百叶窗效果
Jan 12 Javascript
基于jQuery Easyui实现登陆框界面
Jul 10 jQuery
浅析vue中常见循环遍历指令的使用 v-for
Apr 18 Javascript
Node.js使用cookie保持登录的方法
May 11 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
Jun 10 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
SONY SRF-M100的电路分析
2021/03/02 无线电
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
javascript 限制输入脚本大全
2009/11/03 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
JQuery标签页效果的两个实例讲解(4)
2015/09/17 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
举例说明JavaScript中的实例对象与原型对象
2016/03/11 Javascript
详解webpack中的hash、chunkhash、contenthash区别
2018/01/05 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
2019/01/30 Javascript
20个必会的JavaScript面试题(小结)
2019/07/02 Javascript
JS实现“全选”和"全不选"功能代码实例
2020/02/06 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
python 打印对象的所有属性值的方法
2016/09/11 Python
Python程序中设置HTTP代理
2016/11/06 Python
Python3 XML 获取雅虎天气的实现方法
2018/02/01 Python
Python 加密与解密小结
2018/12/06 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
python pandas生成时间列表
2019/06/29 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
口腔医学技术应届生求职信
2013/11/09 职场文书
企业申诉管理制度
2014/01/30 职场文书
出生医学证明书
2014/09/15 职场文书
安全承诺书格式范本
2015/04/28 职场文书
货款欠条范本
2015/07/03 职场文书
新闻稿标题
2015/07/18 职场文书
安全学习心得体会范文
2016/01/18 职场文书
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript