from-data-to-pdf
Version:
This library converts html files, URL and character string from html files to PDF files or PDF buffer.
349 lines (348 loc) • 13.1 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const puppeteer = require("puppeteer");
const fs = require("fs");
const pathModule = require("path");
/**
* @author DOUAL Sofian
* @description Return a browser.
*
* @export
* @returns { Promise<Browser> }
*/
function initBrowser() {
return __awaiter(this, void 0, void 0, function* () {
try {
// console.log('BROWSER IS INIT');
return yield puppeteer.launch();
}
catch (error) {
throw new Error(error);
}
});
}
exports.initBrowser = initBrowser;
/**
* @author DOUAL Sofian
* @description Close given browser.
*
* @export
* @param { Browser } browser
* @returns { Promise<void> }
*/
function closeBrowser(browser) {
return __awaiter(this, void 0, void 0, function* () {
try {
// console.log('BROWSER IS CLOSED');
yield browser.close();
return;
}
catch (error) {
throw new Error(error);
}
});
}
exports.closeBrowser = closeBrowser;
/**
* @author DOUAL Sofian
* @description If path is undefined, returns an array of PDFS buffer. Otherwise, return the path of the saved PDF files.
*
* @export
* @param { Browser } browser
* @param { FileBuffer[] } targets
* @param { string } [path]
* @returns {Promise<FileBuffer>}
*/
function generateBuffer(browser, targets, path) {
return __awaiter(this, void 0, void 0, function* () {
try {
const page = yield browser.newPage();
const targetMax = targets.length;
for (let i = 0; i < targetMax; i++) {
if (!targets[i].name) {
if (targets[i].url)
delete targets[i].url;
else if (targets[i].text)
delete targets[i].text;
else if (targets[i].options)
delete targets[i].options;
targets[i]['error'] = new Error('Projects need name.');
continue;
}
if (targets[i].url) {
yield page.goto(targets[i].url, {
waitUntil: 'networkidle0'
});
delete targets[i].url;
}
else if (targets[i].text) {
yield page.setContent(targets[i].text, {
waitUntil: "networkidle0"
});
delete targets[i].text;
}
else {
continue;
}
// define the default pdf options.
if (!targets[i].options) {
targets[i]['options'] = {
printBackground: true,
preferCSSPageSize: true,
displayHeaderFooter: true
};
}
if (path) {
const pdfName = pathModule.join(path, (targets[i].name.split(' ').join('-') + Date.now().toString() + '.pdf'));
targets[i].options['path'] = pdfName;
if (targets[i].url)
delete targets[i].url;
else if (targets[i].text)
delete targets[i].text;
yield page.pdf(targets[i].options);
targets[i]['pathOfsavedFile'] = pdfName;
delete targets[i].options;
}
else {
targets[i]['buffer'] = yield page.pdf(targets[i].options);
delete targets[i].options;
}
}
return targets;
}
catch (error) {
throw new Error(error);
}
});
}
exports.generateBuffer = generateBuffer;
/**
* @author DOUAL Sofian
* @description Save the buffer as a PDF file in <My project>/temp/generatedPDF/.
*
* @export
* @param { FileBuffer[] } targets
* @returns { Promise<FileBuffer[]> }
*/
function savePDF(targets) {
return __awaiter(this, void 0, void 0, function* () {
const targetMax = targets.length;
for (let i = 0; i < targetMax; i++) {
try {
if (!targets[i].name)
throw new Error("Projects need name.");
let path = __filename.split('\\node_modules');
path = (path.length > 1 ? path[0] : path[0].split('\\dist')[0]) + '/temp/generatedPDF/';
const pdfName = path + targets[i].name.split(' ').join('-') + Date.now().toString() + '.pdf';
const pdf = yield fs.promises.open(pdfName, 'a');
yield pdf.appendFile(targets[i].buffer);
pdf.close();
targets[i]['pathOfsavedFile'] = pdfName;
delete targets[i].buffer;
}
catch (error) {
delete targets[i].buffer;
targets[i]['error'] = error;
continue;
}
}
return targets;
});
}
exports.savePDF = savePDF;
/**
* @author DOUAL Sofian
* @description Create folders ./temp, ./temp/target, ./temp/generatedPDF
*
* @returns { Promise<boolean> }
*/
function initDefaultFolder() {
return __awaiter(this, void 0, void 0, function* () {
try {
let folderRoot = setPath();
let contentFolder = yield fs.promises.readdir(folderRoot);
contentFolder = contentFolder.filter(x => x === 'temp');
const tempPath = setPath('./temp/');
const targetPath = setPath('./temp/target/)');
const pdfPath = setPath('./temp/generatedPDF/');
if (contentFolder.length === 0) {
yield fs.promises.mkdir(tempPath);
yield fs.promises.mkdir(targetPath);
yield fs.promises.mkdir(pdfPath);
return false;
}
else {
const contentTemp = yield fs.promises.readdir(tempPath);
let reload = false;
if (!contentTemp.includes('target')) {
yield fs.promises.mkdir(targetPath);
reload = true;
}
if (!contentTemp.includes('generatedPDF')) {
yield fs.promises.mkdir(pdfPath);
reload = true;
}
if (reload)
return false;
return true;
}
}
catch (error) {
throw new Error(error);
}
});
}
exports.initDefaultFolder = initDefaultFolder;
/**
* @author DOUAL Sofian
* @description Converts HTML files to string.
*
* @param { HTMLTarget[] } data
* @param { string } [path]
* @returns { Promise<FileBuffer[]> }
*/
function fromHtmlFileToString(data, path) {
return __awaiter(this, void 0, void 0, function* () {
try {
const folderRoot = setPath((path !== null && path !== void 0 ? path : undefined));
const countProjects = data.length;
if (countProjects > 0) {
const res = [];
for (let i = 0; i < countProjects; i++) {
if (data[i].projectName && data[i].fileName) {
let project = {
name: data[i].projectName,
options: data[i].pdfOptions
};
if (folderRoot === setPath()) {
project['text'] = yield fs.promises.readFile(pathModule.join(folderRoot, '/temp/target/', data[i].fileName), { encoding: 'utf-8' });
}
else {
project['text'] = yield fs.promises.readFile(pathModule.join(folderRoot, data[i].fileName), { encoding: 'utf-8' });
}
res.push(project);
delete data[i];
}
else {
let project = {
name: data[i].projectName,
error: new Error('Projects need name && file name.')
};
res.push(project);
delete data[i];
}
}
return res;
}
else {
throw 'No project detected.';
}
}
catch (error) {
throw new Error(error);
}
});
}
exports.fromHtmlFileToString = fromHtmlFileToString;
// Scripts
/**
* @author DOUAL Sofian
* @description Carries out the process without to get local files.
*
* @export
* @param { FileBuffer[] } targets
* @param { boolean } save
* @param { path } [path]
* @returns { Promise<FileBuffer[]> }
*/
function getPdf(targets, save, path) {
return __awaiter(this, void 0, void 0, function* () {
const browser = yield initBrowser();
if (save) {
let folderToSavePdf = setPath((path !== null && path !== void 0 ? path : undefined));
if (!path) {
yield initDefaultFolder();
folderToSavePdf = pathModule.join(folderToSavePdf, '/temp/generatedPDF/');
}
targets = yield generateBuffer(browser, targets, folderToSavePdf);
}
else {
targets = yield generateBuffer(browser, targets);
}
yield closeBrowser(browser);
return targets;
});
}
exports.getPdf = getPdf;
/**
* @author DOUAL Sofian
* @description Get html files and carries out the process.
*
* @export
* @param { HTMLTarget[] } files
* @param { boolean } save
* @param { Path } [path]
* @returns { Promise<FileBuffer[]> }
*/
function fromHtmlFileToPdf(files, save, path) {
var _a, _b, _c, _d, _e;
return __awaiter(this, void 0, void 0, function* () {
let formatedFiles = yield fromHtmlFileToString(files, (_b = (_a = path) === null || _a === void 0 ? void 0 : _a.toGetFiles, (_b !== null && _b !== void 0 ? _b : undefined)));
const browser = yield initBrowser();
if (save) {
let folderToSavePdf = setPath((_d = (_c = path) === null || _c === void 0 ? void 0 : _c.toSaveFiles, (_d !== null && _d !== void 0 ? _d : undefined)));
if (!((_e = path) === null || _e === void 0 ? void 0 : _e.toSaveFiles)) {
yield initDefaultFolder();
folderToSavePdf = pathModule.join(folderToSavePdf, '/temp/generatedPDF/');
}
formatedFiles = yield generateBuffer(browser, formatedFiles, folderToSavePdf);
}
else {
formatedFiles = yield generateBuffer(browser, formatedFiles);
}
yield closeBrowser(browser);
return formatedFiles;
});
}
exports.fromHtmlFileToPdf = fromHtmlFileToPdf;
/**
* @author DOUAL Sofian
* @description It returns the path of the app directory if path param does not exists.
* Else if path param exists and it is a relative path, this method joins it with the path of app directory to finally returns the result as string.
* Else if path param exists and it is an absolute path, this methods return it.
*
* @param { string } [path]
* @returns { string }
*/
function setPath(path) {
try {
if (path) {
if (pathModule.isAbsolute(path)) {
return path;
}
else {
let dirPath = __filename.split('\\node_modules');
dirPath = (dirPath.length > 1 ? dirPath[0] : dirPath[0].split('\\dist')[0]);
return pathModule.join(dirPath, path);
}
}
else {
let dirPath = __filename.split('\\node_modules');
dirPath = (dirPath.length > 1 ? dirPath[0] : dirPath[0].split('\\dist')[0]);
return dirPath;
}
}
catch (error) {
throw new Error(error);
}
}
exports.setPath = setPath;