diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..93f1361 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +node_modules +npm-debug.log diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1ca9571 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +npm-debug.log diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f8f8f6c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +FROM node:boron + +RUN apt-get update && apt-get install -y pdftk + +# Create app directory +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app + +# Install app dependencies +COPY package.json /usr/src/app/ +RUN npm install + +# Bundle app source +COPY . /usr/src/app + +EXPOSE 8080 +CMD [ "npm", "start" ] diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..3be04b9 --- /dev/null +++ b/Readme.md @@ -0,0 +1 @@ +docker build --rm -t docker-node-pdftk . diff --git a/package.json b/package.json new file mode 100644 index 0000000..e100780 --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "docker_node_pdftk_waterstamper", + "version": "1.0.0", + "description": "pdftk based PDF waterstamper served over nodejs", + "author": "Paul Visco ", + "main": "server.js", + "scripts": { + "start": "node server.js" + }, + "dependencies": { + "express": "^4.13.3", + "node-uuid": "^1.4.7", + "fs-extra" : "^1.0", + "connect-busboy" : "^0.0.2" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..195afa7 --- /dev/null +++ b/server.js @@ -0,0 +1,103 @@ +const express = require('express'); //Express Web Server +const busboy = require('connect-busboy'); //middleware for form/file upload +const path = require('path'); //used for file path +const fs = require('fs-extra'); //File System - for file manipulation +var uuid = require('node-uuid'); +var exec = require('child_process').exec; + +const PORT = 8080; + +var deleteFolderRecursive = function(path) { + if( fs.existsSync(path) ) { + fs.readdirSync(path).forEach(function(file,index){ + var curPath = path + "/" + file; + if(fs.lstatSync(curPath).isDirectory()) { // recurse + deleteFolderRecursive(curPath); + } else { // delete file + fs.unlinkSync(curPath); + } + }); + fs.rmdirSync(path); + } +}; + +var app = express(); +app.use(busboy()); + +app.get('/', function (req, res) { + res.send('

Instructions

In order to watermark a pdf send two PDF files to /upload, one with fieldname watermark and one with fieldname pdf-to-watermark. The watermark pdf will get stamped on each page of the pdf-to-watermark pdf and the resulting PDF streamed back.

curl -i -F "watermark=@watermark.pdf" -F "pdf-to-watermark=@my.pdf" http://localhost:'+PORT+'/watermark > watermarked.pdf
\n'); +}); + +/* ========================================================== +Create a Route (/watermark) to handle the upload +(handle POST requests to /upload) +Express v4 Route definition +============================================================ */ +app.route('/watermark') + .post(function (req, res, next) { + + var fstream; + var watermark,pdftowatermark; + req.pipe(req.busboy); + let tempdir = '/tmp/' + uuid.v4() + fs.mkdir(tempdir); + + req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { + file.on('data', function(){ + // got a chunk of file + }); + let localpath = tempdir+"/"+fieldname+'.pdf'; + fstream = fs.createWriteStream(localpath); + file.pipe(fstream); + + fstream.on('close', function () { + console.log('Uploaded File: ' + filename); + + if(fieldname == "pdf-to-watermark"){ + pdftowatermark = localpath; + } + + if(fieldname == "watermark"){ + watermark = localpath; + } + + if(watermark && pdftowatermark){ + let output_pdf = tempdir+'/output.pdf'; + + let cmd = "pdftk "+pdftowatermark+" multistamp "+watermark+" output "+output_pdf; + console.log('Running Command: ' + filename); + res.setHeader('Cmd', cmd); + + exec(cmd, function (error, stdout, stderr) { + if(error){ + console.error("Error Processing: "+output_pdf); + res.status(500); + res.send('Could not convert PDF'); + } else { + + let stat = fs.statSync(output_pdf); + console.error("File Saved and Streaming: "+output_pdf); + res.writeHead(200, { + 'Content-Type': 'application/pdf', + 'Content-Length': stat.size + }); + + var readStream = fs.createReadStream(output_pdf); + readStream.pipe(res); + + exec('rm -rf ' + tempdir, function (err, stdout, stderr) { + if(err){ + console.error("Could not delete "+tempdir); + } else { + console.log("Deleted "+tempdir); + } + }); + } + }); + } + }); + }); + }); + +app.listen(PORT); +console.log('Running on http://localhost:' + PORT);