xref: /plugin/dw2pdf/vendor/setasign/fpdi/src/FpdfTplTrait.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;
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}