ff-admin-server/src/helpers/pdfExport.ts

102 lines
3.1 KiB
TypeScript

import puppeteer from "puppeteer";
import { TemplateHelper } from "./templateHelper";
import { PermissionModule } from "../type/permissionTypes";
import { FileSystemHelper } from "./fileSystemHelper";
import { PDFDocument } from "pdf-lib";
export abstract class PdfExport {
static async renderFile({
template,
title = "pdf-export FF Admin",
filename = null,
data = {},
saveToDisk = true,
folder = "",
customTemplate = undefined,
}: {
template: `${PermissionModule}` | `${PermissionModule}.${string}`;
title?: string;
filename?: string;
data?: any;
saveToDisk?: boolean;
folder?: string;
customTemplate?: {
headerId?: number;
footerId?: number;
bodyId?: string | number;
headerHeight: number;
footerHeight: number;
};
}) {
if (folder != "") FileSystemHelper.createFolder(folder);
let header: string, footer: string, body: string, headerMargin: number, footerMargin: number;
if (!customTemplate) {
({ header, footer, body, headerMargin, footerMargin } = await TemplateHelper.renderFileForModule({
module: template,
headerData: data,
bodyData: data,
footerData: data,
title: title,
}));
} else {
({ header, footer, body, headerMargin, footerMargin } = await TemplateHelper.renderFileForCustom({
module: template,
customTemplate,
headerData: data,
bodyData: data,
footerData: data,
title: title,
}));
}
const browser = await puppeteer.launch({
headless: true,
args: ["--no-sandbox", "--disable-gpu", "--disable-setuid-sandbox"],
});
const page = await browser.newPage();
await page.setContent(body, { waitUntil: "domcontentloaded" });
const exportPath = FileSystemHelper.formatPath(folder, `${filename}.pdf`);
let pdf = await page.pdf({
...(saveToDisk ? { path: exportPath } : {}),
format: "A4",
printBackground: false,
margin: {
top: (headerMargin ?? 15) + "mm",
bottom: (footerMargin ?? 15) + "mm",
left: "10mm",
right: "10mm",
},
displayHeaderFooter: true,
headerTemplate: header,
footerTemplate: footer,
});
await browser.close();
return pdf;
}
static async sqashToSingleFile(inputFolder: string, outputFile: string, outputFolder: string = "") {
if (outputFolder != "") FileSystemHelper.createFolder(outputFolder);
let pdfFilePaths = FileSystemHelper.getFilesInDirectory(inputFolder, ".pdf");
if (pdfFilePaths.length == 0) return;
const mergedPdf = await PDFDocument.create();
for (const pdfPath of pdfFilePaths) {
const pdfBytes = FileSystemHelper.readFileasBase64(inputFolder, pdfPath);
const pdf = await PDFDocument.load(pdfBytes);
const copiedPages = await mergedPdf.copyPages(pdf, pdf.getPageIndices());
copiedPages.forEach((page) => mergedPdf.addPage(page));
}
const mergedPdfBytes = await mergedPdf.save();
FileSystemHelper.writeFile(outputFolder, `${outputFile}.pdf`, mergedPdfBytes);
}
}