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之十 事件模块概述
Jun 27 Javascript
jquery中EasyUI实现异步树
Mar 01 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
Aug 15 Javascript
js实现的奥运倒计时时钟效果代码
Dec 09 Javascript
jquery zTree异步加载简单实例讲解
Feb 25 Javascript
JS实现超简单的汉字转拼音功能示例
Dec 22 Javascript
微信小程序 上传头像的实例详解
Oct 27 Javascript
Angular实现下拉框模糊查询功能示例
Jan 03 Javascript
vue中实现methods一个方法调用另外一个方法
Feb 08 Javascript
js中Object.defineProperty()方法的不详解
Jul 09 Javascript
详解vue开发中调用微信jssdk的问题
Apr 16 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
Jul 21 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的五种设计模式
2012/09/05 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
PHP 实现缩略图
2021/03/09 PHP
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
jquery统计输入文字的个数并对其进行判断
2014/01/07 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
vue form check 表单验证的实现代码
2018/12/09 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
将Python代码打包为jar软件的简单方法
2015/08/04 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
Python三种遍历文件目录的方法实例代码
2018/01/19 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
如何理解Python中的变量
2020/06/01 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
土木工程毕业生自荐信
2013/09/21 职场文书
冰淇淋店创业计划书范文
2013/12/27 职场文书
费用会计岗位职责
2014/01/01 职场文书
《白鹅》教学反思
2014/04/13 职场文书
上班离岗检讨书
2014/09/10 职场文书
财会专业大学生求职信
2014/09/26 职场文书
大学教师个人总结
2015/02/10 职场文书
2015年卫生院健康教育工作总结
2015/07/24 职场文书
家属联谊会致辞
2015/07/31 职场文书
golang协程池模拟实现群发邮件功能
2021/05/02 Golang
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby