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 01 Javascript
让网页跳转到指定位置的jquery代码非书签
Sep 06 Javascript
jquery-mobile基础属性与用法详解
Nov 23 Javascript
JavaScript日期选择功能示例
Jan 16 Javascript
JavaScript轻松创建级联函数的方法示例
Feb 10 Javascript
JavaScript之promise_动力节点Java学院整理
Jul 03 Javascript
JQuery 又谈ajax局部刷新
Nov 27 jQuery
webpack-dev-server自动更新页面方法
Feb 22 Javascript
node前端开发模板引擎Jade的入门
May 11 Javascript
如何在项目中使用log4.js的方法步骤
Jul 16 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
Aug 16 Javascript
js实现简单贪吃蛇游戏
May 15 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站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
php二维数组排序详解
2013/11/06 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
枚举JavaScript对象的函数
2006/12/22 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
Python、Javascript中的闭包比较
2015/02/04 Python
使用python在本地电脑上快速处理数据
2017/06/22 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
pytorch 批次遍历数据集打印数据的例子
2019/12/30 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
天猫国际进口超市直营:官方直采,一站购齐
2017/12/11 全球购物
S’well Bottle保温杯官网:绝缘不锈钢水瓶
2018/05/09 全球购物
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
关爱留守儿童倡议书
2014/04/15 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
家长给老师的感谢信
2015/01/20 职场文书
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL