DockerERTFF/public/PDF/libPDFscripts.js

102 lines
3.6 KiB
JavaScript

// JavaScript Document
//Use this function as a start - to pass the path, then datasource to update with pdfbytes, then download -- Maybe combine into one file?
//wich is more efficient?
//filepath = /PDF/XXX.pdf, dataSource = datastore.var
// *** Use of 'rest paramater' syntax to add extra datasources at the end.
//return array of datasources i.e [datastore,data_view1] and pass that array to updatePdfFields
//Consider default values = filepath = '/PDF/masterTemplate.pdf'
async function toBase64(filePath, ...dataSources) {
console.log(filePath);
const pdfBytes = await fetch(filePath).then((res) => res.arrayBuffer());
// console.log(dataSources); // should be only 2,
updatePdfFields(pdfBytes, dataSources);
//return pdfBytes
}
async function updatePdfFields(pdfBytes, dataSources) {
// Load the PDF document
console.log("pdfBytes.size =", pdfBytes.byteLength);
console.log(dataSources);
const pdfDoc = await PDFLib.PDFDocument.load(pdfBytes);
const form = pdfDoc.getForm();
// Loop over each data source passed to the function
dataSources.forEach((dataSource) => {
// Loop over each record in the current data source
dataSource.forEach((record) => {
// Loop over each key-value pair in the record
Object.entries(record).forEach(([fieldName, fieldValue]) => {
console.log(fieldName, " => ", fieldValue);
// Find the form field in the PDF by name
/** !!! BLOCK 1 Start
const formField = form.getTextField(fieldName);
// If the field exists in the PDF, update it with the value
if (formField) {
formField.setText(String(fieldValue));
}
**/ // BLOCK 1 END
});
});
});
// Serialize the PDF back to bytes
const updatedPdfBytes = await pdfDoc.save();
// Trigger download of the updated PDF
downloadPdf(updatedPdfBytes, "UpdatedDocument.pdf");
}
// Function to trigger download of the updated PDF
function downloadPdf(pdfBytes, fileName) {
// Create a Blob from the PDF bytes
const blob = new Blob([pdfBytes], { type: "application/pdf" });
const url = URL.createObjectURL(blob);
// Create a link element for the download
const link = document.createElement("a");
link.href = url;
link.download = fileName;
// Append the link to the document, trigger a click, and remove it afterward
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// Release the object URL to free up memory
URL.revokeObjectURL(url);
}
// Usage Example
async function main() {
// Load your PDF as bytes (e.g., using fetch)
const pdfBytes = await fetch("path/to/your.pdf").then((res) =>
res.arrayBuffer()
);
// Sample data sources from Wappler
const dataSource1 = [{ fieldName1: "Value1", fieldName2: "Value2" }];
const dataSource2 = [
{ fieldName3: "AnotherValue1", fieldName4: "AnotherValue2" },
];
// Call the function with multiple data sources
await updatePdfFields(pdfBytes, dataSource1, dataSource2);
}
function generateRandomFilename() {
const characters =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let filename = "";
for (let i = 0; i < 8; i++) {
const randomIndex = Math.floor(Math.random() * characters.length);
filename += characters[randomIndex];
}
console.log("Random Filename: ", filename);
return filename;
}