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