235 lines
7.5 KiB
JavaScript
235 lines
7.5 KiB
JavaScript
// JavaScript Document
|
|
// Replaces libPDFscripts.js
|
|
// NEW - Process Scripts
|
|
//
|
|
// ** OFFICIAL SCRIPT TO USE WHEN IN PRODUCTION
|
|
//
|
|
// Function to add Authenticator validation https://www.npmjs.com/package/speakeasy
|
|
// Utility to fetch PDF bytes
|
|
|
|
|
|
console.log("LIBRARY: libProcessScript.js")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const dd = createDebugLogger(true, "dd"); // code function at bottom of the page
|
|
|
|
|
|
|
|
// Wrapper function to fetch, update, and download PDF
|
|
async function processAndDownloadPdf(filePath, ...dataSources) {
|
|
|
|
dd(`Loaded PDF Template: ${filePath.value}`)
|
|
|
|
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) {
|
|
dd("Error Processing PDF", err)
|
|
//console.error("Error processing the PDF:", err);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
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
|
|
) {
|
|
console.log("Datasource size:", dataSources.length)
|
|
try {
|
|
const pdfDoc = await PDFLib.PDFDocument.load(pdfBytes);
|
|
const form = pdfDoc.getForm();
|
|
|
|
dataSources.forEach((dataSource) => {
|
|
console.log("Current Datasource", dataSource)
|
|
dataSource.forEach((record) => {
|
|
|
|
console.log("Working in: ", record)
|
|
Object.entries(record).forEach(([fieldName, fieldValue]) => {
|
|
dd(`Field: ${fieldName} Value: ${fieldValue}`) //debugger
|
|
try {
|
|
const formField = form.getTextField(fieldName);
|
|
if (formField) {
|
|
// console.info(`Field "${fieldName}" OK`);
|
|
dd(`${fieldName} --> ${fieldValue} OK`);
|
|
formField.setText(String(fieldValue));
|
|
} else if (!skipMissingFields) {
|
|
//dd(`Skipping Field: ${fieldName} NOT FOUND`)
|
|
console.warn(`Field "${fieldName}" not found.`);
|
|
}
|
|
} catch (err) {
|
|
console.error(`Error updating field "${fieldName}":`); //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:
|
|
|
|
|
|
|
|
|
|
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}`;
|
|
}
|
|
|
|
function createDebugLogger(debug, prefix = "DD") {
|
|
|
|
|
|
return function (message, ...optionalParams) {
|
|
|
|
switch (debug) {
|
|
case true:
|
|
console.log(
|
|
`[${prefix}]`.toUpperCase(), `${message}`, ...optionalParams);
|
|
break
|
|
}
|
|
};
|
|
}
|
|
|
|
|
|
function saveSignature_OFF() { //Testing a new function under dummyfunctions section
|
|
const canvas = document.getElementById('signatureCanvas');
|
|
const imageData = canvas.toDataURL('image/png');
|
|
dd(imageData.length)
|
|
// Trigger the server action and handle the response
|
|
dmx.parse('serverconnect_sign.load({imageData: "' + imageData + '"})');
|
|
//dmx.parse('serverconnect_sign.load({ image: imageData })');
|
|
/**
|
|
dmx.parse('serverconnect_sign.load', { image: imageData }).then((response) => {
|
|
//dmx.parse('serverconnect_sign.load({image: "' + imageData + '"})').then((response) => {
|
|
const uploadedSignature = document.getElementById('uploadedSignature');
|
|
uploadedSignature.src = response.fileUrl; // Use the file path returned from the server
|
|
dd(response.fileUrl)
|
|
}).catch((error) => {
|
|
console.error("Error uploading signature:", error);
|
|
});
|
|
*/
|
|
}
|
|
|
|
|
|
// ************** DUMMY TEST FUNCTIONS BELOW ****************** //
|
|
|
|
function runMyFunction() {
|
|
// alert("function run")
|
|
let result = generateRandomIdentifier(9);
|
|
// Use Wappler dmx.set to bind result to a Wappler variable if needed
|
|
//<p>{{myResult}}</p>
|
|
console.log(result)
|
|
dmx.global.set('myResult', result);
|
|
|
|
}
|
|
|
|
function generateRandomIdentifier(v) {
|
|
return generateRandomFilename(v)
|
|
}
|
|
|
|
|
|
function saveSignature() {
|
|
const canvas = document.getElementById('signatureCanvas');
|
|
const imageData = canvas.toDataURL('image/png'); // Convert the canvas to a Base64 image string
|
|
dd("Got Signature:", imageData)
|
|
|
|
dmx.parse('serverconnect_sign.load({image: "' + imageData + '"})').then((response) => {
|
|
const uploadedSignature = document.getElementById('uploadedSignature');
|
|
dd(uploadedSignature)
|
|
dd("Response:", response.fileUrl)
|
|
uploadedSignature.src = response.fileUrl; // Set the uploaded file URL to the image element
|
|
|
|
}).catch((error) => {
|
|
console.error("Error uploading signature:", error);
|
|
});
|
|
}
|
|
|
|
function saveSignatureAsBase64() {
|
|
//const canvas = document.getElementById('signatureCanvas');
|
|
|
|
return document.getElementById('signatureCanvas').toDataURL('image/png'); // Get the Base64 string
|
|
|
|
}
|
|
|
|
function getSignatureData() {
|
|
dmx.global.set('signatureDataEncoded', saveSignatureAsBase64())
|
|
dd('SignatureData:', saveSignatureAsBase64())
|
|
}
|
|
|
|
function saveSignatureNew() {
|
|
const canvas = document.getElementById('signatureCanvas');
|
|
const imageData = canvas.toDataURL('image/png'); // Convert the canvas to a Base64 image string
|
|
dd("Got Signature:", imageData)
|
|
dmx.app.data.content.serverconnect_sign.__load({ imageData: imageData }).then((response) => {
|
|
dd("Success:", response);
|
|
const uploadedSignature = document.getElementById('uploadedSignature');
|
|
dd(uploadedSignature, "Response:", response.fileUrl)
|
|
uploadedSignature.src = response.fileUrl; // Set the uploaded file URL to the image element
|
|
}).catch((error) => {
|
|
console.error("Error:", error);
|
|
});
|
|
}
|
|
|