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打开新窗口防止被浏览器阻止的方法
Jan 03 Javascript
JavaScript使用slice函数获取数组部分元素的方法
Apr 06 Javascript
使用JavaScript刷新网页的方法
Jun 04 Javascript
AngularJS ng-app 指令实例详解
Jul 30 Javascript
jQuery之动画ajax事件(实例讲解)
Jul 18 jQuery
Vue from-validate 表单验证的示例代码
Sep 26 Javascript
详解Vue-cli代理解决跨域问题
Sep 27 Javascript
ES6解构赋值的功能与用途实例分析
Oct 31 Javascript
javascript字体颜色控件的开发 JS实现字体控制
Nov 27 Javascript
微信小程序实现传参数的几种方法示例
Jan 10 Javascript
解决vue动态为数据添加新属性遇到的问题
Sep 18 Javascript
vue实现五子棋游戏
May 28 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的FTP学习(二)
2006/10/09 PHP
PHP url 加密解密函数代码
2011/08/26 PHP
基于xcache的配置与使用详解
2013/06/18 PHP
PHP反向代理类代码
2014/08/15 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
2016/07/09 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
2013/05/14 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
2017/12/22 Javascript
微信小程序云开发 生成带参小程序码流程
2019/05/18 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
python如何删除文件中重复的字段
2019/07/16 Python
HTML5实现WebSocket协议原理浅析
2014/07/07 HTML / CSS
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
体育专业个人的求职信范文
2013/09/21 职场文书
高中运动会广播稿
2014/01/21 职场文书
优秀体育委员自荐书
2014/01/31 职场文书
股东协议书
2014/04/14 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
少先队工作总结2015
2015/05/13 职场文书
小学数学国培研修日志
2015/11/13 职场文书
2016年党员岗位承诺书
2016/03/24 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
Python sklearn分类决策树方法详解
2022/09/23 Python