async-pdf
Version:
Create, Modify and Merge PDF Files
731 lines (730 loc) • 32.4 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());
});
};
import { randomBytes } from 'crypto';
import { existsSync } from 'fs';
import { PageSizes, PDFDocument, rgb, StandardFonts } from 'pdf-lib';
import { join, sep } from 'path';
import { PDFGetPageSizeByUnit, PDFUnitNormalizerFromPT, PDFUnitNormalizerToPT, PDFVerticalAlignmentFormatter } from '../utils';
import { tmpdir } from 'os';
import { mkdirPromise, readFilePromise, unlinkPromise, writeFilePromise } from '../utils/fsPromises';
export 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 = `${join(this.tmpDir)}/${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 = PDFGetPageSizeByUnit(options === null || options === void 0 ? void 0 : options.unit, options === null || options === void 0 ? void 0 : options.pageSize) || 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) || 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 PDFDocument.create();
let font = yield document.embedFont((options === null || options === void 0 ? void 0 : options.font) || StandardFonts.Helvetica);
let tmpDir = tmpdir() + sep + `.async-pdf`;
if (!existsSync(join(tmpDir)))
yield mkdirPromise(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 readFilePromise(pageFile);
let pdfDocument = yield 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: PDFUnitNormalizerToPT('mm', options.area.width),
height: 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: 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(PDFUnitNormalizerFromPT('mm', (yield this.document.embedFont(font)).heightAtSize(size)));
}
else if (typeof font == 'object') {
resolve(PDFUnitNormalizerFromPT('mm', font === null || font === void 0 ? void 0 : font.heightAtSize(size)));
}
else {
resolve(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(PDFUnitNormalizerFromPT('mm', (yield this.document.embedFont(font)).widthOfTextAtSize(text, size)));
}
else if (typeof font == 'object') {
resolve(PDFUnitNormalizerFromPT('mm', font === null || font === void 0 ? void 0 : font.widthOfTextAtSize(text, size)));
}
else {
resolve(PDFUnitNormalizerFromPT('mm', this.font.widthOfTextAtSize(text, size)));
}
}));
});
});
}
getWidthOfTextAtSizeByPageFont(text, size) {
return 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 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 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 && existsSync(font))
resolve(yield this.getCustomFont(String(font)));
if (font)
resolve(yield this.document.embedFont(font));
if (this.externalFontPath) {
let fontBytes = yield 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 (!existsSync(pdfFilePath))
this.filePathDoesNotExist(pdfFilePath);
yield this.savePage();
yield this.createDocument();
let document = yield readFilePromise(pdfFilePath);
let pdf = yield 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 (!existsSync(file))
this.filePathDoesNotExist(file);
yield this.createDocument();
let document = yield readFilePromise(file);
let pdf = yield 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 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 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 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 = PDFGetPageSizeByUnit(pageOptions === null || pageOptions === void 0 ? void 0 : pageOptions.unit, pageOptions === null || pageOptions === void 0 ? void 0 : pageOptions.pageSize) || 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 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: PDFUnitNormalizerToPT(this.unit, positions.linePosition),
columnPosition: PDFUnitNormalizerToPT(this.unit, positions.columnPosition)
};
this.verifyPositionsByLimit(normalizedPositions);
normalizedPositions.columnPosition = this.columnNormalize(normalizedPositions.columnPosition);
return normalizedPositions;
}
normalizePositions(positions, width, height, align) {
let normalizedPositions = {
linePosition: PDFUnitNormalizerToPT(this.unit, positions.linePosition),
columnPosition: PDFUnitNormalizerToPT(this.unit, positions.columnPosition)
};
normalizedPositions.linePosition = 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: PDFUnitNormalizerToPT(this.unit, pageSpacing === null || pageSpacing === void 0 ? void 0 : pageSpacing.top),
bottom: PDFUnitNormalizerToPT(this.unit, pageSpacing === null || pageSpacing === void 0 ? void 0 : pageSpacing.bottom),
left: PDFUnitNormalizerToPT(this.unit, pageSpacing === null || pageSpacing === void 0 ? void 0 : pageSpacing.left),
right: 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 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 writeFilePromise(this.file + `part${this.pagesControl}`, yield this.document.save(), { flag: 'w' });
resolve();
}));
});
});
}
savePage(pageNumber) {
return __awaiter(this, void 0, void 0, function* () {
yield 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 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 writeFilePromise(filePath, yield this.document.save(), { flag: 'w' });
return;
}
;
yield this.saveTheLastPage();
yield 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 PDFDocument.create();
for (let file of this.mergeFiles) {
let document = yield readFilePromise(file);
let pdf = yield PDFDocument.load(document);
let pages = yield this.document.copyPages(pdf, pdf.getPageIndices());
this.document.addPage(pages[0]);
}
let pdfPrincipalBytes = yield this.document.save();
yield writeFilePromise(filePath, pdfPrincipalBytes, { flag: 'w' });
for (let file of this.mergeFiles) {
if (existsSync(file))
yield 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 ${PDFUnitNormalizerFromPT(this.unit, column)} is out of range. Range: ${PDFUnitNormalizerFromPT(this.unit, range)}`);
}
columnWithHeightIsOutRange(column, range) {
throw new Error(`Column with height ${PDFUnitNormalizerFromPT(this.unit, column)} is out of range. Range: ${PDFUnitNormalizerFromPT(this.unit, range)}`);
}
lineIsOutRange(line, range) {
throw new Error(`Line ${PDFUnitNormalizerFromPT(this.unit, line)} is out of range. Range: ${PDFUnitNormalizerFromPT(this.unit, range)}`);
}
lineWithWidthIsOutRange(line, range) {
throw new Error(`Line with width ${PDFUnitNormalizerFromPT(this.unit, line)} is out of range. Range: ${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`);
}
}