pdfile
Version:
PDFile is a Node.js library for generating high-quality, dynamic PDFs using Handlebars templates and Puppeteer. It supports multi-page PDFs and offers full customization. Perfect for web developers, it enables easy creation of multi-page PDFs by simply de
792 lines (783 loc) • 27.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var puppeteer = require('puppeteer');
var hbs = _interopDefault(require('handlebars'));
var fs = require('fs');
var stream = require('stream');
function _asyncIterator(r) {
var n,
t,
o,
e = 2;
for ("undefined" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) {
if (t && null != (n = r[t])) return n.call(r);
if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r));
t = "@@asyncIterator", o = "@@iterator";
}
throw new TypeError("Object is not async iterable");
}
function AsyncFromSyncIterator(r) {
function AsyncFromSyncIteratorContinuation(r) {
if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object."));
var n = r.done;
return Promise.resolve(r.value).then(function (r) {
return {
value: r,
done: n
};
});
}
return AsyncFromSyncIterator = function (r) {
this.s = r, this.n = r.next;
}, AsyncFromSyncIterator.prototype = {
s: null,
n: null,
next: function () {
return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));
},
return: function (r) {
var n = this.s.return;
return void 0 === n ? Promise.resolve({
value: r,
done: !0
}) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));
},
throw: function (r) {
var n = this.s.return;
return void 0 === n ? Promise.reject(r) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));
}
}, new AsyncFromSyncIterator(r);
}
function _regeneratorRuntime() {
_regeneratorRuntime = function () {
return e;
};
var t,
e = {},
r = Object.prototype,
n = r.hasOwnProperty,
o = Object.defineProperty || function (t, e, r) {
t[e] = r.value;
},
i = "function" == typeof Symbol ? Symbol : {},
a = i.iterator || "@@iterator",
c = i.asyncIterator || "@@asyncIterator",
u = i.toStringTag || "@@toStringTag";
function define(t, e, r) {
return Object.defineProperty(t, e, {
value: r,
enumerable: !0,
configurable: !0,
writable: !0
}), t[e];
}
try {
define({}, "");
} catch (t) {
define = function (t, e, r) {
return t[e] = r;
};
}
function wrap(t, e, r, n) {
var i = e && e.prototype instanceof Generator ? e : Generator,
a = Object.create(i.prototype),
c = new Context(n || []);
return o(a, "_invoke", {
value: makeInvokeMethod(t, r, c)
}), a;
}
function tryCatch(t, e, r) {
try {
return {
type: "normal",
arg: t.call(e, r)
};
} catch (t) {
return {
type: "throw",
arg: t
};
}
}
e.wrap = wrap;
var h = "suspendedStart",
l = "suspendedYield",
f = "executing",
s = "completed",
y = {};
function Generator() {}
function GeneratorFunction() {}
function GeneratorFunctionPrototype() {}
var p = {};
define(p, a, function () {
return this;
});
var d = Object.getPrototypeOf,
v = d && d(d(values([])));
v && v !== r && n.call(v, a) && (p = v);
var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);
function defineIteratorMethods(t) {
["next", "throw", "return"].forEach(function (e) {
define(t, e, function (t) {
return this._invoke(e, t);
});
});
}
function AsyncIterator(t, e) {
function invoke(r, o, i, a) {
var c = tryCatch(t[r], t, o);
if ("throw" !== c.type) {
var u = c.arg,
h = u.value;
return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) {
invoke("next", t, i, a);
}, function (t) {
invoke("throw", t, i, a);
}) : e.resolve(h).then(function (t) {
u.value = t, i(u);
}, function (t) {
return invoke("throw", t, i, a);
});
}
a(c.arg);
}
var r;
o(this, "_invoke", {
value: function (t, n) {
function callInvokeWithMethodAndArg() {
return new e(function (e, r) {
invoke(t, n, e, r);
});
}
return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
}
});
}
function makeInvokeMethod(e, r, n) {
var o = h;
return function (i, a) {
if (o === f) throw Error("Generator is already running");
if (o === s) {
if ("throw" === i) throw a;
return {
value: t,
done: !0
};
}
for (n.method = i, n.arg = a;;) {
var c = n.delegate;
if (c) {
var u = maybeInvokeDelegate(c, n);
if (u) {
if (u === y) continue;
return u;
}
}
if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) {
if (o === h) throw o = s, n.arg;
n.dispatchException(n.arg);
} else "return" === n.method && n.abrupt("return", n.arg);
o = f;
var p = tryCatch(e, r, n);
if ("normal" === p.type) {
if (o = n.done ? s : l, p.arg === y) continue;
return {
value: p.arg,
done: n.done
};
}
"throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg);
}
};
}
function maybeInvokeDelegate(e, r) {
var n = r.method,
o = e.iterator[n];
if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y;
var i = tryCatch(o, e.iterator, r.arg);
if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y;
var a = i.arg;
return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y);
}
function pushTryEntry(t) {
var e = {
tryLoc: t[0]
};
1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);
}
function resetTryEntry(t) {
var e = t.completion || {};
e.type = "normal", delete e.arg, t.completion = e;
}
function Context(t) {
this.tryEntries = [{
tryLoc: "root"
}], t.forEach(pushTryEntry, this), this.reset(!0);
}
function values(e) {
if (e || "" === e) {
var r = e[a];
if (r) return r.call(e);
if ("function" == typeof e.next) return e;
if (!isNaN(e.length)) {
var o = -1,
i = function next() {
for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;
return next.value = t, next.done = !0, next;
};
return i.next = i;
}
}
throw new TypeError(typeof e + " is not iterable");
}
return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", {
value: GeneratorFunctionPrototype,
configurable: !0
}), o(GeneratorFunctionPrototype, "constructor", {
value: GeneratorFunction,
configurable: !0
}), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) {
var e = "function" == typeof t && t.constructor;
return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name));
}, e.mark = function (t) {
return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t;
}, e.awrap = function (t) {
return {
__await: t
};
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {
return this;
}), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {
void 0 === i && (i = Promise);
var a = new AsyncIterator(wrap(t, r, n, o), i);
return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {
return t.done ? t.value : a.next();
});
}, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () {
return this;
}), define(g, "toString", function () {
return "[object Generator]";
}), e.keys = function (t) {
var e = Object(t),
r = [];
for (var n in e) r.push(n);
return r.reverse(), function next() {
for (; r.length;) {
var t = r.pop();
if (t in e) return next.value = t, next.done = !1, next;
}
return next.done = !0, next;
};
}, e.values = values, Context.prototype = {
constructor: Context,
reset: function (e) {
if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);
},
stop: function () {
this.done = !0;
var t = this.tryEntries[0].completion;
if ("throw" === t.type) throw t.arg;
return this.rval;
},
dispatchException: function (e) {
if (this.done) throw e;
var r = this;
function handle(n, o) {
return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o;
}
for (var o = this.tryEntries.length - 1; o >= 0; --o) {
var i = this.tryEntries[o],
a = i.completion;
if ("root" === i.tryLoc) return handle("end");
if (i.tryLoc <= this.prev) {
var c = n.call(i, "catchLoc"),
u = n.call(i, "finallyLoc");
if (c && u) {
if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
} else if (c) {
if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
} else {
if (!u) throw Error("try statement without catch or finally");
if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
}
}
}
},
abrupt: function (t, e) {
for (var r = this.tryEntries.length - 1; r >= 0; --r) {
var o = this.tryEntries[r];
if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) {
var i = o;
break;
}
}
i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);
var a = i ? i.completion : {};
return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a);
},
complete: function (t, e) {
if ("throw" === t.type) throw t.arg;
return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y;
},
finish: function (t) {
for (var e = this.tryEntries.length - 1; e >= 0; --e) {
var r = this.tryEntries[e];
if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;
}
},
catch: function (t) {
for (var e = this.tryEntries.length - 1; e >= 0; --e) {
var r = this.tryEntries[e];
if (r.tryLoc === t) {
var n = r.completion;
if ("throw" === n.type) {
var o = n.arg;
resetTryEntry(r);
}
return o;
}
}
throw Error("illegal catch attempt");
},
delegateYield: function (e, r, n) {
return this.delegate = {
iterator: values(e),
resultName: r,
nextLoc: n
}, "next" === this.method && (this.arg = t), y;
}
}, e;
}
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _asyncToGenerator(fn) {
return function () {
var self = this,
args = arguments;
return new Promise(function (resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(undefined);
});
};
}
function _extends() {
_extends = Object.assign ? Object.assign.bind() : function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
var browser;
var createBrowser = /*#__PURE__*/function () {
var _ref = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(puppeteerOptions) {
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (browser) {
_context.next = 4;
break;
}
_context.next = 3;
return puppeteer.launch(_extends({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage']
}, puppeteerOptions));
case 3:
browser = _context.sent;
case 4:
return _context.abrupt("return", browser);
case 5:
case "end":
return _context.stop();
}
}, _callee);
}));
return function createBrowser(_x) {
return _ref.apply(this, arguments);
};
}();
var closeBrowser = /*#__PURE__*/function () {
var _ref2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
if (!browser) {
_context2.next = 4;
break;
}
_context2.next = 3;
return browser.close();
case 3:
browser = null;
case 4:
case "end":
return _context2.stop();
}
}, _callee2);
}));
return function closeBrowser() {
return _ref2.apply(this, arguments);
};
}();
var registerHandlebarsHelpers = function registerHandlebarsHelpers(data, helpers) {
hbs.registerHelper('ifCond', function (v1, operator, v2, options) {
switch (operator) {
case '==':
return v1 == v2 ? options.fn(data) : options.inverse(data);
case '===':
return v1 === v2 ? options.fn(data) : options.inverse(data);
case '!=':
return v1 != v2 ? options.fn(data) : options.inverse(data);
case '!==':
return v1 !== v2 ? options.fn(data) : options.inverse(data);
case '<':
return v1 < v2 ? options.fn(data) : options.inverse(data);
case '<=':
return v1 <= v2 ? options.fn(data) : options.inverse(data);
case '>':
return v1 > v2 ? options.fn(data) : options.inverse(data);
case '>=':
return v1 >= v2 ? options.fn(data) : options.inverse(data);
case '&&':
return v1 && v2 ? options.fn(data) : options.inverse(data);
case '||':
return v1 || v2 ? options.fn(data) : options.inverse(data);
default:
return options.inverse(options);
}
});
if (helpers) {
var parsedHelpers = JSON.parse(helpers);
Object.entries(parsedHelpers).forEach(function (_ref) {
var name = _ref[0],
funcBody = _ref[1];
var helperFunction = new Function("return (" + funcBody + ")")(); // No eval, safer
hbs.registerHelper(name, helperFunction);
});
} else {
// Default helper functions registration
hbs.registerHelper({
eq: function eq(v1, v2) {
return v1 === v2;
},
ne: function ne(v1, v2) {
return v1 !== v2;
},
lt: function lt(v1, v2) {
return v1 < v2;
},
gt: function gt(v1, v2) {
return v1 > v2;
},
lte: function lte(v1, v2) {
return v1 <= v2;
},
gte: function gte(v1, v2) {
return v1 >= v2;
},
and: function and() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return args.every(Boolean);
},
or: function or() {
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
return args.slice(0, -1).some(Boolean);
}
});
}
};
/**
* Generate a PDF from a Handlebars template using Puppeteer.
* @param {string} templateFilePath - The path to the Handlebars template file.
* @param {object[]} dataPerPage - An array containing data objects for each page of the PDF.
* @param {string} pdfFilePath - [Optional] The path where the generated PDF file will be saved. Required, if useStream is not passed or set to false.
* @param {boolean} useStream - [Optional] Setting this to true will return a readable stream of the pdf instead of writing to the disk on the path "pdfFilePath".
* @param {string} [helpersFilePath] - [Optional] The path to a Handlebars helpers file containing custom Handlebars helpers.
* @param {LaunchOptions} [puppeteerOptions] - [Optional] Puppeteer launch options.
* @param {PDFOptions} [pdfOptions] - [Optional] PDF generation options.
* @returns {Promise<string>} A Promise that resolves with the path to the generated PDF file or a readable stream of the pdf if "useStream is set to true".
* @throws {Error} Throws an error if no data is passed to inject into the PDF.
*/
var generatePdf = /*#__PURE__*/function () {
var _ref2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
var templateFilePath, dataPerPage, _ref$pdfFilePath, pdfFilePath, _ref$useStream, useStream, helpersFilePath, puppeteerOptions, pdfOptions, page, browser, helpersStream, helperData, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, chunk, htmlStream, htmlData, _iteratorAbruptCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, _chunk, template, pdfConfig, content, pdfBuffer, _pdfBuffer;
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
templateFilePath = _ref.templateFilePath, dataPerPage = _ref.dataPerPage, _ref$pdfFilePath = _ref.pdfFilePath, pdfFilePath = _ref$pdfFilePath === void 0 ? undefined : _ref$pdfFilePath, _ref$useStream = _ref.useStream, useStream = _ref$useStream === void 0 ? false : _ref$useStream, helpersFilePath = _ref.helpersFilePath, puppeteerOptions = _ref.puppeteerOptions, pdfOptions = _ref.pdfOptions;
page = undefined;
_context.prev = 2;
if (!(!pdfFilePath && !useStream)) {
_context.next = 5;
break;
}
throw new Error('"pdfFilePath" must be specified unless "useStream" is set to true.');
case 5:
if (!(pdfFilePath && useStream)) {
_context.next = 7;
break;
}
throw new Error('Conflicting parameters: "pdfFilePath" and "useStream" cannot both be used simultaneously.');
case 7:
if (!(JSON.stringify(dataPerPage) === '[]')) {
_context.next = 9;
break;
}
throw new Error('No data was passed to inject into PDF');
case 9:
_context.next = 11;
return createBrowser(puppeteerOptions);
case 11:
browser = _context.sent;
if (!helpersFilePath) {
_context.next = 47;
break;
}
helpersStream = fs.createReadStream(helpersFilePath, {
encoding: 'utf8'
});
helperData = '';
_iteratorAbruptCompletion = false;
_didIteratorError = false;
_context.prev = 17;
_iterator = _asyncIterator(helpersStream);
case 19:
_context.next = 21;
return _iterator.next();
case 21:
if (!(_iteratorAbruptCompletion = !(_step = _context.sent).done)) {
_context.next = 27;
break;
}
chunk = _step.value;
helperData += chunk;
case 24:
_iteratorAbruptCompletion = false;
_context.next = 19;
break;
case 27:
_context.next = 33;
break;
case 29:
_context.prev = 29;
_context.t0 = _context["catch"](17);
_didIteratorError = true;
_iteratorError = _context.t0;
case 33:
_context.prev = 33;
_context.prev = 34;
if (!(_iteratorAbruptCompletion && _iterator["return"] != null)) {
_context.next = 38;
break;
}
_context.next = 38;
return _iterator["return"]();
case 38:
_context.prev = 38;
if (!_didIteratorError) {
_context.next = 41;
break;
}
throw _iteratorError;
case 41:
return _context.finish(38);
case 42:
return _context.finish(33);
case 43:
helpersStream.close();
registerHandlebarsHelpers(dataPerPage, helperData);
_context.next = 48;
break;
case 47:
registerHandlebarsHelpers(dataPerPage);
case 48:
htmlStream = fs.createReadStream(templateFilePath, {
encoding: 'utf8'
});
htmlData = '';
_iteratorAbruptCompletion2 = false;
_didIteratorError2 = false;
_context.prev = 52;
_iterator2 = _asyncIterator(htmlStream);
case 54:
_context.next = 56;
return _iterator2.next();
case 56:
if (!(_iteratorAbruptCompletion2 = !(_step2 = _context.sent).done)) {
_context.next = 62;
break;
}
_chunk = _step2.value;
htmlData += _chunk;
case 59:
_iteratorAbruptCompletion2 = false;
_context.next = 54;
break;
case 62:
_context.next = 68;
break;
case 64:
_context.prev = 64;
_context.t1 = _context["catch"](52);
_didIteratorError2 = true;
_iteratorError2 = _context.t1;
case 68:
_context.prev = 68;
_context.prev = 69;
if (!(_iteratorAbruptCompletion2 && _iterator2["return"] != null)) {
_context.next = 73;
break;
}
_context.next = 73;
return _iterator2["return"]();
case 73:
_context.prev = 73;
if (!_didIteratorError2) {
_context.next = 76;
break;
}
throw _iteratorError2;
case 76:
return _context.finish(73);
case 77:
return _context.finish(68);
case 78:
htmlStream.close();
template = hbs.compile(htmlData);
pdfConfig = _extends({
format: 'A4',
margin: {
left: '10mm',
top: '10mm',
right: '10mm',
bottom: '10mm'
},
printBackground: true
}, pdfOptions);
_context.next = 83;
return browser.newPage();
case 83:
page = _context.sent;
content = dataPerPage.map(function (singlePageData) {
return template(singlePageData);
}).join('');
_context.next = 87;
return page.setContent(content, {
waitUntil: 'networkidle0'
});
case 87:
_context.next = 89;
return page.evaluateHandle('document.fonts.ready');
case 89:
if (!useStream) {
_context.next = 96;
break;
}
_context.next = 92;
return page.pdf(pdfConfig);
case 92:
pdfBuffer = _context.sent;
return _context.abrupt("return", stream.Readable.from(pdfBuffer));
case 96:
if (pdfFilePath) {
_context.next = 98;
break;
}
throw new Error('PDF file path must be provided.');
case 98:
_context.next = 100;
return page.pdf(_extends({
format: 'A4',
margin: {
left: '10mm',
top: '10mm',
right: '10mm',
bottom: '10mm'
},
printBackground: true
}, pdfOptions));
case 100:
_pdfBuffer = _context.sent;
_context.next = 103;
return new Promise(function (resolve, reject) {
var stream = fs.createWriteStream(pdfFilePath);
stream.write(_pdfBuffer);
stream.end();
stream.on('finish', function () {
return resolve();
});
stream.on('error', function (err) {
return reject(err);
});
});
case 103:
return _context.abrupt("return", pdfFilePath);
case 104:
_context.next = 112;
break;
case 106:
_context.prev = 106;
_context.t2 = _context["catch"](2);
console.log(_context.t2);
if (!(_context.t2 instanceof Error)) {
_context.next = 111;
break;
}
throw new Error("PDF generation failed: " + _context.t2.message);
case 111:
throw new Error('An unknown error occurred during PDF generation.');
case 112:
_context.prev = 112;
if (!page) {
_context.next = 116;
break;
}
_context.next = 116;
return page.close();
case 116:
return _context.finish(112);
case 117:
case "end":
return _context.stop();
}
}, _callee, null, [[2, 106, 112, 117], [17, 29, 33, 43], [34,, 38, 42], [52, 64, 68, 78], [69,, 73, 77]]);
}));
return function generatePdf(_x) {
return _ref2.apply(this, arguments);
};
}();
exports.closeBrowser = closeBrowser;
exports.createBrowser = createBrowser;
exports.generatePdf = generatePdf;
//# sourceMappingURL=pdfile.cjs.development.js.map