UNPKG

async-pdf

Version:
735 lines (734 loc) 33.2 kB
"use strict"; 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 }); exports.PDF = void 0; const crypto_1 = require("crypto"); const fs_1 = require("fs"); const pdf_lib_1 = require("pdf-lib"); const path_1 = require("path"); const utils_1 = require("../utils"); const os_1 = require("os"); const fsPromises_1 = require("../utils/fsPromises"); class PDF { constructor(document, font, tmpDir, options) { this.mergeFiles = []; this.pagesControl = 1; this.limits = { startColumn: 0, startLine: 0, endColumn: 0, endLine: 0 }; this.externalFontPath = ''; this.tmpDir = tmpDir; this.file = `${(0, path_1.join)(this.tmpDir)}/${(0, crypto_1.randomBytes)(5).toString('hex')}.pdf`; this.document = document; this.unit = (options === null || options === void 0 ? void 0 : options.unit) || 'mm'; this.fontSize = (options === null || options === void 0 ? void 0 : options.fontSize) || 7.5; this.pageSize = (0, utils_1.PDFGetPageSizeByUnit)(options === null || options === void 0 ? void 0 : options.unit, options === null || options === void 0 ? void 0 : options.pageSize) || pdf_lib_1.PageSizes.A4; this.fontColor = (options === null || options === void 0 ? void 0 : options.fontColor) || { r: 0, g: 0, b: 0, a: 1 }; this.orientation = (options === null || options === void 0 ? void 0 : options.orientation) || 'portrait'; this.setOrientation(this.orientation); this.page = this.document.addPage(this.pageSize); this.pageSelected = 1; this.pageFraming = { lineStartPosition: 0, lineEndPosition: this.page.getWidth(), columnStartPosition: 0, columnEndPosition: this.page.getHeight() }; this.pageSpacing = this.normalizePageSpacing(options === null || options === void 0 ? void 0 : options.pageSpacing); this.setPageLimits(); this.font = font; this.fontName = (options === null || options === void 0 ? void 0 : options.font) || pdf_lib_1.StandardFonts.Helvetica; this.page.setFont(this.font); this.page.setFontSize((options === null || options === void 0 ? void 0 : options.fontSize) || this.fontSize); this.page.setFontColor(this.getColorRGBFromRGBA(options === null || options === void 0 ? void 0 : options.fontColor)); } /** * Create a new [[PDF]]. * @returns Resolves with the newly created document. */ static create(options) { return __awaiter(this, void 0, void 0, function* () { let document = yield pdf_lib_1.PDFDocument.create(); let font = yield document.embedFont((options === null || options === void 0 ? void 0 : options.font) || pdf_lib_1.StandardFonts.Helvetica); let tmpDir = (0, os_1.tmpdir)() + path_1.sep + `.async-pdf`; if (!(0, fs_1.existsSync)((0, path_1.join)(tmpDir))) yield (0, fsPromises_1.mkdirPromise)((0, path_1.join)(tmpDir)); return new PDF(document, font, tmpDir, options); }); } /** * Set page spacing. * */ setPageSpacing(pageSpacing) { this.pageSpacing = this.normalizePageSpacing(pageSpacing); this.setPageLimits(); } /** * Set the page font. * That doesn't chage the general font. */ setPageFont(font) { this.page.setFont(font); } /** * Select page. */ selectPage(pageNumber) { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => { setTimeout(() => __awaiter(this, void 0, void 0, function* () { if (pageNumber != this.pageSelected) { let pageFile = this.getPageFile(pageNumber); yield this.saveTheLastPage(); yield this.savePage(this.pageSelected); yield this.createDocument(); let document = yield (0, fsPromises_1.readFilePromise)(pageFile); let pdfDocument = yield pdf_lib_1.PDFDocument.load(document); let pages = yield this.document.copyPages(pdfDocument, [0]); this.page = this.document.addPage(pages[0]); this.pageSelected = pageNumber; } resolve(); })); }); }); } /** * Clear the page. */ clearPage() { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => { setTimeout(() => __awaiter(this, void 0, void 0, function* () { yield this.saveTheLastPage(); this.document.removePage(0); this.page = this.document.addPage(this.pageSize); resolve(); })); }); }); } /** * Remove the page by page number. * Example: * ```js * PDF.removePage(1) // Remove the first page of the document * PDF.removePage(2) // Remove the second page of the document * PDF.removePage(200) // Remove the 200th page of the document * ``` */ removePage(pageNumber) { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => { setTimeout(() => __awaiter(this, void 0, void 0, function* () { let pageFile = this.getPageFile(pageNumber); if (pageFile) { yield this.deletePageFile(this.mergeFiles[pageNumber - 1]); this.document.removePage(pageNumber - 1); this.pagesControl--; } ; resolve(); })); }); }); } /** * Add page to the document. * Example: * ```js *let pageOptions = { * unit: 'mm', * orientation: 'landscape', * pageSize: { line: 297, column: 210 }, * pageSpacing: { top: 10, bottom: 10, left: 10, right: 10 }, * font: 'Helvetica-Bold', *} * PDF.addPage(pageOptions) // The document will have two pages. The second page will have the new options * PDF.addPage() // The document will have two pages. The second page will have the same first page options * ``` */ addPage(pageOptions) { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => { setTimeout(() => __awaiter(this, void 0, void 0, function* () { yield this.savePage(); yield this.createDocument(); yield this.createPage(pageOptions); this.pagesControl++; this.pageSelected++; resolve(); })); }); }); } /** * Write a text on the page. * Example: * ```js * // It will write a text aligned by right direction * PDF.writeText(`Hello world`, { * align: 'right', * size: 20, * position: { * linePosition: 210, * columnPosition: 200, * } * }) * ``` */ writeText(text, options) { var _a, _b; return __awaiter(this, void 0, void 0, function* () { this.isNegative('size', (options === null || options === void 0 ? void 0 : options.size) || this.fontSize); let font; font = options.font || this.font; this.document; let pdfText = { align: options.align, positions: options.position, textHeight: ((_a = options === null || options === void 0 ? void 0 : options.font) === null || _a === void 0 ? void 0 : _a.heightAtSize((options === null || options === void 0 ? void 0 : options.size) || this.fontSize)) || this.font.heightAtSize((options === null || options === void 0 ? void 0 : options.size) || this.fontSize), textWidth: ((_b = options === null || options === void 0 ? void 0 : options.font) === null || _b === void 0 ? void 0 : _b.widthOfTextAtSize(text, (options === null || options === void 0 ? void 0 : options.size) || this.fontSize)) || this.font.widthOfTextAtSize(text, (options === null || options === void 0 ? void 0 : options.size) || this.fontSize), value: text }; pdfText = this.normalizeText(pdfText); this.page.drawText(pdfText.value, { x: pdfText.positions.linePosition, y: pdfText.positions.columnPosition, font: font, size: options.size || this.fontSize, color: this.getColorRGBFromRGBA(options === null || options === void 0 ? void 0 : options.color), opacity: this.getAlfaFromRGBA(options === null || options === void 0 ? void 0 : options.color) }); }); } /** * Write a line on the page. * Example: * ```js * // It will write a vertical red line at midle of the page with 50% of opacity * PDF.writeLine({ * start: { * linePosition: 100, * columnPosition: 0, * }, * end: { * linePosition: 100, * columnPosition: 297, * }, * color: { r: 1, g: 0, b: 0, a: 0.5 }, * thickness: 1 * }) * ``` */ writeLine(options) { let startPosition = this.normalizeLine(options.start); let endPosition = this.normalizeLine(options.end); this.page.drawLine({ start: { x: startPosition.linePosition, y: startPosition.columnPosition }, end: { x: endPosition.linePosition, y: endPosition.columnPosition }, thickness: options.thickness, color: this.getColorRGBFromRGBA(options.color), }); } /** * Write a rectangular on the page. * Example: * ```js * // It will write a rectangular starting at line 10 and column 50 with size of 100 width, 50 height and gray background color * let options: PDFRectangleOptions = { start: { linePosition: 10, columnPosition: 50 }, area: { width: 100, height: 500 }, areaColor: { r: 0.95, g: 0.95, b: 0.95, a: 1 }, } * PDF.writeRectangle(options) * ``` */ writeRectangle(options) { let startPosition = this.normalizeLine(options.start); this.normalizeLine({ linePosition: options.start.linePosition + options.area.width, columnPosition: options.start.columnPosition + options.area.height }); let areaNormalized = { width: (0, utils_1.PDFUnitNormalizerToPT)('mm', options.area.width), height: (0, utils_1.PDFUnitNormalizerToPT)('mm', options.area.height) }; startPosition.columnPosition = startPosition.columnPosition - areaNormalized.height; this.page.drawRectangle({ x: startPosition.linePosition, y: startPosition.columnPosition, width: areaNormalized.width, height: areaNormalized.height, color: options.areaColor.a == 0 ? undefined : this.getColorRGBFromRGBA(options.areaColor), opacity: options.areaColor.a == 0 ? undefined : this.getAlfaFromRGBA(options.areaColor), borderColor: this.getColorRGBFromRGBA(options.borderColor), borderOpacity: this.getAlfaFromRGBA(options.borderColor), borderWidth: (0, utils_1.PDFUnitNormalizerToPT)(this.unit, options.borderWidth) || undefined, borderLineCap: options.borderLineCap, borderDashArray: options.borderDashArray, borderDashPhase: options.borderDashPhase, }); } /** * Get a text size. * Example: * @returns Resolve with a text height. * ```js * PDF.getHeighAtSize(20,'Helvetica-Bold') * ``` */ getHeighAtSize(size, font) { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => { setTimeout(() => __awaiter(this, void 0, void 0, function* () { if (typeof font == 'string') { resolve((0, utils_1.PDFUnitNormalizerFromPT)('mm', (yield this.document.embedFont(font)).heightAtSize(size))); } else if (typeof font == 'object') { resolve((0, utils_1.PDFUnitNormalizerFromPT)('mm', font === null || font === void 0 ? void 0 : font.heightAtSize(size))); } else { resolve((0, utils_1.PDFUnitNormalizerFromPT)('mm', this.font.heightAtSize(size))); } })); }); }); } /** * Get a text size. * Example: * @returns Resolve with a text width. * ```js * PDF.getWidthOfTextAtSize('test',20,'Helvetica-Bold') * ``` */ getWidthOfTextAtSize(text, size, font) { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => { setTimeout(() => __awaiter(this, void 0, void 0, function* () { if (typeof font == 'string') { resolve((0, utils_1.PDFUnitNormalizerFromPT)('mm', (yield this.document.embedFont(font)).widthOfTextAtSize(text, size))); } else if (typeof font == 'object') { resolve((0, utils_1.PDFUnitNormalizerFromPT)('mm', font === null || font === void 0 ? void 0 : font.widthOfTextAtSize(text, size))); } else { resolve((0, utils_1.PDFUnitNormalizerFromPT)('mm', this.font.widthOfTextAtSize(text, size))); } })); }); }); } getWidthOfTextAtSizeByPageFont(text, size) { return (0, utils_1.PDFUnitNormalizerFromPT)('mm', this.font.widthOfTextAtSize(text, size)); } /** * Get a [[PDFFont]] by external font. * Example: * @returns Resolve with a PDFFont. * ```js * let font = await PDF.getCustomFont("../fonts/HouschkaHead-BoldItalic.otf") * }) *``` */ getCustomFont(fontPath) { return __awaiter(this, void 0, void 0, function* () { let fontBytes = yield (0, fsPromises_1.readFilePromise)(fontPath); return this.document.embedFont(fontBytes); ; }); } /** * Get a [[PDFFont]] by name. * Example: * @returns Resolve with a PDFFont. * ```js * let font = await PDF.getCustomFont("Helvetica") * }) *``` */ getFontByName(fontTypes) { return __awaiter(this, void 0, void 0, function* () { return this.document.embedFont(fontTypes); ; }); } /** * Get a text size. * Example: * ```js * PDF.setCustomFont("../fonts/HouschkaHead-BoldItalic.otf") * ``` */ setCustomFont(fontPath) { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => { setTimeout(() => __awaiter(this, void 0, void 0, function* () { this.externalFontPath = fontPath; let fontBytes = yield (0, fsPromises_1.readFilePromise)(fontPath); this.font = yield this.document.embedFont(fontBytes); this.page.setFont(this.font); resolve(); })); }); }); } getFont(font) { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => { setTimeout(() => __awaiter(this, void 0, void 0, function* () { if (font && (0, fs_1.existsSync)(font)) resolve(yield this.getCustomFont(String(font))); if (font) resolve(yield this.document.embedFont(font)); if (this.externalFontPath) { let fontBytes = yield (0, fsPromises_1.readFilePromise)(this.externalFontPath); resolve(yield this.document.embedFont(fontBytes)); } resolve(yield this.document.embedFont(this.fontName)); })); }); }); } /** * Save the document at the file path * For example: * ```js * PDF.save("/out/pdf/test.pdf") * ``` */ save(filePath) { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => { setTimeout(() => __awaiter(this, void 0, void 0, function* () { yield this.saveTheLastPage(); yield this.mergeGroupOfPDF(filePath); resolve(); })); }); }); } /** * Load an external pdf * For example: * ```js * // test.pdf has 5 pages * PDF.getNumberOfPages() // returns 1 * PDF.loadPDF("/out/pdf/test.pdf") * PDF.addPage(); * PDF.getNumberOfPages() // returns 7 * ``` */ loadPDF(pdfFilePath) { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => { setTimeout(() => __awaiter(this, void 0, void 0, function* () { if (!(0, fs_1.existsSync)(pdfFilePath)) this.filePathDoesNotExist(pdfFilePath); yield this.savePage(); yield this.createDocument(); let document = yield (0, fsPromises_1.readFilePromise)(pdfFilePath); let pdf = yield pdf_lib_1.PDFDocument.load(document); let pages = yield this.document.copyPages(pdf, pdf.getPageIndices()); for (let page of pages) { this.document.addPage(page); this.pagesControl++; yield this.savePage(); } resolve(); })); }); }); } /** * Merge multiples pdf file to the document * For example: * ```js * // test.pdf has 3 pages and test2.pdf has 2 pages. * PDF.getNumberOfPages() // returns 1 * PDF.removePage(1); * PDF.getNumberOfPages() // returns 0; * let pdfFilesPath = ["/out/pdf/test.pdf","/out/pdf/test2.pdf"] * PDF.mergePDF(pdfFilesPath) * PDF.getNumberOfPages() // returns 5 * ``` */ mergePDF(pdfFilesPath) { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => { setTimeout(() => __awaiter(this, void 0, void 0, function* () { if (!(pdfFilesPath === null || pdfFilesPath === void 0 ? void 0 : pdfFilesPath.length)) this.pdfFilesPathEmpty(); yield this.savePage(); for (let file of pdfFilesPath) { if (!(0, fs_1.existsSync)(file)) this.filePathDoesNotExist(file); yield this.createDocument(); let document = yield (0, fsPromises_1.readFilePromise)(file); let pdf = yield pdf_lib_1.PDFDocument.load(document); let pages = yield this.document.copyPages(pdf, pdf.getPageIndices()); for (let page of pages) { this.document.addPage(page); this.pagesControl++; yield this.savePage(); } } resolve(); })); }); }); } /** * Get the number of pages. * Example: * @returns - Number of pages. * ```js * PDF.addPage() * PDF.getNumberOfPages() // 2 * ``` */ getNumberOfPages() { return this.pagesControl; } /** * Get page width. * Example: * @returns - Returns page width. * ```js * let pageOptions = { * unit: 'mm', * orientation: 'portrait', * pageSize: { line: 210, column: 297 }, * pageSpacing: { top: 10, bottom: 10, left: 10, right: 10 }, * font: 'Helvetica-Bold', *} * PDF.addPage(pageOptions) * PDF.getPageWidth() // 210 * ``` */ getPageWidth() { return (0, utils_1.PDFUnitNormalizerFromPT)(this.unit, this.page.getWidth()); } /** * Get page height. * Example: * @returns - Returns page height. * ```js * let pageOptions = { * unit: 'mm', * orientation: 'portrait', * pageSize: { line: 210, column: 297 }, * pageSpacing: { top: 10, bottom: 10, left: 10, right: 10 }, * font: 'Helvetica-Bold', *} * PDF.getPageHeight() // 297 * ``` */ getPageHeight() { return (0, utils_1.PDFUnitNormalizerFromPT)(this.unit, this.page.getHeight()); } /** * Get the document font. * Example: * @returns - Returns a [[PDFFont]]. * ```js * PDF.getDocumentFont() * ``` */ getDocumentFont() { return this.font; } createDocument() { return __awaiter(this, void 0, void 0, function* () { this.document = yield pdf_lib_1.PDFDocument.create(); }); } createPage(pageOptions) { return __awaiter(this, void 0, void 0, function* () { yield this.createDocument(); this.fontName = (pageOptions === null || pageOptions === void 0 ? void 0 : pageOptions.font) || this.fontName; this.font = yield this.getFont((pageOptions === null || pageOptions === void 0 ? void 0 : pageOptions.font) || this.externalFontPath || this.fontName); this.unit = (pageOptions === null || pageOptions === void 0 ? void 0 : pageOptions.unit) || this.unit; this.fontSize = (pageOptions === null || pageOptions === void 0 ? void 0 : pageOptions.fontSize) || this.fontSize; this.pageSize = (0, utils_1.PDFGetPageSizeByUnit)(pageOptions === null || pageOptions === void 0 ? void 0 : pageOptions.unit, pageOptions === null || pageOptions === void 0 ? void 0 : pageOptions.pageSize) || pdf_lib_1.PageSizes.A4; this.setOrientation((pageOptions === null || pageOptions === void 0 ? void 0 : pageOptions.orientation) || this.orientation); this.page = this.document.addPage(this.pageSize); this.pageFraming = { lineStartPosition: 0, lineEndPosition: this.page.getWidth(), columnStartPosition: 0, columnEndPosition: this.page.getHeight() }; this.pageSpacing = this.normalizePageSpacing(pageOptions === null || pageOptions === void 0 ? void 0 : pageOptions.pageSpacing); this.setPageLimits(); this.page.setFont(this.font); this.page.setFontSize((pageOptions === null || pageOptions === void 0 ? void 0 : pageOptions.fontSize) || this.fontSize); this.page.setFontColor(this.getColorRGBFromRGBA((pageOptions === null || pageOptions === void 0 ? void 0 : pageOptions.fontColor) || this.fontColor)); }); } getColorRGBFromRGBA(color) { return (0, pdf_lib_1.rgb)((color === null || color === void 0 ? void 0 : color.r) || 0, (color === null || color === void 0 ? void 0 : color.g) || 0, (color === null || color === void 0 ? void 0 : color.b) || 0); } getAlfaFromRGBA(color) { return (color === null || color === void 0 ? void 0 : color.a) || 1; } normalizeText(text) { text.positions = this.normalizePositions(text.positions, text.textWidth, text.textHeight, text.align); text.positions.columnPosition = this.columnNormalize(text.positions.columnPosition); return text; } normalizeLine(positions) { let normalizedPositions = { linePosition: (0, utils_1.PDFUnitNormalizerToPT)(this.unit, positions.linePosition), columnPosition: (0, utils_1.PDFUnitNormalizerToPT)(this.unit, positions.columnPosition) }; this.verifyPositionsByLimit(normalizedPositions); normalizedPositions.columnPosition = this.columnNormalize(normalizedPositions.columnPosition); return normalizedPositions; } normalizePositions(positions, width, height, align) { let normalizedPositions = { linePosition: (0, utils_1.PDFUnitNormalizerToPT)(this.unit, positions.linePosition), columnPosition: (0, utils_1.PDFUnitNormalizerToPT)(this.unit, positions.columnPosition) }; normalizedPositions.linePosition = (0, utils_1.PDFVerticalAlignmentFormatter)(align || 'left', normalizedPositions.linePosition, width); let textWidthByAlign = align == 'center' ? width / 2 : width; this.verifyPositionsByLimit(normalizedPositions, textWidthByAlign, height); return normalizedPositions; } normalizePageSpacing(pageSpacing) { let pageSpacingNormalized = { top: (0, utils_1.PDFUnitNormalizerToPT)(this.unit, pageSpacing === null || pageSpacing === void 0 ? void 0 : pageSpacing.top), bottom: (0, utils_1.PDFUnitNormalizerToPT)(this.unit, pageSpacing === null || pageSpacing === void 0 ? void 0 : pageSpacing.bottom), left: (0, utils_1.PDFUnitNormalizerToPT)(this.unit, pageSpacing === null || pageSpacing === void 0 ? void 0 : pageSpacing.left), right: (0, utils_1.PDFUnitNormalizerToPT)(this.unit, pageSpacing === null || pageSpacing === void 0 ? void 0 : pageSpacing.right) }; return pageSpacingNormalized; } columnNormalize(columnPosition) { let newPosition = this.limits.startColumn + this.pageSpacing.top - columnPosition; return newPosition; } verifyPositionsByLimit(positions, width, height) { this.verifyColumnByLimit(positions.columnPosition, height || 0); this.verifyLineByLimit(positions.linePosition, width || 0); } verifyColumnByLimit(columnPosition, height) { if (columnPosition < this.pageFraming.columnStartPosition + this.pageSpacing.top) this.columnIsOutRange(columnPosition, this.pageFraming.columnStartPosition + this.pageSpacing.top); if (columnPosition > this.pageFraming.columnEndPosition - this.pageSpacing.bottom) this.columnIsOutRange(columnPosition, this.pageFraming.columnEndPosition - this.pageSpacing.bottom); if (columnPosition - height < this.pageFraming.columnStartPosition + this.pageSpacing.top) this.columnWithHeightIsOutRange(columnPosition - height, this.pageFraming.columnStartPosition + this.pageSpacing.top); } verifyLineByLimit(linePosition, width) { if (linePosition < this.limits.startLine) this.lineIsOutRange(linePosition, this.limits.startLine); if (linePosition > this.limits.endLine) this.lineIsOutRange(linePosition, this.limits.endLine); if (linePosition + width > this.limits.endLine) this.lineWithWidthIsOutRange(linePosition + width, this.limits.endLine); } setPageLimits() { var _a; this.limits.startLine = this.pageFraming.lineStartPosition + ((_a = this.pageSpacing) === null || _a === void 0 ? void 0 : _a.left); this.limits.endLine = this.pageFraming.lineEndPosition - this.pageSpacing.right; this.limits.startColumn = this.pageFraming.columnEndPosition - this.pageSpacing.top; this.limits.endColumn = this.pageFraming.columnStartPosition + this.pageSpacing.bottom; } wasLastPageSaved() { return (0, fs_1.existsSync)(this.mergeFiles[this.pagesControl - 1]); } saveTheLastPage() { return __awaiter(this, void 0, void 0, function* () { return new Promise(resolve => { setTimeout(() => __awaiter(this, void 0, void 0, function* () { if (!this.wasLastPageSaved()) yield (0, fsPromises_1.writeFilePromise)(this.file + `part${this.pagesControl}`, yield this.document.save(), { flag: 'w' }); resolve(); })); }); }); } savePage(pageNumber) { return __awaiter(this, void 0, void 0, function* () { yield (0, fsPromises_1.writeFilePromise)(this.file + `part${pageNumber || this.pagesControl}`, yield this.document.save(), { flag: 'w' }); if (!this.mergeFiles.filter(file => file == this.file + `part${pageNumber || this.pagesControl}`)[0]) { this.mergeFiles.push(this.file + `part${pageNumber || this.pagesControl}`); } }); } deletePageFile(file) { return __awaiter(this, void 0, void 0, function* () { yield (0, fsPromises_1.unlinkPromise)(file); this.mergeFiles = this.mergeFiles.filter(mergeFile => mergeFile != file); }); } getPageFile(pageNumber) { let filePage = this.mergeFiles[pageNumber - 1]; if (!filePage) this.pageDoesNotExist(pageNumber); return filePage; } mergeGroupOfPDF(filePath) { return __awaiter(this, void 0, void 0, function* () { if (!this.mergeFiles[0] && !this.pagesControl) this.pagesForMergeDoesNotExist(); if (!this.mergeFiles[0] && this.pagesControl) { yield (0, fsPromises_1.writeFilePromise)(filePath, yield this.document.save(), { flag: 'w' }); return; } ; yield this.saveTheLastPage(); yield (0, fsPromises_1.writeFilePromise)(this.file + `part${this.pagesControl}`, yield this.document.save(), { flag: 'w' }); if (!this.mergeFiles.filter(filePath => filePath == this.file + `part${this.pagesControl}`)[0]) this.mergeFiles.push(this.file + `part${this.pagesControl}`); this.document = yield pdf_lib_1.PDFDocument.create(); for (let file of this.mergeFiles) { let document = yield (0, fsPromises_1.readFilePromise)(file); let pdf = yield pdf_lib_1.PDFDocument.load(document); let pages = yield this.document.copyPages(pdf, pdf.getPageIndices()); this.document.addPage(pages[0]); } let pdfPrincipalBytes = yield this.document.save(); yield (0, fsPromises_1.writeFilePromise)(filePath, pdfPrincipalBytes, { flag: 'w' }); for (let file of this.mergeFiles) { if ((0, fs_1.existsSync)(file)) yield (0, fsPromises_1.unlinkPromise)(file); } this.mergeFiles = []; }); } setOrientation(orientation) { orientation == 'landscape' ? this.pageSize = [this.pageSize[1], this.pageSize[0]] : this.pageSize = [this.pageSize[0], this.pageSize[1]]; } isNegative(attribute, value) { if (value < 0) { this.negativeNumber(attribute, value); } } //errors pageDoesNotExist(pageNumber) { throw new Error(`Page ${pageNumber} does not exist`); } pagesForMergeDoesNotExist() { throw new Error('There is no page to save'); } columnIsOutRange(column, range) { throw new Error(`Column ${(0, utils_1.PDFUnitNormalizerFromPT)(this.unit, column)} is out of range. Range: ${(0, utils_1.PDFUnitNormalizerFromPT)(this.unit, range)}`); } columnWithHeightIsOutRange(column, range) { throw new Error(`Column with height ${(0, utils_1.PDFUnitNormalizerFromPT)(this.unit, column)} is out of range. Range: ${(0, utils_1.PDFUnitNormalizerFromPT)(this.unit, range)}`); } lineIsOutRange(line, range) { throw new Error(`Line ${(0, utils_1.PDFUnitNormalizerFromPT)(this.unit, line)} is out of range. Range: ${(0, utils_1.PDFUnitNormalizerFromPT)(this.unit, range)}`); } lineWithWidthIsOutRange(line, range) { throw new Error(`Line with width ${(0, utils_1.PDFUnitNormalizerFromPT)(this.unit, line)} is out of range. Range: ${(0, utils_1.PDFUnitNormalizerFromPT)(this.unit, range)}`); } negativeNumber(attribute, value) { throw new Error(`${attribute} can't be set by negative value: ${value}`); } filePathDoesNotExist(filePath) { throw new Error(`File path ${this.file} does not exist`); } pdfFilesPathEmpty() { throw new Error(`Pdf files path is empty`); } } exports.PDF = PDF;