import puppeteer, { Browser, Page } from "puppeteer"; let browser: Browser | null = null; export async function initBrowser(): Promise { const execPath = process.env.PUPPETEER_EXECUTABLE_PATH || undefined; browser = await puppeteer.launch({ headless: true, executablePath: execPath, args: ["--no-sandbox", "--disable-setuid-sandbox", "--disable-gpu", "--disable-dev-shm-usage"], }); 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 }); await page.addStyleTag({ content: "* { margin: 0; padding: 0; } body { margin: 0; }" }); const pdf = await page.pdf({ format: (options.format as any) || "A4", landscape: options.landscape || false, printBackground: options.printBackground !== false, margin: options.margin || { top: "0", right: "0", bottom: "0", left: "0", }, 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: "0", right: "0", bottom: "0", left: "0", }, }); return Buffer.from(pdf); } finally { await page.close(); } }