first commit
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* Copyright (c) 2026 Niolla
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is proprietary and confidential.
|
||||
* Unauthorized copying, modification, distribution, or use
|
||||
* of this file, via any medium, is strictly prohibited.
|
||||
*/
|
||||
|
||||
// app/logic/documents/engine/excel.engine.js
|
||||
|
||||
const ExcelJS = require("exceljs");
|
||||
|
||||
const generateExcel = async (builder, data) => {
|
||||
const workbook = new ExcelJS.Workbook();
|
||||
const worksheet = workbook.addWorksheet(builder.sheetName);
|
||||
|
||||
await builder.build(worksheet, data);
|
||||
|
||||
return await workbook.xlsx.writeBuffer();
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
generateExcel,
|
||||
};
|
||||
@@ -0,0 +1,70 @@
|
||||
/**
|
||||
* Copyright (c) 2026 Niolla
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is proprietary and confidential.
|
||||
* Unauthorized copying, modification, distribution, or use
|
||||
* of this file, via any medium, is strictly prohibited.
|
||||
*/
|
||||
|
||||
// app/logic/documents/engine/pdf.engine.js
|
||||
|
||||
const puppeteer = require("puppeteer");
|
||||
|
||||
const generatePDF = async (html) => {
|
||||
const launchConfig = {
|
||||
args: ["--no-sandbox", "--disable-setuid-sandbox"],
|
||||
};
|
||||
|
||||
if (process.env.PUPPETEER_EXECUTABLE_PATH) {
|
||||
launchConfig.executablePath = process.env.PUPPETEER_EXECUTABLE_PATH;
|
||||
} else {
|
||||
launchConfig.headless = true;
|
||||
}
|
||||
|
||||
const browser = await puppeteer.launch(launchConfig);
|
||||
|
||||
try {
|
||||
const page = await browser.newPage();
|
||||
|
||||
await page.setContent(html, {
|
||||
waitUntil: "load",
|
||||
});
|
||||
|
||||
// Wait for fonts
|
||||
await page.evaluate(() => document.fonts?.ready);
|
||||
|
||||
// Wait for images to fully decode
|
||||
await page.evaluate(async () => {
|
||||
const images = Array.from(document.images);
|
||||
|
||||
await Promise.all(
|
||||
images.map((img) => {
|
||||
if (img.complete && img.naturalHeight !== 0) return;
|
||||
|
||||
return new Promise((resolve) => {
|
||||
img.onload = resolve;
|
||||
img.onerror = resolve;
|
||||
});
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
// Force layout + paint
|
||||
await page.evaluate(() => document.body.getBoundingClientRect());
|
||||
|
||||
// Extra stability delay (important on servers)
|
||||
await new Promise((r) => setTimeout(r, 1000));
|
||||
|
||||
const buffer = await page.pdf({
|
||||
format: "A4",
|
||||
printBackground: true,
|
||||
});
|
||||
|
||||
return buffer;
|
||||
} finally {
|
||||
await browser.close();
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = { generatePDF };
|
||||
Reference in New Issue
Block a user