UNPKG

pdf-lib

Version:

Library for creating and modifying PDF files in JavaScript

59 lines (58 loc) 2.85 kB
// tslint:disable-next-line:no-unused-variable import { PDFIndirectObject } from '../pdf-objects'; import { arrayIndexOf, arrayToString, error, trimArrayAndRemoveComments, } from '../../utils'; import parseArray from './parseArray'; import parseBool from './parseBool'; import parseDictOrStream from './parseDictOrStream'; import parseHexString from './parseHexString'; import parseIndirectRef from './parseIndirectRef'; import parseName from './parseName'; import parseNull from './parseNull'; import parseNumber from './parseNumber'; import parseString from './parseString'; /** * Accepts an array of bytes as input. Checks to see if the first characters in the * trimmed input make up a PDF Indirect Object. * * If so, returns a tuple containing (1) an object representing the parsed PDF * Indirect Object and (2) a subarray of the input with the characters making up * the parsed indirect object removed. The "onParseIndirectObj" parse handler will * also be called with the PDFIndirectObject. * * If not, null is returned. */ var parseIndirectObj = function (input, index, parseHandlers) { if (parseHandlers === void 0) { parseHandlers = {}; } var trimmed = trimArrayAndRemoveComments(input); var indirectObjRegex = /^(\d+)[\0\t\n\f\r ]*(\d+)[\0\t\n\f\r ]*obj/; // Check that initial characters make up an indirect object "header" var objIdx = arrayIndexOf(trimmed, 'obj'); var result = arrayToString(trimmed.subarray(0, objIdx + 3)).match(indirectObjRegex); if (!result) return undefined; // eslint-disable-next-line no-unused-vars var _fullMatch = result[0], objNum = result[1], genNum = result[2]; // Extract the bytes making up the object itself var endobjIdx = arrayIndexOf(trimmed, 'endobj', objIdx); var content = trimArrayAndRemoveComments(trimmed.subarray(objIdx + 3, endobjIdx)); // Try to parse the object bytes var _a = parseDictOrStream(content, index, parseHandlers) || parseArray(content, index, parseHandlers) || parseName(content, parseHandlers) || parseString(content, parseHandlers) || parseIndirectRef(content, parseHandlers) || parseNumber(content, parseHandlers) || parseHexString(content, parseHandlers) || parseBool(content, parseHandlers) || parseNull(content, parseHandlers) || error('Failed to parse object contents'), contentObj = _a[0], r = _a[1]; if (trimArrayAndRemoveComments(r).length > 0) { error('Incorrectly parsed object contents'); } var indirectObj = PDFIndirectObject.of(contentObj).setReferenceNumbers(Number(objNum), Number(genNum)); if (parseHandlers.onParseIndirectObj) { parseHandlers.onParseIndirectObj(indirectObj); } return [indirectObj, trimmed.subarray(endobjIdx + 6)]; }; export default parseIndirectObj;