2026-01-09 07:13:59 +00:00

58 lines
2.0 KiB
PHP

<?php
declare(strict_types=1);
namespace PrinsFrank\PdfParser\Document\Dictionary\DictionaryValue\TextString;
use Override;
use PrinsFrank\PdfParser\Document\Dictionary\DictionaryValue\DictionaryValue;
use PrinsFrank\PdfParser\Exception\ParseFailureException;
/** @api */
class TextStringValue implements DictionaryValue {
public function __construct(
public readonly string $textStringValue
) {
}
/** @throws ParseFailureException */
public function getText(): string {
if (str_starts_with($this->textStringValue, '(') && str_ends_with($this->textStringValue, ')')) {
return preg_replace_callback(
'/\\\\([0-7]{3})/',
fn (array $matches) => mb_chr((int) octdec($matches[1])),
str_replace(['\(', '\)', '\n', '\r'], ['(', ')', "\n", "\r"], substr($this->textStringValue, 1, -1))
) ?? throw new ParseFailureException();
}
if (str_starts_with($this->textStringValue, '<') && str_ends_with($this->textStringValue, '>')) {
$string = substr($this->textStringValue, 1, -1);
if (str_starts_with($string, 'FEFF')) {
$string = substr($string, 4);
}
return implode(
'',
array_map(
fn (string $character) => mb_chr((int) hexdec($character)),
str_split($string, 4)
)
);
}
if (str_starts_with($this->textStringValue, '/')) {
return preg_replace_callback(
'/#([0-9A-F]{2})/',
fn (array $matches) => chr((int) hexdec($matches[1])),
$this->textStringValue,
) ?? throw new ParseFailureException();
}
throw new ParseFailureException(sprintf('Unrecognized format %s', $this->textStringValue));
}
#[Override]
public static function fromValue(string $valueString): self {
return new self($valueString);
}
}