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 相关文章推荐
jquery 学习笔记一
Apr 07 Javascript
js获取class的所有元素
Mar 28 Javascript
Jquery中children与find之间的区别详细解析
Nov 29 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
Aug 24 Javascript
一个可复用的vue分页组件
May 15 Javascript
yarn的使用与升级Node.js的方法详解
Jun 04 Javascript
jQuery 实现左右两侧菜单添加、移除功能
Jan 02 jQuery
Vue extend的基本用法(实例详解)
Dec 09 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
May 10 Javascript
JS实现数据动态渲染的竖向步骤条
Jun 24 Javascript
vue中watch的用法汇总
Dec 28 Vue.js
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
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利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
php 启动报错如何解决
2014/01/17 PHP
Eclipse的PHP插件PHPEclipse安装和使用
2014/07/20 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
PHP JWT初识及其简单示例
2018/10/10 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
js查找父节点的简单方法
2008/06/28 Javascript
Javascript 获取链接(url)参数的方法
2009/02/15 Javascript
JavaScript 语法集锦 脚本之家基础推荐
2009/11/15 Javascript
jQuery使用技巧简单汇总
2013/04/18 Javascript
js动态修改input输入框的type属性(实现方法解析)
2013/11/13 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
jQuery Dom元素操作技巧
2018/02/04 jQuery
Webpack的dll功能使用
2018/06/28 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
[57:50]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第二局
2016/03/05 DOTA
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
python解析html开发库pyquery使用方法
2014/02/07 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
使用python画社交网络图实例代码
2019/07/10 Python
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
python基于win32api实现键盘输入
2020/12/09 Python
廉洁校园实施方案
2014/05/25 职场文书
2014年家长学校工作总结
2014/11/20 职场文书
员工手册编写范本
2015/05/14 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
在校生证明
2015/06/17 职场文书
2015年学校医务室工作总结
2015/07/20 职场文书