hpdf
Version:
NodeJS library for generation PDF from HTML
124 lines • 3.98 kB
JavaScript
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
;