utils.js

const ANNOTATION_PREFIX = 'Annots';

/**
 * Append PDF Page with annotations.
 *
 * @param {any} pdfWriter - Hummus writer.
 * @param {string|any} sourcePDFPath - The path for the output pdfs or Reader stream.
 * @param {number} pageNumber - page number.
 * @param {any} [options={}] - appendPDFPageFromPDF options
 */
function appendPDFPageFromPDFWithAnnotations(pdfWriter, sourcePDFPath, pageNumber) {
    const cpyCxt = pdfWriter.createPDFCopyingContext(sourcePDFPath);
    const cpyCxtParser = cpyCxt.getSourceDocumentParser();
    const pageDictionary = cpyCxtParser.parsePageDictionary(pageNumber);

    if (!pageDictionary.exists(ANNOTATION_PREFIX)) {
        cpyCxt.appendPDFPageFromPDF(pageNumber);
    } else {
        let reffedObjects;
        pdfWriter.getEvents().once('OnPageWrite', params => {
            params.pageDictionaryContext.writeKey(ANNOTATION_PREFIX);
            reffedObjects = cpyCxt.copyDirectObjectWithDeepCopy(pageDictionary.queryObject(ANNOTATION_PREFIX));
        });

        cpyCxt.appendPDFPageFromPDF(pageNumber);

        if (reffedObjects && reffedObjects.length > 0) {
            cpyCxt.copyNewObjectsForDirectObject(reffedObjects);
        }
    }
}

/**
 * Append PDF Pages with annotations.
 *
 * @param {any} pdfWriter - Hummus writer.
 * @param {string|any} sourcePDFPath - The path for the output pdfs or Reader stream.
 * @param {any} [options={}] - appendPDFPagesFromPDF options
 */
function appendPDFPagesFromPDFWithAnnotations(pdfWriter, sourcePDFPath, options = {}) {
    const cpyCxt = pdfWriter.createPDFCopyingContext(sourcePDFPath);
    const cpyCxtParser = cpyCxt.getSourceDocumentParser();

    if (options.specificRanges && options.specificRanges.length) {
        for (const [start, end] of options.specificRanges) {
            for (let i = start; i <= end; ++i) {
                appendPDFPageFromPDFWithAnnotations(pdfWriter, sourcePDFPath, i);
            }
        }
    } else {
        for (let i = 0; i < cpyCxtParser.getPagesCount(); ++i) {
            appendPDFPageFromPDFWithAnnotations(pdfWriter, sourcePDFPath, i);
        }
    }
}

exports.ANNOTATION_PREFIX = ANNOTATION_PREFIX;
exports.appendPDFPageFromPDFWithAnnotations = appendPDFPageFromPDFWithAnnotations;
exports.appendPDFPagesFromPDFWithAnnotations = appendPDFPagesFromPDFWithAnnotations;