From 1821f63c44782c789ccee78ec5ba3e3bc5e3794b Mon Sep 17 00:00:00 2001 From: jndaniels Date: Tue, 26 Nov 2024 22:16:21 -0600 Subject: [PATCH] refactored the js scripts. better now. TODO: save PDF or save pdfByte data on file or DB --- public/ERTSQlite.db | Bin 69632 -> 69632 bytes public/PDF/testpdf.pdf | Bin 12408 -> 26478 bytes public/dmxAppConnect/config.js | 9 +++ public/js/libProcessScript.js | 123 +++++++++++++++++++++++++++++++++ public/js/libSavePDFbytes.js | 2 + views/observationPage.ejs | 14 +++- 6 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 public/js/libProcessScript.js create mode 100644 public/js/libSavePDFbytes.js diff --git a/public/ERTSQlite.db b/public/ERTSQlite.db index 9e8cd404e3ebae0feea1cccfffd447376c37ce0e..6ea19b6f395b6f6e8f7fda3cdbc113fbb1c17630 100644 GIT binary patch delta 28 kcmZozz|ydQWr8&0hKVxHj2kv4ERkns=R3QZUE$|@0Fwp^!2kdN delta 28 kcmZozz|ydQWr8&0`iU~mjO#ZhERkpC;9I(xUE$|@0FnI)m;e9( diff --git a/public/PDF/testpdf.pdf b/public/PDF/testpdf.pdf index 3c52035122c5f564c1d4ea94afa1eab9574eeb4c..d6d97f5e610ad67a131e69e00996477acb496989 100644 GIT binary patch delta 10246 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 Oq_}_oiU}i2ivJI8Olt=K delta 8 PcmaENj`2srh6)1!7N`Vn diff --git a/public/dmxAppConnect/config.js b/public/dmxAppConnect/config.js index dd85b7b..62003a9 100644 --- a/public/dmxAppConnect/config.js +++ b/public/dmxAppConnect/config.js @@ -35,6 +35,15 @@ dmx.config({ } ], "local": {} + }, + "processPDF": { + "meta": [ + { + "name": "PDFprocess", + "type": "text" + } + ], + "local": {} } }, "index": { diff --git a/public/js/libProcessScript.js b/public/js/libProcessScript.js new file mode 100644 index 0000000..9739c0c --- /dev/null +++ b/public/js/libProcessScript.js @@ -0,0 +1,123 @@ +// JavaScript Document +// Replaces libPDFscripts.js +// NEW - Process Scripts + +// Utility to fetch PDF bytes + +//const path = FileSystemHandle.require('node:path') + +let showLog = true; +const dd = createDebugLogger(showLog, "dd"); + +function createDebugLogger(debug, prefix = "") { + return function (message, ...optionalParams) { + if (debug) { + console.log( + `[${prefix}]`.toUpperCase(), `${message}`, + ...optionalParams + ); + } + }; +} +async function fetchPdfBytes(filePath) { + dd(filePath); + + try { + const response = await fetch(filePath); + if (!response.ok) throw new Error(`Failed to fetch PDF from ${filePath}`); + return await response.arrayBuffer(); + } catch (err) { + console.error("Error fetching PDF bytes:", err); + throw err; + } +} + +// Update form fields in the PDF +async function updatePdfFields( + pdfBytes, + dataSources, + skipMissingFields = true +) { + try { + const pdfDoc = await PDFLib.PDFDocument.load(pdfBytes); + const form = pdfDoc.getForm(); + + dataSources.forEach((dataSource) => { + dataSource.forEach((record) => { + Object.entries(record).forEach(([fieldName, fieldValue]) => { + try { + const formField = form.getTextField(fieldName); + if (formField) { + dd(fieldName, "-->", fieldValue); + formField.setText(String(fieldValue)); + } else if (!skipMissingFields) { + console.warn(`Field "${fieldName}" not found.`); + } + } catch (err) { + console.error(`Error updating field "${fieldName}":`, err); + } + }); + }); + }); + + return await pdfDoc.save(); + } catch (err) { + console.error("Error updating PDF fields:", err); + throw err; + } +} + +// Function to trigger download of the updated PDF +function downloadPdf(pdfBytes, fileName) { + const blob = new Blob([pdfBytes], { type: "application/pdf" }); + const url = URL.createObjectURL(blob); + + const link = Object.assign(document.createElement("a"), { + href: url, + download: fileName, + }); + + link.click(); + URL.revokeObjectURL(url); // Clean up the URL immediately +} + +function generateRandomFilename(length = 8, prefix = "", suffix = "") { + const characters = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + const array = Array.from({ length }, () => + characters.charAt(Math.floor(Math.random() * characters.length)) + ); + const filename = `${prefix}${array.join("")}${suffix}`; + + dd("Random Filename:", filename); + return filename; +} + +// Example Usage: + +// Wrapper function to fetch, update, and download PDF +async function processAndDownloadPdf(filePath, ...dataSources) { + try { + const pdfBytes = await fetchPdfBytes(filePath); + const updatedPdfBytes = await updatePdfFields(pdfBytes, dataSources); + const fileName = generateRandomFilename(8, "ERT_", ".pdf"); + //const saveFilePath = await savePdfToFile(pdfBytes); + //dd("[PDF PATH]", saveFilePath); + downloadPdf(updatedPdfBytes, fileName); + } catch (err) { + console.error("Error processing the PDF:", err); + } +} + + +async function savePdfToFile(pdfBytes) { + const randomFilename = generateRandomFilename(12, "", ".pdf"); + File.path; + const filePath = Filehandle.path.join(__dirname, "PDF", randomFilename); + dd("[SAVE TO DISK]", randomFilename); + // Save the file to disk + await fs.writeFile(filePath, Buffer.from(pdfBytes)); + + // Return a URL or file path based on your server setup + return `/PDF/${randomFilename}`; +} diff --git a/public/js/libSavePDFbytes.js b/public/js/libSavePDFbytes.js new file mode 100644 index 0000000..aff3cd5 --- /dev/null +++ b/public/js/libSavePDFbytes.js @@ -0,0 +1,2 @@ +// JavaScript Document + diff --git a/views/observationPage.ejs b/views/observationPage.ejs index 3194dd5..4574650 100644 --- a/views/observationPage.ejs +++ b/views/observationPage.ejs @@ -48,6 +48,15 @@ args: ["/PDF/testpdf.pdf", "{{datastore1.data}}", "{{data_view1.data}}"] } } +