91 lines
2.4 KiB
TypeScript
91 lines
2.4 KiB
TypeScript
import puppeteer, { Browser, Page } from "puppeteer";
|
|
|
|
let browser: Browser | null = null;
|
|
|
|
export async function initBrowser(): Promise<void> {
|
|
browser = await puppeteer.launch({
|
|
headless: true,
|
|
args: ["--no-sandbox", "--disable-setuid-sandbox", "--disable-gpu"],
|
|
});
|
|
console.log("Browser pool ready");
|
|
}
|
|
|
|
export async function closeBrowser(): Promise<void> {
|
|
if (browser) await browser.close();
|
|
}
|
|
|
|
export async function renderPdf(
|
|
html: string,
|
|
options: {
|
|
format?: string;
|
|
landscape?: boolean;
|
|
margin?: { top?: string; right?: string; bottom?: string; left?: string };
|
|
printBackground?: boolean;
|
|
headerTemplate?: string;
|
|
footerTemplate?: string;
|
|
displayHeaderFooter?: boolean;
|
|
} = {}
|
|
): Promise<Buffer> {
|
|
if (!browser) throw new Error("Browser not initialized");
|
|
|
|
const page: Page = await browser.newPage();
|
|
try {
|
|
await page.setContent(html, { waitUntil: "networkidle0", timeout: 15_000 });
|
|
|
|
const pdf = await page.pdf({
|
|
format: (options.format as any) || "A4",
|
|
landscape: options.landscape || false,
|
|
printBackground: options.printBackground !== false,
|
|
margin: options.margin || {
|
|
top: "20mm",
|
|
right: "15mm",
|
|
bottom: "20mm",
|
|
left: "15mm",
|
|
},
|
|
headerTemplate: options.headerTemplate,
|
|
footerTemplate: options.footerTemplate,
|
|
displayHeaderFooter: options.displayHeaderFooter || false,
|
|
});
|
|
|
|
return Buffer.from(pdf);
|
|
} finally {
|
|
await page.close();
|
|
}
|
|
}
|
|
|
|
export async function renderUrlPdf(
|
|
url: string,
|
|
options: {
|
|
format?: string;
|
|
landscape?: boolean;
|
|
margin?: { top?: string; right?: string; bottom?: string; left?: string };
|
|
printBackground?: boolean;
|
|
waitUntil?: string;
|
|
} = {}
|
|
): Promise<Buffer> {
|
|
if (!browser) throw new Error("Browser not initialized");
|
|
|
|
const page: Page = await browser.newPage();
|
|
try {
|
|
await page.goto(url, {
|
|
waitUntil: (options.waitUntil as any) || "networkidle0",
|
|
timeout: 30_000,
|
|
});
|
|
|
|
const pdf = await page.pdf({
|
|
format: (options.format as any) || "A4",
|
|
landscape: options.landscape || false,
|
|
printBackground: options.printBackground !== false,
|
|
margin: options.margin || {
|
|
top: "20mm",
|
|
right: "15mm",
|
|
bottom: "20mm",
|
|
left: "15mm",
|
|
},
|
|
});
|
|
|
|
return Buffer.from(pdf);
|
|
} finally {
|
|
await page.close();
|
|
}
|
|
}
|