UNPKG

hpdf

Version:

NodeJS library for generation PDF from HTML

124 lines 3.98 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PdfGenerator = void 0; const generic_pool_1 = require("generic-pool"); const puppeteer_1 = __importDefault(require("puppeteer")); class PageFactory { constructor(puppeteerArgs) { this.puppeteerArgs = puppeteerArgs; } async create() { const browser = await puppeteer_1.default.launch({ headless: 'new', args: this.puppeteerArgs || ['--no-sandbox', '--disable-setuid-sandbox'], }); return { browser, page: await browser.newPage(), }; } async destroy(client) { try { if (client.browser.isConnected()) { await client.browser.close(); } } catch { return; } } async validate(client) { try { return !!(await client.page.metrics()); } catch { return false; } } } class PdfGenerator { /** * @param poolConfig https://github.com/coopernurse/node-pool/blob/1c5cb79dcbea27c4b1839bd75bfc41274adb8b94/lib/PoolOptions.js#L5 * @param puppeteerArgs https://peter.sh/experiments/chromium-command-line-switches/ */ constructor(poolConfig = { min: 1, max: 10 }, puppeteerArgs) { this.pagesPool = (0, generic_pool_1.createPool)(new PageFactory(puppeteerArgs), { testOnBorrow: true, evictionRunIntervalMillis: 5000, ...poolConfig, autostart: true, }); } async stop() { await this.pagesPool.drain(); await this.pagesPool.clear(); } async awaitPool() { return this.pagesPool.ready(); } async generatePDF(htmlOrUrl, stream = false, pdfOptions) { const page = await this.pagesPool.acquire(); try { if (htmlOrUrl instanceof URL) { await page.page.goto(htmlOrUrl.toString(), { waitUntil: 'networkidle0', }); } else { await page.page.setContent(htmlOrUrl, { waitUntil: 'networkidle0' }); } //To reflect CSS used for screens instead of print await page.page.emulateMediaType('print'); } catch (e) { await this.pagesPool.release(page); throw e; } const options = pdfOptions || { margin: { top: '100px', right: '50px', bottom: '100px', left: '50px' }, format: 'A4', }; if (!stream) { try { const res = await page.page.pdf(options); await this.pagesPool.release(page); return res; } catch (e) { await this.pagesPool.destroy(page); throw e; } } try { let released = false; return (await page.page.createPDFStream(options)) .once('error', () => { if (!released) { released = true; this.pagesPool.destroy(page).catch(() => undefined); } }) .once('close', () => { if (!released) { released = true; this.pagesPool.release(page).catch(() => undefined); } }) .once('end', () => { if (!released) { released = true; this.pagesPool.release(page).catch(() => undefined); } }); } catch (e) { await this.pagesPool.destroy(page).catch(() => undefined); throw e; } } } exports.PdfGenerator = PdfGenerator; //# sourceMappingURL=index.js.map