UNPKG

@pdfme/pdf-lib

Version:

Create and modify PDF files with JavaScript

132 lines 5.46 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const errors_1 = require("../errors"); const PDFArray_1 = __importDefault(require("../objects/PDFArray")); const PDFName_1 = __importDefault(require("../objects/PDFName")); const PDFNumber_1 = __importDefault(require("../objects/PDFNumber")); const PDFRef_1 = __importDefault(require("../objects/PDFRef")); const ByteStream_1 = __importDefault(require("./ByteStream")); class PDFXRefStreamParser { constructor(rawStream) { Object.defineProperty(this, "alreadyParsed", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "dict", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "context", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "bytes", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "subsections", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "byteWidths", { enumerable: true, configurable: true, writable: true, value: void 0 }); this.alreadyParsed = false; this.dict = rawStream.dict; this.bytes = ByteStream_1.default.fromPDFRawStream(rawStream); this.context = this.dict.context; const Size = this.dict.lookup(PDFName_1.default.of('Size'), PDFNumber_1.default); const Index = this.dict.lookup(PDFName_1.default.of('Index')); if (Index instanceof PDFArray_1.default) { this.subsections = []; for (let idx = 0, len = Index.size(); idx < len; idx += 2) { const firstObjectNumber = Index.lookup(idx + 0, PDFNumber_1.default).asNumber(); const length = Index.lookup(idx + 1, PDFNumber_1.default).asNumber(); this.subsections.push({ firstObjectNumber, length }); } } else { this.subsections = [{ firstObjectNumber: 0, length: Size.asNumber() }]; } const W = this.dict.lookup(PDFName_1.default.of('W'), PDFArray_1.default); this.byteWidths = [-1, -1, -1]; for (let idx = 0, len = W.size(); idx < len; idx++) { this.byteWidths[idx] = W.lookup(idx, PDFNumber_1.default).asNumber(); } } parseIntoContext() { if (this.alreadyParsed) { throw new errors_1.ReparseError('PDFXRefStreamParser', 'parseIntoContext'); } this.alreadyParsed = true; this.context.trailerInfo = { Root: this.dict.get(PDFName_1.default.of('Root')), Encrypt: this.dict.get(PDFName_1.default.of('Encrypt')), Info: this.dict.get(PDFName_1.default.of('Info')), ID: this.dict.get(PDFName_1.default.of('ID')), }; const entries = this.parseEntries(); // for (let idx = 0, len = entries.length; idx < len; idx++) { // const entry = entries[idx]; // if (entry.deleted) this.context.delete(entry.ref); // } return entries; } parseEntries() { const entries = []; const [typeFieldWidth, offsetFieldWidth, genFieldWidth] = this.byteWidths; for (let subsectionIdx = 0, subsectionLen = this.subsections.length; subsectionIdx < subsectionLen; subsectionIdx++) { const { firstObjectNumber, length } = this.subsections[subsectionIdx]; for (let objIdx = 0; objIdx < length; objIdx++) { let type = 0; for (let idx = 0, len = typeFieldWidth; idx < len; idx++) { type = (type << 8) | this.bytes.next(); } let offset = 0; for (let idx = 0, len = offsetFieldWidth; idx < len; idx++) { offset = (offset << 8) | this.bytes.next(); } let generationNumber = 0; for (let idx = 0, len = genFieldWidth; idx < len; idx++) { generationNumber = (generationNumber << 8) | this.bytes.next(); } // When the `type` field is absent, it defaults to 1 if (typeFieldWidth === 0) type = 1; const objectNumber = firstObjectNumber + objIdx; const entry = { ref: PDFRef_1.default.of(objectNumber, generationNumber), offset, deleted: type === 0, inObjectStream: type === 2, }; entries.push(entry); } } return entries; } } Object.defineProperty(PDFXRefStreamParser, "forStream", { enumerable: true, configurable: true, writable: true, value: (rawStream) => new PDFXRefStreamParser(rawStream) }); exports.default = PDFXRefStreamParser; //# sourceMappingURL=PDFXRefStreamParser.js.map