UNPKG

@aeolun/muhammara

Version:

Create, read and modify PDF files and streams. A drop in replacement for hummusjs PDF library

87 lines (82 loc) 2.35 kB
const muhammara = require("../muhammara"); const fs = require("fs"); const hummusUtils = require("./utils"); /** * Insert a page from the other pdf * @name insertPage * @function * @memberof Recipe * @param {number} afterPageNumber - The page number for insertion. * @param {string} pdfSrc - The path for the other pdf * @param {number} srcPageNumber - The page number to be insterted from the other pdf. */ exports.insertPage = function insertPage( afterPageNumber, pdfSrc, srcPageNumber ) { if (isNaN(afterPageNumber)) { throw new Error("The afterPageNumber is inValid."); } this.needToInsertPages = true; if (pdfSrc && srcPageNumber) { this.insertInformation = this.insertInformation || {}; this.insertInformation[afterPageNumber] = this.insertInformation[afterPageNumber] || []; this.insertInformation[afterPageNumber].push({ afterPageNumber, pdfSrc, srcPageNumber, }); } return this; }; exports._insertPages = function _insertPages() { if (!this.insertInformation) { throw new Error("No insertInformation"); } const pagesForInsert = [ 0, ...Object.keys(this.metadata) .filter((item) => !isNaN(item)) .map((item) => parseInt(item)), ]; const unlinkList = []; const tmp = this.output + ".tmp.pdf"; unlinkList.push(tmp); fs.renameSync(this.output, tmp); const pdfWriter = muhammara.createWriter(this.output); let lastInsertedOriginal = 0; pagesForInsert.forEach((pageNumber) => { const toAppendPage = pageNumber - 1; if (toAppendPage >= 0) { const specificRanges = [[lastInsertedOriginal, toAppendPage]]; hummusUtils.appendPDFPagesFromPDFWithAnnotations(pdfWriter, tmp, { specificRanges, }); } lastInsertedOriginal = pageNumber; const toInserts = this.insertInformation[pageNumber]; if (toInserts) { toInserts.forEach((info) => { const specificRanges = [ [info.srcPageNumber - 1, info.srcPageNumber - 1], ]; hummusUtils.appendPDFPagesFromPDFWithAnnotations( pdfWriter, info.pdfSrc, { specificRanges } ); }); } }); pdfWriter.end(); unlinkList.forEach((item) => { setTimeout(() => { if (fs.existsSync(item)) { fs.unlinkSync(item); } }); }); return this; };