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中定义对象类别
Dec 22 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
Jan 06 Javascript
jquery制作搜狐快站页面效果示例分享
Feb 21 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
May 03 Javascript
使用JavaScript开发IE浏览器本地插件实例
Feb 18 Javascript
JavaScript访问字符串中单个字符的两种方法
Jul 03 Javascript
jquery 获取select数组与name数组长度的实现代码
Jun 20 Javascript
基于bootstrap实现广告轮播带图片和文字效果
Jul 22 Javascript
完美解决js传递参数中加号和&号自动改变的方法
Oct 11 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
Jun 08 Javascript
详解vuex 渐进式教程实例代码
Nov 27 Javascript
Node绑定全局TraceID的实现方法
Nov 14 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
Adodb的十个实例(清晰版)
2006/12/31 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
PHP中new static()与new self()的比较
2016/08/19 PHP
PHP如何通过表单直接提交大文件详解
2019/01/08 PHP
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
JS中取二维数组中最大值的方法汇总
2016/04/17 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
简单谈谈gulp-changed插件
2017/02/21 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
js实现带有动画的返回顶部
2020/08/09 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
pygame加载中文名mp3文件出现error
2017/03/31 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
Python Pillow Image Invert
2019/01/22 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
python实现超级马里奥
2020/03/18 Python
NOTINO英国:在线购买美容和香水
2020/02/25 全球购物
纪检干部对照检查材料
2014/08/22 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
大学副班长竞选稿
2015/11/21 职场文书
Apache POI的基本使用详解
2021/11/07 Servers
Python  lambda匿名函数和三元运算符
2022/04/19 Python
python单向链表实例详解
2022/05/25 Python