UNPKG

pdf-lib

Version:

Library for creating and modifying PDF files in JavaScript

59 lines (58 loc) 2.58 kB
import flatMap from 'lodash/flatMap'; import last from 'lodash/last'; import sortBy from 'lodash/sortBy'; import { PDFArray, PDFIndirectObject, PDFName, PDFNumber, } from '../../pdf-objects'; import { PDFXRefStream, } from '../../pdf-structures'; var computeIndices = function (objectStream) { return objectStream.objects.map(function (object, index) { return ({ objectNumber: object.reference.objectNumber, generationNumber: object.reference.generationNumber, index: index, }); }); }; var PDFXRefStreamFactory = /** @class */ (function () { function PDFXRefStreamFactory() { } PDFXRefStreamFactory.forOffsetsAndObjectStream = function (offsets, objectStream, catalog, index) { var indices = computeIndices(objectStream.pdfObject); var merged = sortBy(offsets.concat(indices), 'objectNumber'); var xrefObjectNumber = last(merged).objectNumber + 1; var xrefStream = PDFXRefStream.create({ Size: PDFNumber.fromNumber(xrefObjectNumber + 1), Root: catalog, }, index); merged.push({ objectNumber: xrefObjectNumber, generationNumber: 0, startOffset: last(offsets).startOffset, }); xrefStream.addFreeObjectEntry(0, 65535); var xrefSections = [{ firstObjectNumber: 0, size: 1 }]; merged.forEach(function (obj, idx) { var shouldStartNewSection = idx !== 0 && obj.objectNumber - merged[idx - 1].objectNumber > 1; if (shouldStartNewSection) { xrefSections.push({ firstObjectNumber: obj.objectNumber, size: 1 }); } else { last(xrefSections).size += 1; } if ('startOffset' in obj) { xrefStream.addUncompressedObjectEntry(obj.startOffset, obj.generationNumber); } if ('index' in obj) { xrefStream.addCompressedObjectEntry(objectStream.reference.objectNumber, obj.index); } }); xrefStream.dictionary.set(PDFName.from('Index'), PDFArray.fromArray(flatMap(xrefSections, function (_a) { var firstObjectNumber = _a.firstObjectNumber, size = _a.size; return [ PDFNumber.fromNumber(firstObjectNumber), PDFNumber.fromNumber(size), ]; }), index)); xrefStream.encode(); return PDFIndirectObject.of(xrefStream).setReferenceNumbers(xrefObjectNumber, 0); }; return PDFXRefStreamFactory; }()); export default PDFXRefStreamFactory;