node.js實現爲PDF添加水印

背景

項目中有用到node作中間層,期間有個爲PDF文件添加水印的需求,網上搜了很多帖子,發現有如下幾點存在的問題。
一、單頁PDF的話,能夠用PNG圖片加到PDF上,可是實際使用狀況就沒那麼理想,必須知足多頁PDF每頁都加上水印的效果方可。
二、中間想過,把PDF轉成圖片,圖片加上水印後再轉回PDF,可是感受中間步驟太麻煩,並且會面臨清晰度降低的可能。
三、Python、Java有相關方案,能夠實現,有想過用node去執行Python腳本去爲PDF加水印,考慮到開發人員都是前端、若是之後須要維護,擴展可能就不是那麼友好了。javascript

解決方案

逛了Github和NPM,發現node-pdftk能夠知足需求,不過得依賴PDFTK這個軟件,進一步瞭解,發現PDFTK支持linux,好,直接用這個開搞。前端

環境

項目部署是用了docker,那就用docker來吧,比較貼合狀況也省事點;若是平時在本身電腦上開發,但須要linux環境的話練手或者模擬服務器環境的話,你們也能夠用一個linux鏡像運行一個dokcer容器,這裏就不贅述了。java

實現

一、app.js

API相對較爲簡單,input方法中咱們輸入源文件,stamp方法中咱們輸入水印文件,out方法中指定保存的路徑,這裏的話咱們起了一個服務,當訪問3100端口的時候就去生成咱們帶水印的PDF。node

'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);

二、dockerfile

FROM node:7.6.0

# 建立工做目錄
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY ./node_modules /usr/src/app/node_modules

# 下載安裝PDFTK
RUN apt-get update
RUN apt-get install -y pdftk

# 使用PM2啓動應用
CMD ["./node_modules/pm2/bin/pm2-docker", "process.yml"]

三、效果

源文件
圖片描述
水印文件
圖片描述
添加水印後
圖片描述linux

四、地址

Github倉庫地址git

相關文章
相關標籤/搜索