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 Dabrowska/** 13*dc4d9dc6SAnna Dabrowska * Trait FpdfTplTrait 14*dc4d9dc6SAnna Dabrowska * 15*dc4d9dc6SAnna Dabrowska * This class adds a templating feature to tFPDF. 16*dc4d9dc6SAnna Dabrowska * 17*dc4d9dc6SAnna Dabrowska * @package setasign\Fpdi 18*dc4d9dc6SAnna Dabrowska */ 19*dc4d9dc6SAnna Dabrowskatrait FpdfTplTrait 20*dc4d9dc6SAnna Dabrowska{ 21*dc4d9dc6SAnna Dabrowska /** 22*dc4d9dc6SAnna Dabrowska * Data of all created templates. 23*dc4d9dc6SAnna Dabrowska * 24*dc4d9dc6SAnna Dabrowska * @var array 25*dc4d9dc6SAnna Dabrowska */ 26*dc4d9dc6SAnna Dabrowska protected $templates = []; 27*dc4d9dc6SAnna Dabrowska 28*dc4d9dc6SAnna Dabrowska /** 29*dc4d9dc6SAnna Dabrowska * The template id for the currently created template. 30*dc4d9dc6SAnna Dabrowska * 31*dc4d9dc6SAnna Dabrowska * @var null|int 32*dc4d9dc6SAnna Dabrowska */ 33*dc4d9dc6SAnna Dabrowska protected $currentTemplateId; 34*dc4d9dc6SAnna Dabrowska 35*dc4d9dc6SAnna Dabrowska /** 36*dc4d9dc6SAnna Dabrowska * A counter for template ids. 37*dc4d9dc6SAnna Dabrowska * 38*dc4d9dc6SAnna Dabrowska * @var int 39*dc4d9dc6SAnna Dabrowska */ 40*dc4d9dc6SAnna Dabrowska protected $templateId = 0; 41*dc4d9dc6SAnna Dabrowska 42*dc4d9dc6SAnna Dabrowska /** 43*dc4d9dc6SAnna Dabrowska * Set the page format of the current page. 44*dc4d9dc6SAnna Dabrowska * 45*dc4d9dc6SAnna Dabrowska * @param array $size An array with two values defining the size. 46*dc4d9dc6SAnna Dabrowska * @param string $orientation "L" for landscape, "P" for portrait. 47*dc4d9dc6SAnna Dabrowska * @throws \BadMethodCallException 48*dc4d9dc6SAnna Dabrowska */ 49*dc4d9dc6SAnna Dabrowska public function setPageFormat($size, $orientation) 50*dc4d9dc6SAnna Dabrowska { 51*dc4d9dc6SAnna Dabrowska if ($this->currentTemplateId !== null) { 52*dc4d9dc6SAnna Dabrowska throw new \BadMethodCallException('The page format cannot be changed when writing to a template.'); 53*dc4d9dc6SAnna Dabrowska } 54*dc4d9dc6SAnna Dabrowska 55*dc4d9dc6SAnna Dabrowska if (!\in_array($orientation, ['P', 'L'], true)) { 56*dc4d9dc6SAnna Dabrowska throw new \InvalidArgumentException(\sprintf( 57*dc4d9dc6SAnna Dabrowska 'Invalid page orientation "%s"! Only "P" and "L" are allowed!', 58*dc4d9dc6SAnna Dabrowska $orientation 59*dc4d9dc6SAnna Dabrowska )); 60*dc4d9dc6SAnna Dabrowska } 61*dc4d9dc6SAnna Dabrowska 62*dc4d9dc6SAnna Dabrowska $size = $this->_getpagesize($size); 63*dc4d9dc6SAnna Dabrowska 64*dc4d9dc6SAnna Dabrowska if ($orientation != $this->CurOrientation 65*dc4d9dc6SAnna Dabrowska || $size[0] != $this->CurPageSize[0] 66*dc4d9dc6SAnna Dabrowska || $size[1] != $this->CurPageSize[1] 67*dc4d9dc6SAnna Dabrowska ) { 68*dc4d9dc6SAnna Dabrowska // New size or orientation 69*dc4d9dc6SAnna Dabrowska if ($orientation === 'P') { 70*dc4d9dc6SAnna Dabrowska $this->w = $size[0]; 71*dc4d9dc6SAnna Dabrowska $this->h = $size[1]; 72*dc4d9dc6SAnna Dabrowska } else { 73*dc4d9dc6SAnna Dabrowska $this->w = $size[1]; 74*dc4d9dc6SAnna Dabrowska $this->h = $size[0]; 75*dc4d9dc6SAnna Dabrowska } 76*dc4d9dc6SAnna Dabrowska $this->wPt = $this->w * $this->k; 77*dc4d9dc6SAnna Dabrowska $this->hPt = $this->h * $this->k; 78*dc4d9dc6SAnna Dabrowska $this->PageBreakTrigger = $this->h - $this->bMargin; 79*dc4d9dc6SAnna Dabrowska $this->CurOrientation = $orientation; 80*dc4d9dc6SAnna Dabrowska $this->CurPageSize = $size; 81*dc4d9dc6SAnna Dabrowska 82*dc4d9dc6SAnna Dabrowska $this->PageInfo[$this->page]['size'] = array($this->wPt, $this->hPt); 83*dc4d9dc6SAnna Dabrowska } 84*dc4d9dc6SAnna Dabrowska } 85*dc4d9dc6SAnna Dabrowska 86*dc4d9dc6SAnna Dabrowska /** 87*dc4d9dc6SAnna Dabrowska * Draws a template onto the page or another template. 88*dc4d9dc6SAnna Dabrowska * 89*dc4d9dc6SAnna Dabrowska * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the 90*dc4d9dc6SAnna Dabrowska * aspect ratio. 91*dc4d9dc6SAnna Dabrowska * 92*dc4d9dc6SAnna Dabrowska * @param mixed $tpl The template id 93*dc4d9dc6SAnna Dabrowska * @param array|float|int $x The abscissa of upper-left corner. Alternatively you could use an assoc array 94*dc4d9dc6SAnna Dabrowska * with the keys "x", "y", "width", "height", "adjustPageSize". 95*dc4d9dc6SAnna Dabrowska * @param float|int $y The ordinate of upper-left corner. 96*dc4d9dc6SAnna Dabrowska * @param float|int|null $width The width. 97*dc4d9dc6SAnna Dabrowska * @param float|int|null $height The height. 98*dc4d9dc6SAnna Dabrowska * @param bool $adjustPageSize 99*dc4d9dc6SAnna Dabrowska * @return array The size 100*dc4d9dc6SAnna Dabrowska * @see FpdfTplTrait::getTemplateSize() 101*dc4d9dc6SAnna Dabrowska */ 102*dc4d9dc6SAnna Dabrowska public function useTemplate($tpl, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = false) 103*dc4d9dc6SAnna Dabrowska { 104*dc4d9dc6SAnna Dabrowska if (!isset($this->templates[$tpl])) { 105*dc4d9dc6SAnna Dabrowska throw new \InvalidArgumentException('Template does not exist!'); 106*dc4d9dc6SAnna Dabrowska } 107*dc4d9dc6SAnna Dabrowska 108*dc4d9dc6SAnna Dabrowska if (\is_array($x)) { 109*dc4d9dc6SAnna Dabrowska unset($x['tpl']); 110*dc4d9dc6SAnna Dabrowska \extract($x, EXTR_IF_EXISTS); 111*dc4d9dc6SAnna Dabrowska /** @noinspection NotOptimalIfConditionsInspection */ 112*dc4d9dc6SAnna Dabrowska /** @noinspection CallableParameterUseCaseInTypeContextInspection */ 113*dc4d9dc6SAnna Dabrowska if (\is_array($x)) { 114*dc4d9dc6SAnna Dabrowska $x = 0; 115*dc4d9dc6SAnna Dabrowska } 116*dc4d9dc6SAnna Dabrowska } 117*dc4d9dc6SAnna Dabrowska 118*dc4d9dc6SAnna Dabrowska $template = $this->templates[$tpl]; 119*dc4d9dc6SAnna Dabrowska 120*dc4d9dc6SAnna Dabrowska $originalSize = $this->getTemplateSize($tpl); 121*dc4d9dc6SAnna Dabrowska $newSize = $this->getTemplateSize($tpl, $width, $height); 122*dc4d9dc6SAnna Dabrowska if ($adjustPageSize) { 123*dc4d9dc6SAnna Dabrowska $this->setPageFormat($newSize, $newSize['orientation']); 124*dc4d9dc6SAnna Dabrowska } 125*dc4d9dc6SAnna Dabrowska 126*dc4d9dc6SAnna Dabrowska $this->_out( 127*dc4d9dc6SAnna Dabrowska // reset standard values, translate and scale 128*dc4d9dc6SAnna Dabrowska \sprintf( 129*dc4d9dc6SAnna Dabrowska 'q 0 J 1 w 0 j 0 G 0 g %.4F 0 0 %.4F %.4F %.4F cm /%s Do Q', 130*dc4d9dc6SAnna Dabrowska ($newSize['width'] / $originalSize['width']), 131*dc4d9dc6SAnna Dabrowska ($newSize['height'] / $originalSize['height']), 132*dc4d9dc6SAnna Dabrowska $x * $this->k, 133*dc4d9dc6SAnna Dabrowska ($this->h - $y - $newSize['height']) * $this->k, 134*dc4d9dc6SAnna Dabrowska $template['id'] 135*dc4d9dc6SAnna Dabrowska ) 136*dc4d9dc6SAnna Dabrowska ); 137*dc4d9dc6SAnna Dabrowska 138*dc4d9dc6SAnna Dabrowska return $newSize; 139*dc4d9dc6SAnna Dabrowska } 140*dc4d9dc6SAnna Dabrowska 141*dc4d9dc6SAnna Dabrowska /** 142*dc4d9dc6SAnna Dabrowska * Get the size of a template. 143*dc4d9dc6SAnna Dabrowska * 144*dc4d9dc6SAnna Dabrowska * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the 145*dc4d9dc6SAnna Dabrowska * aspect ratio. 146*dc4d9dc6SAnna Dabrowska * 147*dc4d9dc6SAnna Dabrowska * @param mixed $tpl The template id 148*dc4d9dc6SAnna Dabrowska * @param float|int|null $width The width. 149*dc4d9dc6SAnna Dabrowska * @param float|int|null $height The height. 150*dc4d9dc6SAnna Dabrowska * @return array|bool An array with following keys: width, height, 0 (=width), 1 (=height), orientation (L or P) 151*dc4d9dc6SAnna Dabrowska */ 152*dc4d9dc6SAnna Dabrowska public function getTemplateSize($tpl, $width = null, $height = null) 153*dc4d9dc6SAnna Dabrowska { 154*dc4d9dc6SAnna Dabrowska if (!isset($this->templates[$tpl])) { 155*dc4d9dc6SAnna Dabrowska return false; 156*dc4d9dc6SAnna Dabrowska } 157*dc4d9dc6SAnna Dabrowska 158*dc4d9dc6SAnna Dabrowska if ($width === null && $height === null) { 159*dc4d9dc6SAnna Dabrowska $width = $this->templates[$tpl]['width']; 160*dc4d9dc6SAnna Dabrowska $height = $this->templates[$tpl]['height']; 161*dc4d9dc6SAnna Dabrowska } elseif ($width === null) { 162*dc4d9dc6SAnna Dabrowska $width = $height * $this->templates[$tpl]['width'] / $this->templates[$tpl]['height']; 163*dc4d9dc6SAnna Dabrowska } 164*dc4d9dc6SAnna Dabrowska 165*dc4d9dc6SAnna Dabrowska if ($height === null) { 166*dc4d9dc6SAnna Dabrowska $height = $width * $this->templates[$tpl]['height'] / $this->templates[$tpl]['width']; 167*dc4d9dc6SAnna Dabrowska } 168*dc4d9dc6SAnna Dabrowska 169*dc4d9dc6SAnna Dabrowska if ($height <= 0. || $width <= 0.) { 170*dc4d9dc6SAnna Dabrowska throw new \InvalidArgumentException('Width or height parameter needs to be larger than zero.'); 171*dc4d9dc6SAnna Dabrowska } 172*dc4d9dc6SAnna Dabrowska 173*dc4d9dc6SAnna Dabrowska return [ 174*dc4d9dc6SAnna Dabrowska 'width' => $width, 175*dc4d9dc6SAnna Dabrowska 'height' => $height, 176*dc4d9dc6SAnna Dabrowska 0 => $width, 177*dc4d9dc6SAnna Dabrowska 1 => $height, 178*dc4d9dc6SAnna Dabrowska 'orientation' => $width > $height ? 'L' : 'P' 179*dc4d9dc6SAnna Dabrowska ]; 180*dc4d9dc6SAnna Dabrowska } 181*dc4d9dc6SAnna Dabrowska 182*dc4d9dc6SAnna Dabrowska /** 183*dc4d9dc6SAnna Dabrowska * Begins a new template. 184*dc4d9dc6SAnna Dabrowska * 185*dc4d9dc6SAnna Dabrowska * @param float|int|null $width The width of the template. If null, the current page width is used. 186*dc4d9dc6SAnna Dabrowska * @param float|int|null $height The height of the template. If null, the current page height is used. 187*dc4d9dc6SAnna Dabrowska * @param bool $groupXObject Define the form XObject as a group XObject to support transparency (if used). 188*dc4d9dc6SAnna Dabrowska * @return int A template identifier. 189*dc4d9dc6SAnna Dabrowska */ 190*dc4d9dc6SAnna Dabrowska public function beginTemplate($width = null, $height = null, $groupXObject = false) 191*dc4d9dc6SAnna Dabrowska { 192*dc4d9dc6SAnna Dabrowska if ($width === null) { 193*dc4d9dc6SAnna Dabrowska $width = $this->w; 194*dc4d9dc6SAnna Dabrowska } 195*dc4d9dc6SAnna Dabrowska 196*dc4d9dc6SAnna Dabrowska if ($height === null) { 197*dc4d9dc6SAnna Dabrowska $height = $this->h; 198*dc4d9dc6SAnna Dabrowska } 199*dc4d9dc6SAnna Dabrowska 200*dc4d9dc6SAnna Dabrowska $templateId = $this->getNextTemplateId(); 201*dc4d9dc6SAnna Dabrowska 202*dc4d9dc6SAnna Dabrowska // initiate buffer with current state of FPDF 203*dc4d9dc6SAnna Dabrowska $buffer = "2 J\n" 204*dc4d9dc6SAnna Dabrowska . \sprintf('%.2F w', $this->LineWidth * $this->k) . "\n"; 205*dc4d9dc6SAnna Dabrowska 206*dc4d9dc6SAnna Dabrowska if ($this->FontFamily) { 207*dc4d9dc6SAnna Dabrowska $buffer .= \sprintf("BT /F%d %.2F Tf ET\n", $this->CurrentFont['i'], $this->FontSizePt); 208*dc4d9dc6SAnna Dabrowska } 209*dc4d9dc6SAnna Dabrowska 210*dc4d9dc6SAnna Dabrowska if ($this->DrawColor !== '0 G') { 211*dc4d9dc6SAnna Dabrowska $buffer .= $this->DrawColor . "\n"; 212*dc4d9dc6SAnna Dabrowska } 213*dc4d9dc6SAnna Dabrowska if ($this->FillColor !== '0 g') { 214*dc4d9dc6SAnna Dabrowska $buffer .= $this->FillColor . "\n"; 215*dc4d9dc6SAnna Dabrowska } 216*dc4d9dc6SAnna Dabrowska 217*dc4d9dc6SAnna Dabrowska if ($groupXObject && \version_compare('1.4', $this->PDFVersion, '>')) { 218*dc4d9dc6SAnna Dabrowska $this->PDFVersion = '1.4'; 219*dc4d9dc6SAnna Dabrowska } 220*dc4d9dc6SAnna Dabrowska 221*dc4d9dc6SAnna Dabrowska $this->templates[$templateId] = [ 222*dc4d9dc6SAnna Dabrowska 'objectNumber' => null, 223*dc4d9dc6SAnna Dabrowska 'id' => 'TPL' . $templateId, 224*dc4d9dc6SAnna Dabrowska 'buffer' => $buffer, 225*dc4d9dc6SAnna Dabrowska 'width' => $width, 226*dc4d9dc6SAnna Dabrowska 'height' => $height, 227*dc4d9dc6SAnna Dabrowska 'groupXObject' => $groupXObject, 228*dc4d9dc6SAnna Dabrowska 'state' => [ 229*dc4d9dc6SAnna Dabrowska 'x' => $this->x, 230*dc4d9dc6SAnna Dabrowska 'y' => $this->y, 231*dc4d9dc6SAnna Dabrowska 'AutoPageBreak' => $this->AutoPageBreak, 232*dc4d9dc6SAnna Dabrowska 'bMargin' => $this->bMargin, 233*dc4d9dc6SAnna Dabrowska 'tMargin' => $this->tMargin, 234*dc4d9dc6SAnna Dabrowska 'lMargin' => $this->lMargin, 235*dc4d9dc6SAnna Dabrowska 'rMargin' => $this->rMargin, 236*dc4d9dc6SAnna Dabrowska 'h' => $this->h, 237*dc4d9dc6SAnna Dabrowska 'w' => $this->w, 238*dc4d9dc6SAnna Dabrowska 'FontFamily' => $this->FontFamily, 239*dc4d9dc6SAnna Dabrowska 'FontStyle' => $this->FontStyle, 240*dc4d9dc6SAnna Dabrowska 'FontSizePt' => $this->FontSizePt, 241*dc4d9dc6SAnna Dabrowska 'FontSize' => $this->FontSize, 242*dc4d9dc6SAnna Dabrowska 'underline' => $this->underline, 243*dc4d9dc6SAnna Dabrowska 'TextColor' => $this->TextColor, 244*dc4d9dc6SAnna Dabrowska 'DrawColor' => $this->DrawColor, 245*dc4d9dc6SAnna Dabrowska 'FillColor' => $this->FillColor, 246*dc4d9dc6SAnna Dabrowska 'ColorFlag' => $this->ColorFlag 247*dc4d9dc6SAnna Dabrowska ] 248*dc4d9dc6SAnna Dabrowska ]; 249*dc4d9dc6SAnna Dabrowska 250*dc4d9dc6SAnna Dabrowska $this->SetAutoPageBreak(false); 251*dc4d9dc6SAnna Dabrowska $this->currentTemplateId = $templateId; 252*dc4d9dc6SAnna Dabrowska 253*dc4d9dc6SAnna Dabrowska $this->h = $height; 254*dc4d9dc6SAnna Dabrowska $this->w = $width; 255*dc4d9dc6SAnna Dabrowska 256*dc4d9dc6SAnna Dabrowska $this->SetXY($this->lMargin, $this->tMargin); 257*dc4d9dc6SAnna Dabrowska $this->SetRightMargin($this->w - $width + $this->rMargin); 258*dc4d9dc6SAnna Dabrowska 259*dc4d9dc6SAnna Dabrowska return $templateId; 260*dc4d9dc6SAnna Dabrowska } 261*dc4d9dc6SAnna Dabrowska 262*dc4d9dc6SAnna Dabrowska /** 263*dc4d9dc6SAnna Dabrowska * Ends a template. 264*dc4d9dc6SAnna Dabrowska * 265*dc4d9dc6SAnna Dabrowska * @return bool|int|null A template identifier. 266*dc4d9dc6SAnna Dabrowska */ 267*dc4d9dc6SAnna Dabrowska public function endTemplate() 268*dc4d9dc6SAnna Dabrowska { 269*dc4d9dc6SAnna Dabrowska if (null === $this->currentTemplateId) { 270*dc4d9dc6SAnna Dabrowska return false; 271*dc4d9dc6SAnna Dabrowska } 272*dc4d9dc6SAnna Dabrowska 273*dc4d9dc6SAnna Dabrowska $templateId = $this->currentTemplateId; 274*dc4d9dc6SAnna Dabrowska $template = $this->templates[$templateId]; 275*dc4d9dc6SAnna Dabrowska 276*dc4d9dc6SAnna Dabrowska $state = $template['state']; 277*dc4d9dc6SAnna Dabrowska $this->SetXY($state['x'], $state['y']); 278*dc4d9dc6SAnna Dabrowska $this->tMargin = $state['tMargin']; 279*dc4d9dc6SAnna Dabrowska $this->lMargin = $state['lMargin']; 280*dc4d9dc6SAnna Dabrowska $this->rMargin = $state['rMargin']; 281*dc4d9dc6SAnna Dabrowska $this->h = $state['h']; 282*dc4d9dc6SAnna Dabrowska $this->w = $state['w']; 283*dc4d9dc6SAnna Dabrowska $this->SetAutoPageBreak($state['AutoPageBreak'], $state['bMargin']); 284*dc4d9dc6SAnna Dabrowska 285*dc4d9dc6SAnna Dabrowska $this->FontFamily = $state['FontFamily']; 286*dc4d9dc6SAnna Dabrowska $this->FontStyle = $state['FontStyle']; 287*dc4d9dc6SAnna Dabrowska $this->FontSizePt = $state['FontSizePt']; 288*dc4d9dc6SAnna Dabrowska $this->FontSize = $state['FontSize']; 289*dc4d9dc6SAnna Dabrowska 290*dc4d9dc6SAnna Dabrowska $this->TextColor = $state['TextColor']; 291*dc4d9dc6SAnna Dabrowska $this->DrawColor = $state['DrawColor']; 292*dc4d9dc6SAnna Dabrowska $this->FillColor = $state['FillColor']; 293*dc4d9dc6SAnna Dabrowska $this->ColorFlag = $state['ColorFlag']; 294*dc4d9dc6SAnna Dabrowska 295*dc4d9dc6SAnna Dabrowska $this->underline = $state['underline']; 296*dc4d9dc6SAnna Dabrowska 297*dc4d9dc6SAnna Dabrowska $fontKey = $this->FontFamily . $this->FontStyle; 298*dc4d9dc6SAnna Dabrowska if ($fontKey) { 299*dc4d9dc6SAnna Dabrowska $this->CurrentFont =& $this->fonts[$fontKey]; 300*dc4d9dc6SAnna Dabrowska } else { 301*dc4d9dc6SAnna Dabrowska unset($this->CurrentFont); 302*dc4d9dc6SAnna Dabrowska } 303*dc4d9dc6SAnna Dabrowska 304*dc4d9dc6SAnna Dabrowska $this->currentTemplateId = null; 305*dc4d9dc6SAnna Dabrowska 306*dc4d9dc6SAnna Dabrowska return $templateId; 307*dc4d9dc6SAnna Dabrowska } 308*dc4d9dc6SAnna Dabrowska 309*dc4d9dc6SAnna Dabrowska /** 310*dc4d9dc6SAnna Dabrowska * Get the next template id. 311*dc4d9dc6SAnna Dabrowska * 312*dc4d9dc6SAnna Dabrowska * @return int 313*dc4d9dc6SAnna Dabrowska */ 314*dc4d9dc6SAnna Dabrowska protected function getNextTemplateId() 315*dc4d9dc6SAnna Dabrowska { 316*dc4d9dc6SAnna Dabrowska return $this->templateId++; 317*dc4d9dc6SAnna Dabrowska } 318*dc4d9dc6SAnna Dabrowska 319*dc4d9dc6SAnna Dabrowska /* overwritten FPDF methods: */ 320*dc4d9dc6SAnna Dabrowska 321*dc4d9dc6SAnna Dabrowska /** 322*dc4d9dc6SAnna Dabrowska * @inheritdoc 323*dc4d9dc6SAnna Dabrowska */ 324*dc4d9dc6SAnna Dabrowska public function AddPage($orientation = '', $size = '', $rotation = 0) 325*dc4d9dc6SAnna Dabrowska { 326*dc4d9dc6SAnna Dabrowska if ($this->currentTemplateId !== null) { 327*dc4d9dc6SAnna Dabrowska throw new \BadMethodCallException('Pages cannot be added when writing to a template.'); 328*dc4d9dc6SAnna Dabrowska } 329*dc4d9dc6SAnna Dabrowska parent::AddPage($orientation, $size, $rotation); 330*dc4d9dc6SAnna Dabrowska } 331*dc4d9dc6SAnna Dabrowska 332*dc4d9dc6SAnna Dabrowska /** 333*dc4d9dc6SAnna Dabrowska * @inheritdoc 334*dc4d9dc6SAnna Dabrowska */ 335*dc4d9dc6SAnna Dabrowska public function Link($x, $y, $w, $h, $link) 336*dc4d9dc6SAnna Dabrowska { 337*dc4d9dc6SAnna Dabrowska if ($this->currentTemplateId !== null) { 338*dc4d9dc6SAnna Dabrowska throw new \BadMethodCallException('Links cannot be set when writing to a template.'); 339*dc4d9dc6SAnna Dabrowska } 340*dc4d9dc6SAnna Dabrowska parent::Link($x, $y, $w, $h, $link); 341*dc4d9dc6SAnna Dabrowska } 342*dc4d9dc6SAnna Dabrowska 343*dc4d9dc6SAnna Dabrowska /** 344*dc4d9dc6SAnna Dabrowska * @inheritdoc 345*dc4d9dc6SAnna Dabrowska */ 346*dc4d9dc6SAnna Dabrowska public function SetLink($link, $y = 0, $page = -1) 347*dc4d9dc6SAnna Dabrowska { 348*dc4d9dc6SAnna Dabrowska if ($this->currentTemplateId !== null) { 349*dc4d9dc6SAnna Dabrowska throw new \BadMethodCallException('Links cannot be set when writing to a template.'); 350*dc4d9dc6SAnna Dabrowska } 351*dc4d9dc6SAnna Dabrowska return parent::SetLink($link, $y, $page); 352*dc4d9dc6SAnna Dabrowska } 353*dc4d9dc6SAnna Dabrowska 354*dc4d9dc6SAnna Dabrowska /** 355*dc4d9dc6SAnna Dabrowska * @inheritdoc 356*dc4d9dc6SAnna Dabrowska */ 357*dc4d9dc6SAnna Dabrowska public function SetDrawColor($r, $g = null, $b = null) 358*dc4d9dc6SAnna Dabrowska { 359*dc4d9dc6SAnna Dabrowska parent::SetDrawColor($r, $g, $b); 360*dc4d9dc6SAnna Dabrowska if ($this->page === 0 && $this->currentTemplateId !== null) { 361*dc4d9dc6SAnna Dabrowska $this->_out($this->DrawColor); 362*dc4d9dc6SAnna Dabrowska } 363*dc4d9dc6SAnna Dabrowska } 364*dc4d9dc6SAnna Dabrowska 365*dc4d9dc6SAnna Dabrowska /** 366*dc4d9dc6SAnna Dabrowska * @inheritdoc 367*dc4d9dc6SAnna Dabrowska */ 368*dc4d9dc6SAnna Dabrowska public function SetFillColor($r, $g = null, $b = null) 369*dc4d9dc6SAnna Dabrowska { 370*dc4d9dc6SAnna Dabrowska parent::SetFillColor($r, $g, $b); 371*dc4d9dc6SAnna Dabrowska if ($this->page === 0 && $this->currentTemplateId !== null) { 372*dc4d9dc6SAnna Dabrowska $this->_out($this->FillColor); 373*dc4d9dc6SAnna Dabrowska } 374*dc4d9dc6SAnna Dabrowska } 375*dc4d9dc6SAnna Dabrowska 376*dc4d9dc6SAnna Dabrowska /** 377*dc4d9dc6SAnna Dabrowska * @inheritdoc 378*dc4d9dc6SAnna Dabrowska */ 379*dc4d9dc6SAnna Dabrowska public function SetLineWidth($width) 380*dc4d9dc6SAnna Dabrowska { 381*dc4d9dc6SAnna Dabrowska parent::SetLineWidth($width); 382*dc4d9dc6SAnna Dabrowska if ($this->page === 0 && $this->currentTemplateId !== null) { 383*dc4d9dc6SAnna Dabrowska $this->_out(\sprintf('%.2F w', $width * $this->k)); 384*dc4d9dc6SAnna Dabrowska } 385*dc4d9dc6SAnna Dabrowska } 386*dc4d9dc6SAnna Dabrowska 387*dc4d9dc6SAnna Dabrowska /** 388*dc4d9dc6SAnna Dabrowska * @inheritdoc 389*dc4d9dc6SAnna Dabrowska */ 390*dc4d9dc6SAnna Dabrowska public function SetFont($family, $style = '', $size = 0) 391*dc4d9dc6SAnna Dabrowska { 392*dc4d9dc6SAnna Dabrowska parent::SetFont($family, $style, $size); 393*dc4d9dc6SAnna Dabrowska if ($this->page === 0 && $this->currentTemplateId !== null) { 394*dc4d9dc6SAnna Dabrowska $this->_out(\sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); 395*dc4d9dc6SAnna Dabrowska } 396*dc4d9dc6SAnna Dabrowska } 397*dc4d9dc6SAnna Dabrowska 398*dc4d9dc6SAnna Dabrowska /** 399*dc4d9dc6SAnna Dabrowska * @inheritdoc 400*dc4d9dc6SAnna Dabrowska */ 401*dc4d9dc6SAnna Dabrowska public function SetFontSize($size) 402*dc4d9dc6SAnna Dabrowska { 403*dc4d9dc6SAnna Dabrowska parent::SetFontSize($size); 404*dc4d9dc6SAnna Dabrowska if ($this->page === 0 && $this->currentTemplateId !== null) { 405*dc4d9dc6SAnna Dabrowska $this->_out(sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); 406*dc4d9dc6SAnna Dabrowska } 407*dc4d9dc6SAnna Dabrowska } 408*dc4d9dc6SAnna Dabrowska 409*dc4d9dc6SAnna Dabrowska /** 410*dc4d9dc6SAnna Dabrowska * @inheritdoc 411*dc4d9dc6SAnna Dabrowska */ 412*dc4d9dc6SAnna Dabrowska protected function _putimages() 413*dc4d9dc6SAnna Dabrowska { 414*dc4d9dc6SAnna Dabrowska parent::_putimages(); 415*dc4d9dc6SAnna Dabrowska 416*dc4d9dc6SAnna Dabrowska foreach ($this->templates as $key => $template) { 417*dc4d9dc6SAnna Dabrowska $this->_newobj(); 418*dc4d9dc6SAnna Dabrowska $this->templates[$key]['objectNumber'] = $this->n; 419*dc4d9dc6SAnna Dabrowska 420*dc4d9dc6SAnna Dabrowska $this->_put('<</Type /XObject /Subtype /Form /FormType 1'); 421*dc4d9dc6SAnna Dabrowska $this->_put(\sprintf('/BBox[0 0 %.2F %.2F]', $template['width'] * $this->k, $template['height'] * $this->k)); 422*dc4d9dc6SAnna Dabrowska $this->_put('/Resources 2 0 R'); // default resources dictionary of FPDF 423*dc4d9dc6SAnna Dabrowska 424*dc4d9dc6SAnna Dabrowska if ($this->compress) { 425*dc4d9dc6SAnna Dabrowska $buffer = \gzcompress($template['buffer']); 426*dc4d9dc6SAnna Dabrowska $this->_put('/Filter/FlateDecode'); 427*dc4d9dc6SAnna Dabrowska } else { 428*dc4d9dc6SAnna Dabrowska $buffer = $template['buffer']; 429*dc4d9dc6SAnna Dabrowska } 430*dc4d9dc6SAnna Dabrowska 431*dc4d9dc6SAnna Dabrowska $this->_put('/Length ' . \strlen($buffer)); 432*dc4d9dc6SAnna Dabrowska 433*dc4d9dc6SAnna Dabrowska if ($template['groupXObject']) { 434*dc4d9dc6SAnna Dabrowska $this->_put('/Group <</Type/Group/S/Transparency>>'); 435*dc4d9dc6SAnna Dabrowska } 436*dc4d9dc6SAnna Dabrowska 437*dc4d9dc6SAnna Dabrowska $this->_put('>>'); 438*dc4d9dc6SAnna Dabrowska $this->_putstream($buffer); 439*dc4d9dc6SAnna Dabrowska $this->_put('endobj'); 440*dc4d9dc6SAnna Dabrowska } 441*dc4d9dc6SAnna Dabrowska } 442*dc4d9dc6SAnna Dabrowska 443*dc4d9dc6SAnna Dabrowska /** 444*dc4d9dc6SAnna Dabrowska * @inheritdoc 445*dc4d9dc6SAnna Dabrowska */ 446*dc4d9dc6SAnna Dabrowska protected function _putxobjectdict() 447*dc4d9dc6SAnna Dabrowska { 448*dc4d9dc6SAnna Dabrowska foreach ($this->templates as $key => $template) { 449*dc4d9dc6SAnna Dabrowska $this->_put('/' . $template['id'] . ' ' . $template['objectNumber'] . ' 0 R'); 450*dc4d9dc6SAnna Dabrowska } 451*dc4d9dc6SAnna Dabrowska 452*dc4d9dc6SAnna Dabrowska parent::_putxobjectdict(); 453*dc4d9dc6SAnna Dabrowska } 454*dc4d9dc6SAnna Dabrowska 455*dc4d9dc6SAnna Dabrowska /** 456*dc4d9dc6SAnna Dabrowska * @inheritdoc 457*dc4d9dc6SAnna Dabrowska */ 458*dc4d9dc6SAnna Dabrowska public function _out($s) 459*dc4d9dc6SAnna Dabrowska { 460*dc4d9dc6SAnna Dabrowska if ($this->currentTemplateId !== null) { 461*dc4d9dc6SAnna Dabrowska $this->templates[$this->currentTemplateId]['buffer'] .= $s . "\n"; 462*dc4d9dc6SAnna Dabrowska } else { 463*dc4d9dc6SAnna Dabrowska parent::_out($s); 464*dc4d9dc6SAnna Dabrowska } 465*dc4d9dc6SAnna Dabrowska } 466*dc4d9dc6SAnna Dabrowska}