public function testParse() { // Skipped. $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse('ABC', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' [ <0020> 5 6 ]', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' << <0020> >>', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' / <0020> ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' 0 <0020> ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(" 0 \n <0020> ", null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); // Valid. $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' <0020> ', null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(7); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' <0020> ', null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(7); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' <0020>', null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(7); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse('<0020>', null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(6); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(" \n <0020> ", null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(9); }
/** * @param $type * @param $value * @param $document * * @return Element|Header * @throws \Exception */ protected function parseHeaderElement($type, $value, $document) { switch ($type) { case '<<': return $this->parseHeader($value, $document); case 'numeric': return new ElementNumeric($value, $document); case 'boolean': return new ElementBoolean($value, $document); case 'null': return new ElementNull($value, $document); case '(': if ($date = ElementDate::parse('(' . $value . ')', $document)) { return $date; } else { return ElementString::parse('(' . $value . ')', $document); } case '<': return $this->parseHeaderElement('(', ElementHexa::decode($value, $document), $document); case '/': return ElementName::parse('/' . $value, $document); case 'ojbref': // old mistake in tcpdf parser // old mistake in tcpdf parser case 'objref': return new ElementXRef($value, $document); case '[': $values = array(); foreach ($value as $sub_element) { $sub_type = $sub_element[0]; $sub_value = $sub_element[1]; $values[] = $this->parseHeaderElement($sub_type, $sub_value, $document); } return new ElementArray($values, $document); case 'endstream': case 'obj': //I don't know what it means but got my project fixed. //I don't know what it means but got my project fixed. case '': // Nothing to do with. break; default: throw new \Exception('Invalid type: "' . $type . '".'); } }
/** * @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; }
public function testParse() { // Skipped. $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse('ABC', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' [ <0020> 5 6 ]', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' << <0020> >>', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' / <0020> ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' 0 <0020> ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(" 0 \n <0020> ", null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); // Valid. $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' <0020> ', null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(7); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' <0020> ', null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(7); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' <0020>', null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(7); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse('<0020>', null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(6); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(" \n <0020> ", null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(9); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(" \n <5465616d204d616e6167656d656e742053797374656d73> ", null, $offset); $this->assert->string($element->getContent())->isEqualTo('Team Management Systems'); $this->assert->integer($offset)->isEqualTo(51); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(" \n <5265706f72744275696c646572> ", null, $offset); $this->assert->object($element)->isInstanceOf('\\Smalot\\PdfParser\\Element\\ElementString'); $this->assert->string($element->getContent())->isEqualTo('ReportBuilder'); $this->assert->integer($offset)->isEqualTo(31); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(" \n <443a3230313331323137313334303435303027303027> ", null, $offset); $this->assert->object($element)->isInstanceOf('\\Smalot\\PdfParser\\Element\\ElementDate'); $this->assert->castToString($element)->isEqualTo('2013-12-17T13:40:45+00:00'); $this->assert->integer($offset)->isEqualTo(49); }