diff --git a/Rev1/node/package-lock.json b/Rev1/node/package-lock.json index d047bc6..66f35ec 100644 --- a/Rev1/node/package-lock.json +++ b/Rev1/node/package-lock.json @@ -13,6 +13,7 @@ "express-fileupload": "^1.4.0", "fs": "^0.0.1-security", "multer": "^1.4.5-lts.1", + "pdf-lib": "^1.17.1", "pug": "^3.0.2", "xterm": "^4.18.0" }, @@ -51,6 +52,22 @@ "node": ">=6.9.0" } }, + "node_modules/@pdf-lib/standard-fonts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", + "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", + "dependencies": { + "pako": "^1.0.6" + } + }, + "node_modules/@pdf-lib/upng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "dependencies": { + "pako": "^1.0.10" + } + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -1558,6 +1575,11 @@ "semver": "bin/semver.js" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1576,6 +1598,17 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/pdf-lib": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", + "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "dependencies": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + } + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2168,6 +2201,11 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -2426,6 +2464,22 @@ "to-fast-properties": "^2.0.0" } }, + "@pdf-lib/standard-fonts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", + "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", + "requires": { + "pako": "^1.0.6" + } + }, + "@pdf-lib/upng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "requires": { + "pako": "^1.0.10" + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -3580,6 +3634,11 @@ } } }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -3595,6 +3654,17 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "pdf-lib": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", + "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "requires": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + } + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -4083,6 +4153,11 @@ "nopt": "~1.0.10" } }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", diff --git a/Rev1/node/package.json b/Rev1/node/package.json index 84c5f8a..951c521 100644 --- a/Rev1/node/package.json +++ b/Rev1/node/package.json @@ -14,6 +14,7 @@ "express-fileupload": "^1.4.0", "fs": "^0.0.1-security", "multer": "^1.4.5-lts.1", + "pdf-lib": "^1.17.1", "pug": "^3.0.2", "xterm": "^4.18.0" }, diff --git a/Rev1/node/public/img/imza.png b/Rev1/node/public/img/imza.png new file mode 100644 index 0000000..51065f6 Binary files /dev/null and b/Rev1/node/public/img/imza.png differ diff --git a/Rev1/node/uploads/converted/fax.odg b/Rev1/node/public/img/kase.png similarity index 70% rename from Rev1/node/uploads/converted/fax.odg rename to Rev1/node/public/img/kase.png index c8f9a47..8065346 100644 Binary files a/Rev1/node/uploads/converted/fax.odg and b/Rev1/node/public/img/kase.png differ diff --git a/Rev1/node/public/upload/converted/2141915A-PI Hong Kong.pdf b/Rev1/node/public/upload/converted/2141915A-PI Hong Kong.pdf deleted file mode 100644 index 339debd..0000000 Binary files a/Rev1/node/public/upload/converted/2141915A-PI Hong Kong.pdf and /dev/null differ diff --git a/Rev1/node/routes/invoice_sign.js b/Rev1/node/routes/invoice_sign.js index 29aa057..44107a7 100644 --- a/Rev1/node/routes/invoice_sign.js +++ b/Rev1/node/routes/invoice_sign.js @@ -1,26 +1,79 @@ const express = require("express"); const router = express.Router(); const fs = require("fs"); +const path = require("path"); const lastFilesDir = "./public/upload/converted/"; - +const rawDir = "./public/upload/raw/"; const renderPageName = "invoice_sign"; +const getMostRecentFile = (dir) => { + const files = orderReccentFiles(dir); + return files.length ? files[0] : undefined; +}; + +const orderReccentFiles = (dir) => { + return fs + .readdirSync(dir) + .filter((file) => fs.lstatSync(path.join(dir, file)).isFile()) + .map((file) => ({ file, mtime: fs.lstatSync(path.join(dir, file)).mtime })) + .sort((a, b) => b.mtime.getTime() - a.mtime.getTime()); +}; + +const { PDFDocument } = require("pdf-lib"); + +const signDir = "./public/img/imza.png"; +const signPDF = async (sourceFile) => { + // Fetch PNG image + const pngUrl = signDir; + const pngImageBytes = fs.readFileSync(signDir); + const pBytes = fs.readFileSync(rawDir + sourceFile); + const pdfDoc = await PDFDocument.load(pBytes); + + // Embed the JPG image bytes and PNG image bytes + const pngImage = await pdfDoc.embedPng(pngImageBytes); + + // Get the width/height of the PNG image scaled down to 50% of its original size + const pngDims = pngImage.scale(0.1); + + // Add a blank page to the document + const pages = pdfDoc.getPages(); + + // Draw the PNG image near the lower right corner of the JPG image + page = pages[0]; + page.drawImage(pngImage, { + x: page.getWidth() / 2 - pngDims.width / 2 + 75, + y: page.getHeight() / 2 - pngDims.height, + width: pngDims.width, + height: pngDims.height, + }); + + // Serialize the PDFDocument to bytes (a Uint8Array) + const pdfBytes = await pdfDoc.save(); + fs.writeFileSync(lastFilesDir + sourceFile, await pdfDoc.save()); + return pdfBytes; +}; + // load the page router.get("/", function (req, res) { let lastFiles = []; if (!fs.existsSync(lastFilesDir)) { fs.mkdirSync(lastFilesDir); } - const dir = fs.opendirSync(lastFilesDir); - let entity; - while ((entity = dir.readSync()) !== null) { - if (entity.isFile()) { - lastFiles.push({ type: "f", name: entity.name }); - } else if (entity.isDirectory()) { - lastFiles.push({ type: "d", name: entity.name }); + // const dir = fs.opendirSync(lastFilesDir); + let filesOrdered = orderReccentFiles(lastFilesDir); + + if (filesOrdered.length > 5) { + for (let index = 5; index < filesOrdered.length; index++) { + filePath = lastFilesDir + filesOrdered[index].file; + fs.unlinkSync(filePath); } } + filesOrdered = orderReccentFiles(lastFilesDir); + for (file of filesOrdered) { + lastFiles.push({ type: "f", name: file.file }); + } + // lastFiles.push({ type: "f", name: getMostRecentFile(lastFilesDir).file }); res.render(renderPageName, { lastFiles }); }); //Post the upload file @@ -35,7 +88,7 @@ router.post("/", function (req, res) { console.log(uploadedFile); // Upload path - const uploadPath = lastFilesDir; + const uploadPath = rawDir; if (!fs.existsSync(uploadPath)) { fs.mkdirSync(uploadPath); } @@ -44,20 +97,18 @@ router.post("/", function (req, res) { if (err) { console.log(err); res.send("Failed !!"); - } else res.send("Successfully Uploaded !!"); + } + // res.send("Successfully Uploaded !!"); + else { + signPDF(uploadedFile.name); + res.redirect(renderPageName); + } }); } else res.send("No file uploaded !!"); }); // To handle the download file request router.get("/download", function (req, res) { - // The res.download() talking file path to be downloaded - // console.log(req); - // res.download(__dirname + "/uploads/fax.odg", function (err) { - // if (err) { - // console.log(err); - // } - // }); const downloadFile = lastFilesDir + req.query.downloadFile; console.log(downloadFile); res.download(downloadFile, function (err) {}); diff --git a/Rev1/node/uploads/2141915A-PI Hong Kong.pdf b/Rev1/node/uploads/2141915A-PI Hong Kong.pdf deleted file mode 100644 index 339debd..0000000 Binary files a/Rev1/node/uploads/2141915A-PI Hong Kong.pdf and /dev/null differ diff --git a/Rev1/node/uploads/IleriGirisimciDestekProgramiIsModeli.doc b/Rev1/node/uploads/IleriGirisimciDestekProgramiIsModeli.doc deleted file mode 100644 index db68cc7..0000000 Binary files a/Rev1/node/uploads/IleriGirisimciDestekProgramiIsModeli.doc and /dev/null differ diff --git a/Rev1/node/uploads/PickAndPlace_PCB_STM32 PLC_panel_2021-11-18.csv b/Rev1/node/uploads/PickAndPlace_PCB_STM32 PLC_panel_2021-11-18.csv deleted file mode 100644 index 56b1887..0000000 Binary files a/Rev1/node/uploads/PickAndPlace_PCB_STM32 PLC_panel_2021-11-18.csv and /dev/null differ diff --git a/Rev1/node/uploads/Tekin abiden b/Rev1/node/uploads/Tekin abiden deleted file mode 100644 index 5651606..0000000 --- a/Rev1/node/uploads/Tekin abiden +++ /dev/null @@ -1,13 +0,0 @@ -demsay -matek -qual - -280 TL ordino -en az 350 TL gümrük -400 TL MNG -350 DHL - -ithalat ID -Ziraatten alınacak - - diff --git a/Rev1/node/uploads/converted/5553953506.pdf b/Rev1/node/uploads/converted/5553953506.pdf deleted file mode 100644 index b1e0907..0000000 Binary files a/Rev1/node/uploads/converted/5553953506.pdf and /dev/null differ diff --git a/Rev1/node/views/invoice_sign.pug b/Rev1/node/views/invoice_sign.pug index d9aac0f..70c7abe 100644 --- a/Rev1/node/views/invoice_sign.pug +++ b/Rev1/node/views/invoice_sign.pug @@ -2,15 +2,12 @@ extends layout.pug block content h1 invoice signer form(method='post', enctype='multipart/form-data') - label(for="file", class="btn") Select Image + label(for="file", class="btn") Select File input(type='file', name='uploadFile') - input(type='submit', name='uploadFile', value='Upload Document') + input(type='submit', name='uploadFile', value='Upload') div - h3 Download Section - form(action='/invoice_sign/download', method='get') - button(type='submit') Download + h3 Last Files ul each file in lastFiles - //- li= file.name form(method='get',action='/invoice_sign/download') input(type='submit', name='downloadFile', value=file.name) \ No newline at end of file diff --git a/Rev1/node/views/layout.pug b/Rev1/node/views/layout.pug index 7625039..00cad94 100644 --- a/Rev1/node/views/layout.pug +++ b/Rev1/node/views/layout.pug @@ -12,4 +12,4 @@ html block content block foot #footer - p some footer content \ No newline at end of file + //- p some footer content \ No newline at end of file