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 相关文章推荐
用JS实现的一个include函数
Jul 21 Javascript
jquery命令汇总,方便使用jquery的朋友
Jun 26 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
Mar 18 Javascript
JQuery中$(document)是什么意思有什么作用
Jul 21 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
Feb 03 Javascript
jQuery实现自动滚动到页面顶端的方法
May 22 Javascript
jQuery基于ID调用指定iframe页面内的方法
Jul 06 Javascript
js 获取当前web应用的上下文路径实现方法
Aug 19 Javascript
Javascript实现页面滚动时导航智能定位
May 06 Javascript
浅谈函数调用的不同方式,以及this的指向
Sep 17 Javascript
Vue程序调试的方法
Jun 17 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
Jun 11 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
8个必备的PHP功能实例代码
2013/10/27 PHP
JavaScript中实现块作用域的方法
2010/04/01 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
5秒后跳转到另一个页面的js代码
2013/10/12 Javascript
javascript的回调函数应用示例
2014/02/20 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
JavaScript检测原始值、引用值、属性
2016/06/20 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
python发腾讯微博代码分享
2014/01/10 Python
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
Django通用类视图实现忘记密码重置密码功能示例
2019/12/17 Python
python scrapy重复执行实现代码详解
2019/12/28 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
2020/02/20 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
HTML5 实战PHP之Web页面表单设计
2011/10/09 HTML / CSS
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
信用社员工先进事迹材料
2014/02/04 职场文书
乡镇三项教育实施方案
2014/03/30 职场文书
廉政文化进校园广播稿
2014/10/20 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫
关于JS中的作用域中的问题思考分享
2022/04/06 Javascript
vue使用element-ui按需引入
2022/05/20 Vue.js