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; 11*dc4d9dc6SAnna Dabrowska 12*dc4d9dc6SAnna Dabrowskause setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException; 13*dc4d9dc6SAnna Dabrowskause setasign\Fpdi\PdfParser\PdfParserException; 14*dc4d9dc6SAnna Dabrowskause setasign\Fpdi\PdfParser\Type\PdfIndirectObject; 15*dc4d9dc6SAnna Dabrowskause setasign\Fpdi\PdfParser\Type\PdfNull; 16*dc4d9dc6SAnna Dabrowska 17*dc4d9dc6SAnna Dabrowska/** 18*dc4d9dc6SAnna Dabrowska * Class Fpdi 19*dc4d9dc6SAnna Dabrowska * 20*dc4d9dc6SAnna Dabrowska * This class let you import pages of existing PDF documents into a reusable structure for FPDF. 21*dc4d9dc6SAnna Dabrowska * 22*dc4d9dc6SAnna Dabrowska * @package setasign\Fpdi 23*dc4d9dc6SAnna Dabrowska */ 24*dc4d9dc6SAnna Dabrowskaclass Fpdi extends FpdfTpl 25*dc4d9dc6SAnna Dabrowska{ 26*dc4d9dc6SAnna Dabrowska use FpdiTrait; 27*dc4d9dc6SAnna Dabrowska 28*dc4d9dc6SAnna Dabrowska /** 29*dc4d9dc6SAnna Dabrowska * FPDI version 30*dc4d9dc6SAnna Dabrowska * 31*dc4d9dc6SAnna Dabrowska * @string 32*dc4d9dc6SAnna Dabrowska */ 33*dc4d9dc6SAnna Dabrowska const VERSION = '2.3.1'; 34*dc4d9dc6SAnna Dabrowska 35*dc4d9dc6SAnna Dabrowska protected function _enddoc() 36*dc4d9dc6SAnna Dabrowska { 37*dc4d9dc6SAnna Dabrowska parent::_enddoc(); 38*dc4d9dc6SAnna Dabrowska $this->cleanUp(); 39*dc4d9dc6SAnna Dabrowska } 40*dc4d9dc6SAnna Dabrowska 41*dc4d9dc6SAnna Dabrowska /** 42*dc4d9dc6SAnna Dabrowska * Draws an imported page or a template onto the page or another template. 43*dc4d9dc6SAnna Dabrowska * 44*dc4d9dc6SAnna Dabrowska * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the 45*dc4d9dc6SAnna Dabrowska * aspect ratio. 46*dc4d9dc6SAnna Dabrowska * 47*dc4d9dc6SAnna Dabrowska * @param mixed $tpl The template id 48*dc4d9dc6SAnna Dabrowska * @param float|int|array $x The abscissa of upper-left corner. Alternatively you could use an assoc array 49*dc4d9dc6SAnna Dabrowska * with the keys "x", "y", "width", "height", "adjustPageSize". 50*dc4d9dc6SAnna Dabrowska * @param float|int $y The ordinate of upper-left corner. 51*dc4d9dc6SAnna Dabrowska * @param float|int|null $width The width. 52*dc4d9dc6SAnna Dabrowska * @param float|int|null $height The height. 53*dc4d9dc6SAnna Dabrowska * @param bool $adjustPageSize 54*dc4d9dc6SAnna Dabrowska * @return array The size 55*dc4d9dc6SAnna Dabrowska * @see Fpdi::getTemplateSize() 56*dc4d9dc6SAnna Dabrowska */ 57*dc4d9dc6SAnna Dabrowska public function useTemplate($tpl, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = false) 58*dc4d9dc6SAnna Dabrowska { 59*dc4d9dc6SAnna Dabrowska if (isset($this->importedPages[$tpl])) { 60*dc4d9dc6SAnna Dabrowska $size = $this->useImportedPage($tpl, $x, $y, $width, $height, $adjustPageSize); 61*dc4d9dc6SAnna Dabrowska if ($this->currentTemplateId !== null) { 62*dc4d9dc6SAnna Dabrowska $this->templates[$this->currentTemplateId]['resources']['templates']['importedPages'][$tpl] = $tpl; 63*dc4d9dc6SAnna Dabrowska } 64*dc4d9dc6SAnna Dabrowska return $size; 65*dc4d9dc6SAnna Dabrowska } 66*dc4d9dc6SAnna Dabrowska 67*dc4d9dc6SAnna Dabrowska return parent::useTemplate($tpl, $x, $y, $width, $height, $adjustPageSize); 68*dc4d9dc6SAnna Dabrowska } 69*dc4d9dc6SAnna Dabrowska 70*dc4d9dc6SAnna Dabrowska /** 71*dc4d9dc6SAnna Dabrowska * Get the size of an imported page or template. 72*dc4d9dc6SAnna Dabrowska * 73*dc4d9dc6SAnna Dabrowska * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the 74*dc4d9dc6SAnna Dabrowska * aspect ratio. 75*dc4d9dc6SAnna Dabrowska * 76*dc4d9dc6SAnna Dabrowska * @param mixed $tpl The template id 77*dc4d9dc6SAnna Dabrowska * @param float|int|null $width The width. 78*dc4d9dc6SAnna Dabrowska * @param float|int|null $height The height. 79*dc4d9dc6SAnna Dabrowska * @return array|bool An array with following keys: width, height, 0 (=width), 1 (=height), orientation (L or P) 80*dc4d9dc6SAnna Dabrowska */ 81*dc4d9dc6SAnna Dabrowska public function getTemplateSize($tpl, $width = null, $height = null) 82*dc4d9dc6SAnna Dabrowska { 83*dc4d9dc6SAnna Dabrowska $size = parent::getTemplateSize($tpl, $width, $height); 84*dc4d9dc6SAnna Dabrowska if ($size === false) { 85*dc4d9dc6SAnna Dabrowska return $this->getImportedPageSize($tpl, $width, $height); 86*dc4d9dc6SAnna Dabrowska } 87*dc4d9dc6SAnna Dabrowska 88*dc4d9dc6SAnna Dabrowska return $size; 89*dc4d9dc6SAnna Dabrowska } 90*dc4d9dc6SAnna Dabrowska 91*dc4d9dc6SAnna Dabrowska /** 92*dc4d9dc6SAnna Dabrowska * @inheritdoc 93*dc4d9dc6SAnna Dabrowska * @throws CrossReferenceException 94*dc4d9dc6SAnna Dabrowska * @throws PdfParserException 95*dc4d9dc6SAnna Dabrowska */ 96*dc4d9dc6SAnna Dabrowska protected function _putimages() 97*dc4d9dc6SAnna Dabrowska { 98*dc4d9dc6SAnna Dabrowska $this->currentReaderId = null; 99*dc4d9dc6SAnna Dabrowska parent::_putimages(); 100*dc4d9dc6SAnna Dabrowska 101*dc4d9dc6SAnna Dabrowska foreach ($this->importedPages as $key => $pageData) { 102*dc4d9dc6SAnna Dabrowska $this->_newobj(); 103*dc4d9dc6SAnna Dabrowska $this->importedPages[$key]['objectNumber'] = $this->n; 104*dc4d9dc6SAnna Dabrowska $this->currentReaderId = $pageData['readerId']; 105*dc4d9dc6SAnna Dabrowska $this->writePdfType($pageData['stream']); 106*dc4d9dc6SAnna Dabrowska $this->_put('endobj'); 107*dc4d9dc6SAnna Dabrowska } 108*dc4d9dc6SAnna Dabrowska 109*dc4d9dc6SAnna Dabrowska foreach (\array_keys($this->readers) as $readerId) { 110*dc4d9dc6SAnna Dabrowska $parser = $this->getPdfReader($readerId)->getParser(); 111*dc4d9dc6SAnna Dabrowska $this->currentReaderId = $readerId; 112*dc4d9dc6SAnna Dabrowska 113*dc4d9dc6SAnna Dabrowska while (($objectNumber = \array_pop($this->objectsToCopy[$readerId])) !== null) { 114*dc4d9dc6SAnna Dabrowska try { 115*dc4d9dc6SAnna Dabrowska $object = $parser->getIndirectObject($objectNumber); 116*dc4d9dc6SAnna Dabrowska 117*dc4d9dc6SAnna Dabrowska } catch (CrossReferenceException $e) { 118*dc4d9dc6SAnna Dabrowska if ($e->getCode() === CrossReferenceException::OBJECT_NOT_FOUND) { 119*dc4d9dc6SAnna Dabrowska $object = PdfIndirectObject::create($objectNumber, 0, new PdfNull()); 120*dc4d9dc6SAnna Dabrowska } else { 121*dc4d9dc6SAnna Dabrowska throw $e; 122*dc4d9dc6SAnna Dabrowska } 123*dc4d9dc6SAnna Dabrowska } 124*dc4d9dc6SAnna Dabrowska 125*dc4d9dc6SAnna Dabrowska $this->writePdfType($object); 126*dc4d9dc6SAnna Dabrowska } 127*dc4d9dc6SAnna Dabrowska } 128*dc4d9dc6SAnna Dabrowska 129*dc4d9dc6SAnna Dabrowska $this->currentReaderId = null; 130*dc4d9dc6SAnna Dabrowska } 131*dc4d9dc6SAnna Dabrowska 132*dc4d9dc6SAnna Dabrowska /** 133*dc4d9dc6SAnna Dabrowska * @inheritdoc 134*dc4d9dc6SAnna Dabrowska */ 135*dc4d9dc6SAnna Dabrowska protected function _putxobjectdict() 136*dc4d9dc6SAnna Dabrowska { 137*dc4d9dc6SAnna Dabrowska foreach ($this->importedPages as $key => $pageData) { 138*dc4d9dc6SAnna Dabrowska $this->_put('/' . $pageData['id'] . ' ' . $pageData['objectNumber'] . ' 0 R'); 139*dc4d9dc6SAnna Dabrowska } 140*dc4d9dc6SAnna Dabrowska 141*dc4d9dc6SAnna Dabrowska parent::_putxobjectdict(); 142*dc4d9dc6SAnna Dabrowska } 143*dc4d9dc6SAnna Dabrowska 144*dc4d9dc6SAnna Dabrowska /** 145*dc4d9dc6SAnna Dabrowska * @inheritdoc 146*dc4d9dc6SAnna Dabrowska */ 147*dc4d9dc6SAnna Dabrowska protected function _put($s, $newLine = true) 148*dc4d9dc6SAnna Dabrowska { 149*dc4d9dc6SAnna Dabrowska if ($newLine) { 150*dc4d9dc6SAnna Dabrowska $this->buffer .= $s . "\n"; 151*dc4d9dc6SAnna Dabrowska } else { 152*dc4d9dc6SAnna Dabrowska $this->buffer .= $s; 153*dc4d9dc6SAnna Dabrowska } 154*dc4d9dc6SAnna Dabrowska } 155*dc4d9dc6SAnna Dabrowska} 156