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 相关文章推荐
splice slice区别
Oct 09 Javascript
javascript之ESC(第二类混淆)
May 06 Javascript
如何快速的呈现我们的网页的技巧整理
Jul 01 Javascript
一些javascript一些题目的解析
Dec 25 Javascript
JS控制网页动态生成任意行列数表格的方法
Mar 09 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
Sep 24 Javascript
js window对象属性和方法相关资料整理
Nov 11 Javascript
js调出上下文菜单的实例
Dec 17 Javascript
jQuery EasyUi实战教程之布局篇
Jan 26 Javascript
基于JavaScript实现智能右键菜单
Mar 02 Javascript
react路由配置方式详解
Aug 07 Javascript
Angular请求防抖处理第一次请求失效问题
May 17 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中处理模拟rewrite 效果
2006/12/09 PHP
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
php 正则表达式小结
2009/08/31 PHP
php中批量替换文件名的实现代码
2011/07/20 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
javascript 实用的文字链提示框效果
2010/06/30 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
jQuery满屏焦点图左右滚动特效代码分享
2015/09/07 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
Angularjs使用指令做表单校验的方法
2017/03/31 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
2018/08/28 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
2018/09/12 Javascript
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
详解Python各大聊天系统的屏蔽脏话功能原理
2016/12/01 Python
python爬虫入门教程--利用requests构建知乎API(三)
2017/05/25 Python
tensorboard显示空白的解决
2020/02/15 Python
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
如何写出高性能的JSP和Servlet
2013/01/22 面试题
公司企业表扬信
2014/01/11 职场文书
高三体育教学反思
2014/01/29 职场文书
电钳工人个人求职信
2014/05/10 职场文书
2019年工作总结范文
2019/05/21 职场文书
python解析json数据
2022/04/29 Python
详解CSS3浏览器兼容
2022/12/24 HTML / CSS