pdf-lib
Version:
Library for creating and modifying PDF files in JavaScript
59 lines (58 loc) • 2.85 kB
JavaScript
// 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;