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 DOM 添加事件
Feb 14 Javascript
jquery select(列表)的操作(取值/赋值)
Aug 06 Javascript
Jquery Select操作方法集合脚本之家特别版
May 17 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 Javascript
js处理json以及字符串的比较等常用操作
Sep 08 Javascript
Javascript实现找不同色块的游戏
Jul 17 Javascript
详解在Vue中有条件地使用CSS类
Sep 30 Javascript
JS实现的全排列组合算法示例
Oct 09 Javascript
vue + vuex todolist的实现示例代码
Mar 09 Javascript
浅谈从React渲染流程分析Diff算法
Sep 08 Javascript
详解puppeteer使用代理
Dec 27 Javascript
vue-cli基础配置及webpack配置修改的完整步骤
Oct 20 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
人族 Terran 基本策略
2020/03/14 星际争霸
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
PHP获取文件夹大小函数用法实例
2015/07/01 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
JavaScript 事件对象的实现
2009/07/13 Javascript
JavaScript 布尔操作符解析  && || !
2012/08/10 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
2013/09/29 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
总结JavaScript中布尔操作符||与&&的使用技巧
2015/11/17 Javascript
javascript数据结构之双链表插入排序实例详解
2015/11/25 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
值得分享的bootstrap table实例
2016/09/22 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
Python fileinput模块使用实例
2015/06/03 Python
python实现用户答题功能
2018/01/17 Python
python3实现逐字输出的方法
2019/01/23 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
匡威爱尔兰官网:Converse爱尔兰
2019/06/09 全球购物
护士自我评价范文
2014/01/25 职场文书
中学自我评价
2014/01/31 职场文书
卫生巾广告词
2014/03/18 职场文书
公司股东合作协议书
2014/09/14 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
优秀教师先进事迹材料
2014/12/15 职场文书
优秀团员个人总结
2015/02/26 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
python基础之类方法和静态方法
2021/10/24 Python
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python