xref: /plugin/dw2pdf/vendor/setasign/fpdi/src/PdfParser/CrossReference/AbstractReader.php (revision dc4d9dc689082c963d5c1d9ee679553326788c6e)
1*dc4d9dc6SAnna Dabrowska<?php
2*dc4d9dc6SAnna Dabrowska/**
3*dc4d9dc6SAnna Dabrowska * This file is part of FPDI
4*dc4d9dc6SAnna Dabrowska *
5*dc4d9dc6SAnna Dabrowska * @package   setasign\Fpdi
6*dc4d9dc6SAnna Dabrowska * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com)
7*dc4d9dc6SAnna Dabrowska * @license   http://opensource.org/licenses/mit-license The MIT License
8*dc4d9dc6SAnna Dabrowska */
9*dc4d9dc6SAnna Dabrowska
10*dc4d9dc6SAnna Dabrowskanamespace setasign\Fpdi\PdfParser\CrossReference;
11*dc4d9dc6SAnna Dabrowska
12*dc4d9dc6SAnna Dabrowskause setasign\Fpdi\PdfParser\PdfParser;
13*dc4d9dc6SAnna Dabrowskause setasign\Fpdi\PdfParser\Type\PdfDictionary;
14*dc4d9dc6SAnna Dabrowskause setasign\Fpdi\PdfParser\Type\PdfToken;
15*dc4d9dc6SAnna Dabrowskause setasign\Fpdi\PdfParser\Type\PdfTypeException;
16*dc4d9dc6SAnna Dabrowska
17*dc4d9dc6SAnna Dabrowska/**
18*dc4d9dc6SAnna Dabrowska * Abstract class for cross-reference reader classes.
19*dc4d9dc6SAnna Dabrowska *
20*dc4d9dc6SAnna Dabrowska * @package setasign\Fpdi\PdfParser\CrossReference
21*dc4d9dc6SAnna Dabrowska */
22*dc4d9dc6SAnna Dabrowskaabstract class AbstractReader
23*dc4d9dc6SAnna Dabrowska{
24*dc4d9dc6SAnna Dabrowska    /**
25*dc4d9dc6SAnna Dabrowska     * @var PdfParser
26*dc4d9dc6SAnna Dabrowska     */
27*dc4d9dc6SAnna Dabrowska    protected $parser;
28*dc4d9dc6SAnna Dabrowska
29*dc4d9dc6SAnna Dabrowska    /**
30*dc4d9dc6SAnna Dabrowska     * @var PdfDictionary
31*dc4d9dc6SAnna Dabrowska     */
32*dc4d9dc6SAnna Dabrowska    protected $trailer;
33*dc4d9dc6SAnna Dabrowska
34*dc4d9dc6SAnna Dabrowska    /**
35*dc4d9dc6SAnna Dabrowska     * AbstractReader constructor.
36*dc4d9dc6SAnna Dabrowska     *
37*dc4d9dc6SAnna Dabrowska     * @param PdfParser $parser
38*dc4d9dc6SAnna Dabrowska     * @throws CrossReferenceException
39*dc4d9dc6SAnna Dabrowska     * @throws PdfTypeException
40*dc4d9dc6SAnna Dabrowska     */
41*dc4d9dc6SAnna Dabrowska    public function __construct(PdfParser $parser)
42*dc4d9dc6SAnna Dabrowska    {
43*dc4d9dc6SAnna Dabrowska        $this->parser = $parser;
44*dc4d9dc6SAnna Dabrowska        $this->readTrailer();
45*dc4d9dc6SAnna Dabrowska    }
46*dc4d9dc6SAnna Dabrowska
47*dc4d9dc6SAnna Dabrowska    /**
48*dc4d9dc6SAnna Dabrowska     * Get the trailer dictionary.
49*dc4d9dc6SAnna Dabrowska     *
50*dc4d9dc6SAnna Dabrowska     * @return PdfDictionary
51*dc4d9dc6SAnna Dabrowska     */
52*dc4d9dc6SAnna Dabrowska    public function getTrailer()
53*dc4d9dc6SAnna Dabrowska    {
54*dc4d9dc6SAnna Dabrowska        return $this->trailer;
55*dc4d9dc6SAnna Dabrowska    }
56*dc4d9dc6SAnna Dabrowska
57*dc4d9dc6SAnna Dabrowska    /**
58*dc4d9dc6SAnna Dabrowska     * Read the trailer dictionary.
59*dc4d9dc6SAnna Dabrowska     *
60*dc4d9dc6SAnna Dabrowska     * @throws CrossReferenceException
61*dc4d9dc6SAnna Dabrowska     * @throws PdfTypeException
62*dc4d9dc6SAnna Dabrowska     */
63*dc4d9dc6SAnna Dabrowska    protected function readTrailer()
64*dc4d9dc6SAnna Dabrowska    {
65*dc4d9dc6SAnna Dabrowska        try {
66*dc4d9dc6SAnna Dabrowska            $trailerKeyword = $this->parser->readValue(null, PdfToken::class);
67*dc4d9dc6SAnna Dabrowska            if ($trailerKeyword->value !== 'trailer') {
68*dc4d9dc6SAnna Dabrowska                throw new CrossReferenceException(
69*dc4d9dc6SAnna Dabrowska                    \sprintf(
70*dc4d9dc6SAnna Dabrowska                        'Unexpected end of cross reference. "trailer"-keyword expected, got: %s.',
71*dc4d9dc6SAnna Dabrowska                        $trailerKeyword->value
72*dc4d9dc6SAnna Dabrowska                    ),
73*dc4d9dc6SAnna Dabrowska                    CrossReferenceException::UNEXPECTED_END
74*dc4d9dc6SAnna Dabrowska                );
75*dc4d9dc6SAnna Dabrowska            }
76*dc4d9dc6SAnna Dabrowska        } catch (PdfTypeException $e) {
77*dc4d9dc6SAnna Dabrowska            throw new CrossReferenceException(
78*dc4d9dc6SAnna Dabrowska                'Unexpected end of cross reference. "trailer"-keyword expected, got an invalid object type.',
79*dc4d9dc6SAnna Dabrowska                CrossReferenceException::UNEXPECTED_END,
80*dc4d9dc6SAnna Dabrowska                $e
81*dc4d9dc6SAnna Dabrowska            );
82*dc4d9dc6SAnna Dabrowska        }
83*dc4d9dc6SAnna Dabrowska
84*dc4d9dc6SAnna Dabrowska        try {
85*dc4d9dc6SAnna Dabrowska            $trailer = $this->parser->readValue(null, PdfDictionary::class);
86*dc4d9dc6SAnna Dabrowska        } catch (PdfTypeException $e) {
87*dc4d9dc6SAnna Dabrowska            throw new CrossReferenceException(
88*dc4d9dc6SAnna Dabrowska                'Unexpected end of cross reference. Trailer not found.',
89*dc4d9dc6SAnna Dabrowska                CrossReferenceException::UNEXPECTED_END,
90*dc4d9dc6SAnna Dabrowska                $e
91*dc4d9dc6SAnna Dabrowska            );
92*dc4d9dc6SAnna Dabrowska        }
93*dc4d9dc6SAnna Dabrowska
94*dc4d9dc6SAnna Dabrowska        $this->trailer = $trailer;
95*dc4d9dc6SAnna Dabrowska    }
96*dc4d9dc6SAnna Dabrowska}
97