UNPKG

@ocelot-consulting/hummus-toc

Version:

An extension for HummusJS to add Table of Contents (including bookmarks).

55 lines (47 loc) 2.05 kB
const hummus = require('hummus') const writeOutline = require('./src/writeOutline') const addTOCPages = require('./src/addTOCPages') const countPages = require('./src/countPages') const countOutline = require('./src/countOutline') const getTOCText = require('./src/getTOCText') const translatePageNumbers = require('./src/translatePageNumbers') const writeLinks = require('./src/writeLinks') module.exports = (inFile, outFile, origOutline, font = null) => { // Start new PDF to contain TOC pages only const newPDFWriter = hummus.createWriter(outFile) const outlineSize = countOutline(origOutline) const howManyPages = countPages(outlineSize) const tocText = getTOCText(origOutline, howManyPages) const tocPageSize = addTOCPages(newPDFWriter, tocText, font) newPDFWriter.appendPDFPagesFromPDF(inFile) newPDFWriter.end() // End TOC PDF // Start final PDF containing bookmarks as well as TOC pages const mergingWriter = hummus.createWriterToModify(outFile) const ctx = mergingWriter.getObjectsContext() const events = mergingWriter.getEvents() const copyCtx = mergingWriter.createPDFCopyingContextForModifiedFile() const parser = copyCtx.getSourceDocumentParser() // translate numbers from index to PDF object IDs const translatedOutline = origOutline.map(childOutline => translatePageNumbers(parser, childOutline, howManyPages)) // write bookmarks const outline = writeOutline(ctx, translatedOutline) // create link annotations for TOC to locations in file for (let i = 0; i < howManyPages; i++) { writeLinks(ctx, copyCtx, parser, i, tocText, howManyPages, tocPageSize) } // before writer closes, add outline to PDF events.on('OnCatalogWrite', e => { let d = e.catalogDictionaryContext if (outline !== null) { d.writeKey('Outlines') .writeObjectReferenceValue(outline) .writeKey('PageMode') .writeNameValue('UseOutlines') } }) // force update, in case it is necessary mergingWriter.requireCatalogUpdate() mergingWriter.end() // End Final PDF }