import puppeteer, { Browser, Page } from "puppeteer"; let browser: Browser | null = null; export async function initBrowser(): Promise { browser = await puppeteer.launch({ headless: true, args: ["--no-sandbox", "--disable-setuid-sandbox", "--disable-gpu"], }); console.log("Browser pool ready"); } export async function closeBrowser(): Promise { 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 { 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 { 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(); } }