/**
* @param string $id
* @param array $structure
* @param Document $document
*/
protected function parseObject($id, $structure, $document)
{
$header = new Header(array(), $document);
$content = '';
foreach ($structure as $position => $part) {
switch ($part[0]) {
case '[':
$elements = array();
foreach ($part[1] as $sub_element) {
$sub_type = $sub_element[0];
$sub_value = $sub_element[1];
$elements[] = $this->parseHeaderElement($sub_type, $sub_value, $document);
}
$header = new Header($elements, $document);
break;
case '<<':
$header = $this->parseHeader($part[1], $document);
break;
case 'stream':
$content = isset($part[3][0]) ? $part[3][0] : $part[1];
if ($header->get('Type')->equals('ObjStm')) {
$match = array();
// Split xrefs and contents.
preg_match('/^((\\d+\\s+\\d+\\s*)*)(.*)$/s', $content, $match);
$content = $match[3];
// Extract xrefs.
$xrefs = preg_split('/(\\d+\\s+\\d+\\s*)/s', $match[1], -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$table = array();
foreach ($xrefs as $xref) {
list($id, $position) = explode(' ', trim($xref));
$table[$position] = $id;
}
ksort($table);
$ids = array_values($table);
$positions = array_keys($table);
foreach ($positions as $index => $position) {
$id = $ids[$index] . '_0';
$next_position = isset($positions[$index + 1]) ? $positions[$index + 1] : strlen($content);
$sub_content = substr($content, $position, $next_position - $position);
$sub_header = Header::parse($sub_content, $document);
$object = Object::factory($document, $sub_header, '');
$this->objects[$id] = $object;
}
// It is not necessary to store this content.
$content = '';
return;
}
break;
default:
if ($part != 'null') {
$element = $this->parseHeaderElement($part[0], $part[1], $document);
if ($element) {
$header = new Header(array($element), $document);
}
}
break;
}
}
if (!isset($this->objects[$id])) {
$this->objects[$id] = Object::factory($document, $header, $content);
}
}