Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
 
3
/**
4
 * This file is part of FPDI
5
 *
6
 * @package   setasign\Fpdi
7
 * @copyright Copyright (c) 2023 Setasign GmbH & Co. KG (https://www.setasign.com)
8
 * @license   http://opensource.org/licenses/mit-license The MIT License
9
 */
10
 
11
namespace setasign\Fpdi\PdfParser\Type;
12
 
13
use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException;
14
use setasign\Fpdi\PdfParser\PdfParser;
15
use setasign\Fpdi\PdfParser\PdfParserException;
16
 
17
/**
18
 * A class defining a PDF data type
19
 */
20
class PdfType
21
{
22
    /**
23
     * Resolves a PdfType value to its value.
24
     *
25
     * This method is used to evaluate indirect and direct object references until a final value is reached.
26
     *
27
     * @param PdfType $value
28
     * @param PdfParser $parser
29
     * @param bool $stopAtIndirectObject
30
     * @return PdfType
31
     * @throws CrossReferenceException
32
     * @throws PdfParserException
33
     */
34
    public static function resolve(PdfType $value, PdfParser $parser, $stopAtIndirectObject = false)
35
    {
36
        if ($value instanceof PdfIndirectObject) {
37
            if ($stopAtIndirectObject === true) {
38
                return $value;
39
            }
40
 
41
            return self::resolve($value->value, $parser, $stopAtIndirectObject);
42
        }
43
 
44
        if ($value instanceof PdfIndirectObjectReference) {
45
            return self::resolve($parser->getIndirectObject($value->value), $parser, $stopAtIndirectObject);
46
        }
47
 
48
        return $value;
49
    }
50
 
51
    /**
52
     * Ensure that a value is an instance of a specific PDF type.
53
     *
54
     * @param string $type
55
     * @param PdfType $value
56
     * @param string $errorMessage
57
     * @return mixed
58
     * @throws PdfTypeException
59
     */
60
    protected static function ensureType($type, $value, $errorMessage)
61
    {
62
        if (!($value instanceof $type)) {
63
            throw new PdfTypeException(
64
                $errorMessage,
65
                PdfTypeException::INVALID_DATA_TYPE
66
            );
67
        }
68
 
69
        return $value;
70
    }
71
 
72
    /**
73
     * Flatten indirect object references to direct objects.
74
     *
75
     * @param PdfType $value
76
     * @param PdfParser $parser
77
     * @return PdfType
78
     * @throws CrossReferenceException
79
     * @throws PdfParserException
80
     */
81
    public static function flatten(PdfType $value, PdfParser $parser)
82
    {
83
        if ($value instanceof PdfIndirectObjectReference) {
84
            return self::flatten(self::resolve($value, $parser), $parser);
85
        }
86
 
87
        if ($value instanceof PdfDictionary || $value instanceof PdfArray) {
88
            foreach ($value->value as $key => $_value) {
89
                $value->value[$key] = self::flatten($_value, $parser);
90
            }
91
        }
92
 
93
        if ($value instanceof PdfStream) {
94
            throw new PdfTypeException('There is a stream object found which cannot be flattened to a direct object.');
95
        }
96
 
97
        return $value;
98
    }
99
 
100
    /**
101
     * The value of the PDF type.
102
     *
103
     * @var mixed
104
     */
105
    public $value;
106
}