UNPKG

hummus-recipe

Version:

A powerful PDF tool for NodeJS based on HummusJS

78 lines (73 loc) 2.53 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; };