public function testParse() { // Skipped. $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse('ABC', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' [ 5 0 R ]', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' << 5 0 R >>', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' / 5 0 R ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' 0 5 0 R ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(" 0 \n 5 0 R ", null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); // Valid. $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' 5 0 R ', null, $offset); $this->assert->string($element->getContent())->isEqualTo('5_0'); $this->assert->integer($offset)->isEqualTo(6); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' 5 0 R ', null, $offset); $this->assert->string($element->getContent())->isEqualTo('5_0'); $this->assert->integer($offset)->isEqualTo(6); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' 5 0 R', null, $offset); $this->assert->string($element->getContent())->isEqualTo('5_0'); $this->assert->integer($offset)->isEqualTo(6); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse('5 0 R', null, $offset); $this->assert->string($element->getContent())->isEqualTo('5_0'); $this->assert->integer($offset)->isEqualTo(5); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(" \n 5 0 R ", null, $offset); $this->assert->string($element->getContent())->isEqualTo('5_0'); $this->assert->integer($offset)->isEqualTo(8); }
/** * @param string $content * @param Document $document * @param int $position * * @return array * @throws \Exception */ public static function parse($content, Document $document = null, &$position = 0) { $args = func_get_args(); $only_values = isset($args[3]) ? $args[3] : false; $content = trim($content); $values = array(); do { $old_position = $position; if (!$only_values) { if (!preg_match('/^\\s*(?P<name>\\/[A-Z0-9\\._]+)(?P<value>.*)/si', substr($content, $position), $match)) { break; } else { $name = ltrim($match['name'], '/'); $value = $match['value']; $position = strpos($content, $value, $position + strlen($match['name'])); } } else { $name = count($values); $value = substr($content, $position); } if ($element = ElementName::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementXRef::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementNumeric::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementStruct::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementBoolean::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementNull::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementDate::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementString::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementHexa::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementArray::parse($value, $document, $position)) { $values[$name] = $element; } else { $position = $old_position; break; } } while ($position < strlen($content)); return $values; }