docfast/src/services/browser.ts

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();
}
}