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 日历提醒系统( 兼容所有浏览器 )
Apr 07 Javascript
DLL+ ActiveX控件+WEB页面调用例子
Aug 07 Javascript
js的表单操作 简单计算器
Dec 29 Javascript
js实现的二级横向菜单条实例
Aug 22 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
Jan 26 Javascript
浅析Node.js:DNS模块的使用
Nov 23 Javascript
Vue数据驱动模拟实现2
Jan 11 Javascript
深入理解angular2启动项目步骤
Jul 15 Javascript
Vue请求JSON Server服务器数据的实现方法
Nov 02 Javascript
electron-vue开发环境内存泄漏问题汇总
Oct 10 Javascript
使用axios请求时,发送formData请求的示例
Oct 29 Javascript
基于JavaScript实现简单扫雷游戏
Jan 02 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的计数器程序
2006/10/09 PHP
织梦模板标记简介
2007/03/11 PHP
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
jQuery事件绑定和委托实例
2014/11/25 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
jquery实现九宫格大转盘抽奖
2015/11/13 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
Vue渲染函数详解
2017/09/15 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python基础教程之基本内置数据类型介绍
2014/02/20 Python
python中enumerate的用法实例解析
2014/08/18 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
windows下ipython的安装与使用详解
2016/10/20 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
python创建属于自己的单词词库 便于背单词
2019/07/30 Python
python3 使用traceback定位异常实例
2020/03/09 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
Python基于template实现字符串替换
2020/11/27 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
初中生三年学习生活的自我评价
2013/11/03 职场文书
体育老师的教学自我评价分享
2013/11/19 职场文书
计算机毕业大学生推荐信
2013/12/01 职场文书
酒店led欢迎词
2014/01/09 职场文书
大学生最新职业生涯规划书范文
2014/01/12 职场文书
保护环境的标语
2014/06/09 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
小学班级标语口号大全
2015/12/26 职场文书