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