1<?php 2/** 3 * This file is part of FPDI 4 * 5 * @package setasign\Fpdi 6 * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com) 7 * @license http://opensource.org/licenses/mit-license The MIT License 8 */ 9 10namespace setasign\Fpdi\PdfParser\Type; 11 12use setasign\Fpdi\PdfParser\StreamReader; 13use setasign\Fpdi\PdfParser\Tokenizer; 14 15/** 16 * Class representing a PDF name object 17 * 18 * @package setasign\Fpdi\PdfParser\Type 19 */ 20class PdfName extends PdfType 21{ 22 /** 23 * Parses a name object from the passed tokenizer and stream-reader. 24 * 25 * @param Tokenizer $tokenizer 26 * @param StreamReader $streamReader 27 * @return self 28 */ 29 public static function parse(Tokenizer $tokenizer, StreamReader $streamReader) 30 { 31 $v = new self; 32 if (\strspn($streamReader->getByte(), "\x00\x09\x0A\x0C\x0D\x20()<>[]{}/%") === 0) { 33 $v->value = (string) $tokenizer->getNextToken(); 34 return $v; 35 } 36 37 $v->value = ''; 38 return $v; 39 } 40 41 /** 42 * Unescapes a name string. 43 * 44 * @param string $value 45 * @return string 46 */ 47 static public function unescape($value) 48 { 49 if (strpos($value, '#') === false) 50 return $value; 51 52 return preg_replace_callback('/#([a-fA-F\d]{2})/', function($matches) { 53 return chr(hexdec($matches[1])); 54 }, $value); 55 } 56 57 /** 58 * Helper method to create an instance. 59 * 60 * @param string $string 61 * @return self 62 */ 63 public static function create($string) 64 { 65 $v = new self; 66 $v->value = $string; 67 68 return $v; 69 } 70 71 /** 72 * Ensures that the passed value is a PdfName instance. 73 * 74 * @param mixed $name 75 * @return self 76 * @throws PdfTypeException 77 */ 78 public static function ensure($name) 79 { 80 return PdfType::ensureType(self::class, $name, 'Name value expected.'); 81 } 82} 83