From acda1e4dd8ec3e8d4c0924578504da32c770afe2 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Thu, 4 May 2023 23:19:05 +0100 Subject: [PATCH] flatten pdf --- .../static/js/local-pdf-input-download.js | 47 +++++ .../resources/templates/fragments/common.html | 190 +++++++++--------- .../resources/templates/other/flatten.html | 57 ++++++ src/main/resources/templates/sign.html | 46 ++++- 4 files changed, 243 insertions(+), 97 deletions(-) create mode 100644 src/main/resources/static/js/local-pdf-input-download.js create mode 100644 src/main/resources/templates/other/flatten.html diff --git a/src/main/resources/static/js/local-pdf-input-download.js b/src/main/resources/static/js/local-pdf-input-download.js new file mode 100644 index 00000000..37090390 --- /dev/null +++ b/src/main/resources/static/js/local-pdf-input-download.js @@ -0,0 +1,47 @@ +async function downloadFilesWithCallback(processFileCallback) { + const fileInput = document.querySelector('input[type="file"]'); + const files = fileInput.files; + + const zipThreshold = 4; + const zipFiles = files.length > zipThreshold; + + let jszip = null; + if (zipFiles) { + jszip = new JSZip(); + } + + const promises = Array.from(files).map(async file => { + const { processedData, fileName } = await processFileCallback(file); + + if (zipFiles) { + jszip.file(fileName, processedData); + } else { + const url = URL.createObjectURL(processedData); + const downloadOption = localStorage.getItem('downloadOption'); + + if (downloadOption === 'sameWindow') { + window.location.href = url; + } else if (downloadOption === 'newWindow') { + window.open(url, '_blank'); + } else { + const downloadLink = document.createElement('a'); + downloadLink.href = url; + downloadLink.download = fileName; + downloadLink.click(); + } + } + }); + + await Promise.all(promises); + + if (zipFiles) { + const content = await jszip.generateAsync({ type: "blob" }); + const url = URL.createObjectURL(content); + const a = document.createElement('a'); + a.href = url; + a.download = "files.zip"; + document.body.appendChild(a); + a.click(); + a.remove(); + } +} diff --git a/src/main/resources/templates/fragments/common.html b/src/main/resources/templates/fragments/common.html index 80db8871..6ae7fdef 100644 --- a/src/main/resources/templates/fragments/common.html +++ b/src/main/resources/templates/fragments/common.html @@ -205,7 +205,7 @@ document.addEventListener("DOMContentLoaded", function () { - + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/sign.html b/src/main/resources/templates/sign.html index cc9d2dfc..3ef8ef89 100644 --- a/src/main/resources/templates/sign.html +++ b/src/main/resources/templates/sign.html @@ -60,8 +60,11 @@
+ + +
@@ -72,7 +75,11 @@ - + + +
@@ -89,6 +96,7 @@ document.addEventListener('DOMContentLoaded', () => { const pdfUpload = document.querySelector('input[name=pdf-upload]'); const signatureUpload = document.querySelector('input[name=signature-upload]'); + const signatureTextInput = document.querySelector('input[name=signatureTextInput]'); const pdfCanvas = document.getElementById('pdf-canvas'); const signatureCanvas = document.getElementById('signature-canvas'); const downloadPdfBtn = document.getElementById('download-pdf'); @@ -124,17 +132,44 @@ signaturePad.clear(); }); - $("input[name=signature-type]").change(function() { - const drawSignatureInput = document.getElementById('draw-signature'); - signaturePadContainer.style.display = drawSignatureInput.checked ? 'block' : 'none'; - document.querySelector('input[name=signature-upload]').closest(".custom-file-chooser").style.display = drawSignatureInput.checked ? 'none' : 'block'; + $("input[name=signature-type]").change(function () { + const drawSignatureInput = document.getElementById("draw-signature"); + const generateSignatureInput = document.getElementById("generate-signature"); + const importImageInputContainer = document.querySelector("input[name=signature-upload]").closest(".custom-file-chooser"); + signaturePadContainer.style.display = drawSignatureInput.checked ? "block" : "none"; + importImageInputContainer.style.display = drawSignatureInput.checked ? "none" : (generateSignatureInput.checked ? "none" : "block"); + document.getElementById("signature-text-input-container").style.display = generateSignatureInput.checked ? "block" : "none"; if (drawSignatureInput.checked) { populateSignatureFromPad(); + } else if (generateSignatureInput.checked) { + populateSignatureFromText(); } else { populateSignatureFromFileUpload(); } }); + + + function populateSignatureFromText() { + const signatureText = document.getElementById("signature-text-input").value; + if (!signatureText) return; + + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + ctx.font = "32px Arial"; + const textMetrics = ctx.measureText(signatureText); + + canvas.width = textMetrics.width; + canvas.height = parseInt(ctx.font, 10); + + ctx.fillStyle = "black"; + ctx.font = "32px Arial"; + ctx.fillText(signatureText, 0, canvas.height * 0.8); + + const dataURL = canvas.toDataURL(); + populateSignature(dataURL); + } + function populateSignature(imgUrl) { const img = new Image(); @@ -184,6 +219,7 @@ populateSignature(dataURL); } signatureUpload.addEventListener('change', populateSignatureFromFileUpload); + signatureTextInput.addEventListener('change', populateSignatureFromText); saveSignatureBtn.addEventListener('click', populateSignatureFromPad);