/** * Parse a parent object from a string * * @param string $stream * @return ParentObject */ public static function parse($stream) { $parent = new self(); $parent->setIndex(substr($stream, 0, strpos($stream, ' '))); $stream = str_replace($parent->getIndex() . ' 0 obj', '[{parent_index}] 0 obj', $stream); // Determine the kids count. $matches = []; preg_match('/\\/Count\\s\\d*/', $stream, $matches); $count = $matches[0]; $count = str_replace('/Count ', '', $count); $stream = str_replace('Count ' . $count, 'Count [{count}]', $stream); // Determine the kids object indices. $kids = trim(substr($stream, strpos($stream, '/Kids') + 5)); $kids = substr($kids, 0, 1) == '[' ? substr($kids, 0, strpos($kids, ']') + 1) : substr($kids, 0, strpos($kids, ' R') + 2); $kidIndices = $parent->getDictionaryReferences(substr($stream, strpos($stream, '/Kids') + 5)); $parent->setKids($kidIndices); $parent->setData(str_replace($kids, '[[{kids}]]', $stream) . "\n"); return $parent; }