xref: /webtrees/app/Report/PdfRenderer.php (revision ceab9748a7c11244030d33fbda589872b29688e2)
1b6f35a76SGreg Roach<?php
2b6f35a76SGreg Roach
3b6f35a76SGreg Roach/**
4b6f35a76SGreg Roach * webtrees: online genealogy
589f7189bSGreg Roach * Copyright (C) 2021 webtrees development team
6b6f35a76SGreg Roach * This program is free software: you can redistribute it and/or modify
7b6f35a76SGreg Roach * it under the terms of the GNU General Public License as published by
8b6f35a76SGreg Roach * the Free Software Foundation, either version 3 of the License, or
9b6f35a76SGreg Roach * (at your option) any later version.
10b6f35a76SGreg Roach * This program is distributed in the hope that it will be useful,
11b6f35a76SGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
12b6f35a76SGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13b6f35a76SGreg Roach * GNU General Public License for more details.
14b6f35a76SGreg Roach * You should have received a copy of the GNU General Public License
1589f7189bSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>.
16b6f35a76SGreg Roach */
17b6f35a76SGreg Roach
18b6f35a76SGreg Roachdeclare(strict_types=1);
19b6f35a76SGreg Roach
20b6f35a76SGreg Roachnamespace Fisharebest\Webtrees\Report;
21b6f35a76SGreg Roach
22b6f35a76SGreg Roachuse Fisharebest\Webtrees\MediaFile;
23b6f35a76SGreg Roachuse Fisharebest\Webtrees\Webtrees;
24f7cf8a15SGreg Roachuse League\Flysystem\FilesystemOperator;
25b6f35a76SGreg Roach
26b6f35a76SGreg Roachuse function count;
27b6f35a76SGreg Roach
28b6f35a76SGreg Roach/**
29b6f35a76SGreg Roach * Class PdfRenderer
30b6f35a76SGreg Roach */
31b6f35a76SGreg Roachclass PdfRenderer extends AbstractRenderer
32b6f35a76SGreg Roach{
33b6f35a76SGreg Roach    /**
34b6f35a76SGreg Roach     * PDF compression - Zlib extension is required
35b6f35a76SGreg Roach     *
36b6f35a76SGreg Roach     * @var bool const
37b6f35a76SGreg Roach     */
38b6f35a76SGreg Roach    private const COMPRESSION = true;
39b6f35a76SGreg Roach
40b6f35a76SGreg Roach    /**
41b6f35a76SGreg Roach     * If true reduce the RAM memory usage by caching temporary data on filesystem (slower).
42b6f35a76SGreg Roach     *
43b6f35a76SGreg Roach     * @var bool const
44b6f35a76SGreg Roach     */
45b6f35a76SGreg Roach    private const DISK_CACHE = false;
46b6f35a76SGreg Roach
47b6f35a76SGreg Roach    /**
48b6f35a76SGreg Roach     * true means that the input text is unicode (PDF)
49b6f35a76SGreg Roach     *
50b6f35a76SGreg Roach     * @var bool const
51b6f35a76SGreg Roach     */
52b6f35a76SGreg Roach    private const UNICODE = true;
53b6f35a76SGreg Roach
54345fcc8aSGreg Roach    // Font sub-setting in TCPDF is slow.
55b6f35a76SGreg Roach    private const SUBSETTING = false;
56b6f35a76SGreg Roach
57345fcc8aSGreg Roach    public TcpdfWrapper $tcpdf;
58b6f35a76SGreg Roach
59345fcc8aSGreg Roach    /** @var array<ReportPdfFootnote> Array of elements in the footer notes */
60345fcc8aSGreg Roach    public array $printedfootnotes = [];
61b6f35a76SGreg Roach
62b6f35a76SGreg Roach    /** @var float The last cell height */
63345fcc8aSGreg Roach    public float $lastCellHeight = 0.0;
64b6f35a76SGreg Roach
65b6f35a76SGreg Roach    /** @var float The largest font size within a TextBox to calculate the height */
66345fcc8aSGreg Roach    public float $largestFontHeight = 0.0;
67b6f35a76SGreg Roach
68b6f35a76SGreg Roach    /** @var int The last pictures page number */
69345fcc8aSGreg Roach    public int $lastpicpage = 0;
70b6f35a76SGreg Roach
71b6f35a76SGreg Roach    /** @var PdfRenderer The current report. */
72b6f35a76SGreg Roach    public $wt_report;
73b6f35a76SGreg Roach
74b6f35a76SGreg Roach    /**
75b6f35a76SGreg Roach     * PDF Header -PDF
76b6f35a76SGreg Roach     *
77b6f35a76SGreg Roach     * @return void
78b6f35a76SGreg Roach     */
79b6f35a76SGreg Roach    public function header(): void
80b6f35a76SGreg Roach    {
81b6f35a76SGreg Roach        foreach ($this->headerElements as $element) {
82b6f35a76SGreg Roach            if ($element instanceof ReportBaseElement) {
83b6f35a76SGreg Roach                $element->render($this);
84b6f35a76SGreg Roach            } elseif ($element === 'footnotetexts') {
85b6f35a76SGreg Roach                $this->footnotes();
86b6f35a76SGreg Roach            } elseif ($element === 'addpage') {
87b6f35a76SGreg Roach                $this->newPage();
88b6f35a76SGreg Roach            }
89b6f35a76SGreg Roach        }
90b6f35a76SGreg Roach    }
91b6f35a76SGreg Roach
92b6f35a76SGreg Roach    /**
93b6f35a76SGreg Roach     * PDF Body -PDF
94b6f35a76SGreg Roach     *
95b6f35a76SGreg Roach     * @return void
96b6f35a76SGreg Roach     */
97b6f35a76SGreg Roach    public function body(): void
98b6f35a76SGreg Roach    {
99b6f35a76SGreg Roach        $this->tcpdf->AddPage();
100b6f35a76SGreg Roach
101b6f35a76SGreg Roach        foreach ($this->bodyElements as $key => $element) {
102b6f35a76SGreg Roach            if ($element instanceof ReportBaseElement) {
103b6f35a76SGreg Roach                $element->render($this);
104b6f35a76SGreg Roach            } elseif ($element === 'footnotetexts') {
105b6f35a76SGreg Roach                $this->footnotes();
106b6f35a76SGreg Roach            } elseif ($element === 'addpage') {
107b6f35a76SGreg Roach                $this->newPage();
108b6f35a76SGreg Roach            }
109b6f35a76SGreg Roach        }
110b6f35a76SGreg Roach    }
111b6f35a76SGreg Roach
112b6f35a76SGreg Roach    /**
113b6f35a76SGreg Roach     * PDF Footnotes -PDF
114b6f35a76SGreg Roach     *
115b6f35a76SGreg Roach     * @return void
116b6f35a76SGreg Roach     */
117b6f35a76SGreg Roach    public function footnotes(): void
118b6f35a76SGreg Roach    {
119b6f35a76SGreg Roach        foreach ($this->printedfootnotes as $element) {
12052135727SGreg Roach            if ($this->tcpdf->GetY() + $element->getFootnoteHeight($this) > $this->tcpdf->getPageHeight()) {
121b6f35a76SGreg Roach                $this->tcpdf->AddPage();
122b6f35a76SGreg Roach            }
123b6f35a76SGreg Roach
124b6f35a76SGreg Roach            $element->renderFootnote($this);
125b6f35a76SGreg Roach
126b6f35a76SGreg Roach            if ($this->tcpdf->GetY() > $this->tcpdf->getPageHeight()) {
127b6f35a76SGreg Roach                $this->tcpdf->AddPage();
128b6f35a76SGreg Roach            }
129b6f35a76SGreg Roach        }
130b6f35a76SGreg Roach    }
131b6f35a76SGreg Roach
132b6f35a76SGreg Roach    /**
133b6f35a76SGreg Roach     * PDF Footer -PDF
134b6f35a76SGreg Roach     *
135b6f35a76SGreg Roach     * @return void
136b6f35a76SGreg Roach     */
137b6f35a76SGreg Roach    public function footer(): void
138b6f35a76SGreg Roach    {
139b6f35a76SGreg Roach        foreach ($this->footerElements as $element) {
140b6f35a76SGreg Roach            if ($element instanceof ReportBaseElement) {
141b6f35a76SGreg Roach                $element->render($this);
142b6f35a76SGreg Roach            } elseif ($element === 'footnotetexts') {
143b6f35a76SGreg Roach                $this->footnotes();
144b6f35a76SGreg Roach            } elseif ($element === 'addpage') {
145b6f35a76SGreg Roach                $this->newPage();
146b6f35a76SGreg Roach            }
147b6f35a76SGreg Roach        }
148b6f35a76SGreg Roach    }
149b6f35a76SGreg Roach
150b6f35a76SGreg Roach    /**
151b6f35a76SGreg Roach     * Remove the header.
152b6f35a76SGreg Roach     *
153b6f35a76SGreg Roach     * @param int $index
154b6f35a76SGreg Roach     *
155b6f35a76SGreg Roach     * @return void
156b6f35a76SGreg Roach     */
157b6f35a76SGreg Roach    public function removeHeader(int $index): void
158b6f35a76SGreg Roach    {
159b6f35a76SGreg Roach        unset($this->headerElements[$index]);
160b6f35a76SGreg Roach    }
161b6f35a76SGreg Roach
162b6f35a76SGreg Roach    /**
163b6f35a76SGreg Roach     * Remove the body.
164b6f35a76SGreg Roach     *
165b6f35a76SGreg Roach     * @param int $index
166b6f35a76SGreg Roach     *
167b6f35a76SGreg Roach     * @return void
168b6f35a76SGreg Roach     */
169b6f35a76SGreg Roach    public function removeBody(int $index): void
170b6f35a76SGreg Roach    {
171b6f35a76SGreg Roach        unset($this->bodyElements[$index]);
172b6f35a76SGreg Roach    }
173b6f35a76SGreg Roach
174b6f35a76SGreg Roach    /**
175b6f35a76SGreg Roach     * Remove the footer.
176b6f35a76SGreg Roach     *
177b6f35a76SGreg Roach     * @param int $index
178b6f35a76SGreg Roach     *
179b6f35a76SGreg Roach     * @return void
180b6f35a76SGreg Roach     */
181b6f35a76SGreg Roach    public function removeFooter(int $index): void
182b6f35a76SGreg Roach    {
183b6f35a76SGreg Roach        unset($this->footerElements[$index]);
184b6f35a76SGreg Roach    }
185b6f35a76SGreg Roach
186b6f35a76SGreg Roach    /**
187b6f35a76SGreg Roach     * Clear the Header -PDF
188b6f35a76SGreg Roach     *
189b6f35a76SGreg Roach     * @return void
190b6f35a76SGreg Roach     */
191b6f35a76SGreg Roach    public function clearHeader(): void
192b6f35a76SGreg Roach    {
193b6f35a76SGreg Roach        unset($this->headerElements);
194b6f35a76SGreg Roach        $this->headerElements = [];
195b6f35a76SGreg Roach    }
196b6f35a76SGreg Roach
197b6f35a76SGreg Roach    /**
198b6f35a76SGreg Roach     * Get the currently used style name -PDF
199b6f35a76SGreg Roach     *
200b6f35a76SGreg Roach     * @return string
201b6f35a76SGreg Roach     */
202b6f35a76SGreg Roach    public function getCurrentStyle(): string
203b6f35a76SGreg Roach    {
204b6f35a76SGreg Roach        return $this->currentStyle;
205b6f35a76SGreg Roach    }
206b6f35a76SGreg Roach
207b6f35a76SGreg Roach    /**
208b6f35a76SGreg Roach     * Setup a style for usage -PDF
209b6f35a76SGreg Roach     *
210b6f35a76SGreg Roach     * @param string $s Style name
211b6f35a76SGreg Roach     *
212b6f35a76SGreg Roach     * @return void
213b6f35a76SGreg Roach     */
214b6f35a76SGreg Roach    public function setCurrentStyle(string $s): void
215b6f35a76SGreg Roach    {
216b6f35a76SGreg Roach        $this->currentStyle = $s;
217*ceab9748SGreg Roach        $style              = $this->getStyle($s);
218b6f35a76SGreg Roach        $this->tcpdf->SetFont($style['font'], $style['style'], $style['size']);
219b6f35a76SGreg Roach    }
220b6f35a76SGreg Roach
221b6f35a76SGreg Roach    /**
222b6f35a76SGreg Roach     * Get the style -PDF
223b6f35a76SGreg Roach     *
224b6f35a76SGreg Roach     * @param string $s Style name
225b6f35a76SGreg Roach     *
226b6f35a76SGreg Roach     * @return array
227b6f35a76SGreg Roach     */
228b6f35a76SGreg Roach    public function getStyle(string $s): array
229b6f35a76SGreg Roach    {
230*ceab9748SGreg Roach        if (!isset($this->styles[$s])) {
231b6f35a76SGreg Roach            $s                = $this->getCurrentStyle();
232*ceab9748SGreg Roach            $this->styles[$s] = $s;
233b6f35a76SGreg Roach        }
234b6f35a76SGreg Roach
235*ceab9748SGreg Roach        return $this->styles[$s];
236b6f35a76SGreg Roach    }
237b6f35a76SGreg Roach
238b6f35a76SGreg Roach    /**
239b6f35a76SGreg Roach     * Add margin when static horizontal position is used -PDF
240b6f35a76SGreg Roach     * RTL supported
241b6f35a76SGreg Roach     *
242b6f35a76SGreg Roach     * @param float $x Static position
243b6f35a76SGreg Roach     *
244b6f35a76SGreg Roach     * @return float
245b6f35a76SGreg Roach     */
246b6f35a76SGreg Roach    public function addMarginX(float $x): float
247b6f35a76SGreg Roach    {
248b6f35a76SGreg Roach        $m = $this->tcpdf->getMargins();
249b6f35a76SGreg Roach        if ($this->tcpdf->getRTL()) {
250b6f35a76SGreg Roach            $x += $m['right'];
251b6f35a76SGreg Roach        } else {
252b6f35a76SGreg Roach            $x += $m['left'];
253b6f35a76SGreg Roach        }
254b6f35a76SGreg Roach        $this->tcpdf->SetX($x);
255b6f35a76SGreg Roach
256b6f35a76SGreg Roach        return $x;
257b6f35a76SGreg Roach    }
258b6f35a76SGreg Roach
259b6f35a76SGreg Roach    /**
260b6f35a76SGreg Roach     * Get the maximum line width to draw from the curren position -PDF
261b6f35a76SGreg Roach     * RTL supported
262b6f35a76SGreg Roach     *
263b6f35a76SGreg Roach     * @return float
264b6f35a76SGreg Roach     */
265b6f35a76SGreg Roach    public function getMaxLineWidth(): float
266b6f35a76SGreg Roach    {
267b6f35a76SGreg Roach        $m = $this->tcpdf->getMargins();
268b6f35a76SGreg Roach        if ($this->tcpdf->getRTL()) {
26952135727SGreg Roach            return $this->tcpdf->getRemainingWidth() + $m['right'];
270b6f35a76SGreg Roach        }
271b6f35a76SGreg Roach
27252135727SGreg Roach        return $this->tcpdf->getRemainingWidth() + $m['left'];
273b6f35a76SGreg Roach    }
274b6f35a76SGreg Roach
275b6f35a76SGreg Roach    /**
276b6f35a76SGreg Roach     * Get the height of the footnote.
277b6f35a76SGreg Roach     *
278b6f35a76SGreg Roach     * @return float
279b6f35a76SGreg Roach     */
280b6f35a76SGreg Roach    public function getFootnotesHeight(): float
281b6f35a76SGreg Roach    {
282b6f35a76SGreg Roach        $h = 0;
283b6f35a76SGreg Roach        foreach ($this->printedfootnotes as $element) {
284b6f35a76SGreg Roach            $h += $element->getHeight($this);
285b6f35a76SGreg Roach        }
286b6f35a76SGreg Roach
287b6f35a76SGreg Roach        return $h;
288b6f35a76SGreg Roach    }
289b6f35a76SGreg Roach
290b6f35a76SGreg Roach    /**
291b6f35a76SGreg Roach     * Returns the the current font size height -PDF
292b6f35a76SGreg Roach     *
293b6f35a76SGreg Roach     * @return float
294b6f35a76SGreg Roach     */
295b6f35a76SGreg Roach    public function getCurrentStyleHeight(): float
296b6f35a76SGreg Roach    {
297b6f35a76SGreg Roach        if ($this->currentStyle === '') {
298*ceab9748SGreg Roach            return $this->default_font_size;
299b6f35a76SGreg Roach        }
300*ceab9748SGreg Roach        $style = $this->getStyle($this->currentStyle);
301b6f35a76SGreg Roach
302b6f35a76SGreg Roach        return (float) $style['size'];
303b6f35a76SGreg Roach    }
304b6f35a76SGreg Roach
305b6f35a76SGreg Roach    /**
306b6f35a76SGreg Roach     * Checks the Footnote and numbers them
307b6f35a76SGreg Roach     *
308b6f35a76SGreg Roach     * @param ReportPdfFootnote $footnote
309b6f35a76SGreg Roach     *
310b6f35a76SGreg Roach     * @return ReportPdfFootnote|bool object if already numbered, false otherwise
311b6f35a76SGreg Roach     */
312b6f35a76SGreg Roach    public function checkFootnote(ReportPdfFootnote $footnote)
313b6f35a76SGreg Roach    {
314b6f35a76SGreg Roach        $ct  = count($this->printedfootnotes);
315b6f35a76SGreg Roach        $val = $footnote->getValue();
316b6f35a76SGreg Roach        $i   = 0;
317b6f35a76SGreg Roach        while ($i < $ct) {
318b6f35a76SGreg Roach            if ($this->printedfootnotes[$i]->getValue() == $val) {
319b6f35a76SGreg Roach                // If this footnote already exist then set up the numbers for this object
320b6f35a76SGreg Roach                $footnote->setNum($i + 1);
321b6f35a76SGreg Roach                $footnote->setAddlink((string) ($i + 1));
322b6f35a76SGreg Roach
323b6f35a76SGreg Roach                return $this->printedfootnotes[$i];
324b6f35a76SGreg Roach            }
325b6f35a76SGreg Roach            $i++;
326b6f35a76SGreg Roach        }
327b6f35a76SGreg Roach        // If this Footnote has not been set up yet
328b6f35a76SGreg Roach        $footnote->setNum($ct + 1);
329b6f35a76SGreg Roach        $footnote->setAddlink((string) $this->tcpdf->AddLink());
330b6f35a76SGreg Roach        $this->printedfootnotes[] = $footnote;
331b6f35a76SGreg Roach
332b6f35a76SGreg Roach        return false;
333b6f35a76SGreg Roach    }
334b6f35a76SGreg Roach
335b6f35a76SGreg Roach    /**
336b6f35a76SGreg Roach     * Used this function instead of AddPage()
337b6f35a76SGreg Roach     * This function will make sure that images will not be overwritten
338b6f35a76SGreg Roach     *
339b6f35a76SGreg Roach     * @return void
340b6f35a76SGreg Roach     */
341b6f35a76SGreg Roach    public function newPage(): void
342b6f35a76SGreg Roach    {
343b6f35a76SGreg Roach        if ($this->lastpicpage > $this->tcpdf->getPage()) {
344b6f35a76SGreg Roach            $this->tcpdf->setPage($this->lastpicpage);
345b6f35a76SGreg Roach        }
346b6f35a76SGreg Roach        $this->tcpdf->AddPage();
347b6f35a76SGreg Roach    }
348b6f35a76SGreg Roach
349b6f35a76SGreg Roach    /**
350b6f35a76SGreg Roach     * Add a page if needed -PDF
351b6f35a76SGreg Roach     *
352b6f35a76SGreg Roach     * @param float $height Cell height
353b6f35a76SGreg Roach     *
354b6f35a76SGreg Roach     * @return bool true in case of page break, false otherwise
355b6f35a76SGreg Roach     */
356b6f35a76SGreg Roach    public function checkPageBreakPDF(float $height): bool
357b6f35a76SGreg Roach    {
358b6f35a76SGreg Roach        return $this->tcpdf->checkPageBreak($height);
359b6f35a76SGreg Roach    }
360b6f35a76SGreg Roach
361b6f35a76SGreg Roach    /**
362b6f35a76SGreg Roach     * Returns the remaining width between the current position and margins -PDF
363b6f35a76SGreg Roach     *
364b6f35a76SGreg Roach     * @return float Remaining width
365b6f35a76SGreg Roach     */
366b6f35a76SGreg Roach    public function getRemainingWidthPDF(): float
367b6f35a76SGreg Roach    {
368b6f35a76SGreg Roach        return $this->tcpdf->getRemainingWidth();
369b6f35a76SGreg Roach    }
370b6f35a76SGreg Roach    /**
371b6f35a76SGreg Roach     * PDF Setup - ReportPdf
372b6f35a76SGreg Roach     *
373b6f35a76SGreg Roach     * @return void
374b6f35a76SGreg Roach     */
375b6f35a76SGreg Roach    public function setup(): void
376b6f35a76SGreg Roach    {
377b6f35a76SGreg Roach        parent::setup();
378b6f35a76SGreg Roach
379345fcc8aSGreg Roach        $this->tcpdf = new TcpdfWrapper(
380345fcc8aSGreg Roach            $this->orientation,
381345fcc8aSGreg Roach            self::UNITS,
382345fcc8aSGreg Roach            [$this->page_width, $this->page_height],
383345fcc8aSGreg Roach            self::UNICODE,
384345fcc8aSGreg Roach            'UTF-8',
385345fcc8aSGreg Roach            self::DISK_CACHE
386345fcc8aSGreg Roach        );
387b6f35a76SGreg Roach
388b6f35a76SGreg Roach        $this->tcpdf->SetMargins($this->left_margin, $this->top_margin, $this->right_margin);
389b6f35a76SGreg Roach        $this->tcpdf->setHeaderMargin($this->header_margin);
390b6f35a76SGreg Roach        $this->tcpdf->setFooterMargin($this->footer_margin);
391b6f35a76SGreg Roach        $this->tcpdf->SetAutoPageBreak(true, $this->bottom_margin);
392b6f35a76SGreg Roach        $this->tcpdf->setFontSubsetting(self::SUBSETTING);
393b6f35a76SGreg Roach        $this->tcpdf->SetCompression(self::COMPRESSION);
394b6f35a76SGreg Roach        $this->tcpdf->setRTL($this->rtl);
395b6f35a76SGreg Roach        $this->tcpdf->SetCreator(Webtrees::NAME . ' ' . Webtrees::VERSION);
396b6f35a76SGreg Roach        $this->tcpdf->SetAuthor($this->rauthor);
397b6f35a76SGreg Roach        $this->tcpdf->SetTitle($this->title);
398b6f35a76SGreg Roach        $this->tcpdf->SetSubject($this->rsubject);
399b6f35a76SGreg Roach        $this->tcpdf->SetKeywords($this->rkeywords);
400db9b720fSGreg Roach        $this->tcpdf->SetHeaderData('', 0, $this->title);
401f6351d1fSGreg Roach        $this->tcpdf->setHeaderFont([$this->default_font, '', $this->default_font_size]);
402b6f35a76SGreg Roach
403b6f35a76SGreg Roach        if ($this->show_generated_by) {
404b6f35a76SGreg Roach            // The default style name for Generated by.... is 'genby'
405b6f35a76SGreg Roach            $element = new ReportPdfCell(0, 10, 0, 'C', '', 'genby', 1, ReportBaseElement::CURRENT_POSITION, ReportBaseElement::CURRENT_POSITION, 0, 0, '', '', true);
406b6f35a76SGreg Roach            $element->addText($this->generated_by);
407b6f35a76SGreg Roach            $element->setUrl(Webtrees::URL);
408345fcc8aSGreg Roach            $this->addElementToFooter($element);
409b6f35a76SGreg Roach        }
410b6f35a76SGreg Roach    }
411b6f35a76SGreg Roach
412b6f35a76SGreg Roach    /**
413b6f35a76SGreg Roach     * Run the report.
414b6f35a76SGreg Roach     *
415b6f35a76SGreg Roach     * @return void
416b6f35a76SGreg Roach     */
417b6f35a76SGreg Roach    public function run(): void
418b6f35a76SGreg Roach    {
419b6f35a76SGreg Roach        $this->body();
420b6f35a76SGreg Roach        echo $this->tcpdf->Output('doc.pdf', 'S');
421b6f35a76SGreg Roach    }
422b6f35a76SGreg Roach
423b6f35a76SGreg Roach    /**
424b6f35a76SGreg Roach     * Create a new Cell object.
425b6f35a76SGreg Roach     *
426b6f35a76SGreg Roach     * @param int    $width   cell width (expressed in points)
427b6f35a76SGreg Roach     * @param int    $height  cell height (expressed in points)
428b6f35a76SGreg Roach     * @param mixed  $border  Border style
429b6f35a76SGreg Roach     * @param string $align   Text alignement
430b6f35a76SGreg Roach     * @param string $bgcolor Background color code
431b6f35a76SGreg Roach     * @param string $style   The name of the text style
432b6f35a76SGreg Roach     * @param int    $ln      Indicates where the current position should go after the call
433b6f35a76SGreg Roach     * @param mixed  $top     Y-position
434b6f35a76SGreg Roach     * @param mixed  $left    X-position
435b6f35a76SGreg Roach     * @param int    $fill    Indicates if the cell background must be painted (1) or transparent (0). Default value: 1
436b6f35a76SGreg Roach     * @param int    $stretch Stretch carachter mode
437b6f35a76SGreg Roach     * @param string $bocolor Border color
438b6f35a76SGreg Roach     * @param string $tcolor  Text color
439b6f35a76SGreg Roach     * @param bool   $reseth
440b6f35a76SGreg Roach     *
441b6f35a76SGreg Roach     * @return ReportBaseCell
442b6f35a76SGreg Roach     */
44324f2a3afSGreg Roach    public function createCell(int $width, int $height, $border, string $align, string $bgcolor, string $style, int $ln, $top, $left, int $fill, int $stretch, string $bocolor, string $tcolor, bool $reseth): ReportBaseCell
444b6f35a76SGreg Roach    {
445b6f35a76SGreg Roach        return new ReportPdfCell($width, $height, $border, $align, $bgcolor, $style, $ln, $top, $left, $fill, $stretch, $bocolor, $tcolor, $reseth);
446b6f35a76SGreg Roach    }
447b6f35a76SGreg Roach
448b6f35a76SGreg Roach    /**
449b6f35a76SGreg Roach     * Create a new TextBox object.
450b6f35a76SGreg Roach     *
451b6f35a76SGreg Roach     * @param float  $width   Text box width
452b6f35a76SGreg Roach     * @param float  $height  Text box height
453b6f35a76SGreg Roach     * @param bool   $border
454b6f35a76SGreg Roach     * @param string $bgcolor Background color code in HTML
455b6f35a76SGreg Roach     * @param bool   $newline
456b6f35a76SGreg Roach     * @param float  $left
457b6f35a76SGreg Roach     * @param float  $top
458b6f35a76SGreg Roach     * @param bool   $pagecheck
459b6f35a76SGreg Roach     * @param string $style
460b6f35a76SGreg Roach     * @param bool   $fill
461b6f35a76SGreg Roach     * @param bool   $padding
462b6f35a76SGreg Roach     * @param bool   $reseth
463b6f35a76SGreg Roach     *
464b6f35a76SGreg Roach     * @return ReportBaseTextbox
465b6f35a76SGreg Roach     */
466b6f35a76SGreg Roach    public function createTextBox(
467b6f35a76SGreg Roach        float $width,
468b6f35a76SGreg Roach        float $height,
469b6f35a76SGreg Roach        bool $border,
470b6f35a76SGreg Roach        string $bgcolor,
471b6f35a76SGreg Roach        bool $newline,
472b6f35a76SGreg Roach        float $left,
473b6f35a76SGreg Roach        float $top,
474b6f35a76SGreg Roach        bool $pagecheck,
475b6f35a76SGreg Roach        string $style,
476b6f35a76SGreg Roach        bool $fill,
477b6f35a76SGreg Roach        bool $padding,
478b6f35a76SGreg Roach        bool $reseth
479b6f35a76SGreg Roach    ): ReportBaseTextbox {
480b6f35a76SGreg Roach        return new ReportPdfTextBox($width, $height, $border, $bgcolor, $newline, $left, $top, $pagecheck, $style, $fill, $padding, $reseth);
481b6f35a76SGreg Roach    }
482b6f35a76SGreg Roach
483b6f35a76SGreg Roach    /**
484b6f35a76SGreg Roach     * Create a text element.
485b6f35a76SGreg Roach     *
486b6f35a76SGreg Roach     * @param string $style
487b6f35a76SGreg Roach     * @param string $color
488b6f35a76SGreg Roach     *
489b6f35a76SGreg Roach     * @return ReportBaseText
490b6f35a76SGreg Roach     */
491b6f35a76SGreg Roach    public function createText(string $style, string $color): ReportBaseText
492b6f35a76SGreg Roach    {
493b6f35a76SGreg Roach        return new ReportPdfText($style, $color);
494b6f35a76SGreg Roach    }
495b6f35a76SGreg Roach
496b6f35a76SGreg Roach    /**
497b6f35a76SGreg Roach     * Create a new Footnote object.
498b6f35a76SGreg Roach     *
499b6f35a76SGreg Roach     * @param string $style Style name
500b6f35a76SGreg Roach     *
501b6f35a76SGreg Roach     * @return ReportBaseFootnote
502b6f35a76SGreg Roach     */
50324f2a3afSGreg Roach    public function createFootnote(string $style): ReportBaseFootnote
504b6f35a76SGreg Roach    {
505b6f35a76SGreg Roach        return new ReportPdfFootnote($style);
506b6f35a76SGreg Roach    }
507b6f35a76SGreg Roach
508b6f35a76SGreg Roach    /**
509b6f35a76SGreg Roach     * Create a new image object.
510b6f35a76SGreg Roach     *
511b6f35a76SGreg Roach     * @param string $file  Filename
512b6f35a76SGreg Roach     * @param float  $x
513b6f35a76SGreg Roach     * @param float  $y
514b6f35a76SGreg Roach     * @param float  $w     Image width
515b6f35a76SGreg Roach     * @param float  $h     Image height
516b6f35a76SGreg Roach     * @param string $align L:left, C:center, R:right or empty to use x/y
517b6f35a76SGreg Roach     * @param string $ln    T:same line, N:next line
518b6f35a76SGreg Roach     *
519b6f35a76SGreg Roach     * @return ReportBaseImage
520b6f35a76SGreg Roach     */
521b6f35a76SGreg Roach    public function createImage(string $file, float $x, float $y, float $w, float $h, string $align, string $ln): ReportBaseImage
522b6f35a76SGreg Roach    {
523b6f35a76SGreg Roach        return new ReportPdfImage($file, $x, $y, $w, $h, $align, $ln);
524b6f35a76SGreg Roach    }
525b6f35a76SGreg Roach
526b6f35a76SGreg Roach    /**
527b6f35a76SGreg Roach     * Create a new image object from Media Object.
528b6f35a76SGreg Roach     *
529b6f35a76SGreg Roach     * @param MediaFile          $media_file
530b6f35a76SGreg Roach     * @param float              $x
531b6f35a76SGreg Roach     * @param float              $y
532b6f35a76SGreg Roach     * @param float              $w     Image width
533b6f35a76SGreg Roach     * @param float              $h     Image height
534b6f35a76SGreg Roach     * @param string             $align L:left, C:center, R:right or empty to use x/y
535b6f35a76SGreg Roach     * @param string             $ln    T:same line, N:next line
536f7cf8a15SGreg Roach     * @param FilesystemOperator $data_filesystem
537b6f35a76SGreg Roach     *
538b6f35a76SGreg Roach     * @return ReportBaseImage
539b6f35a76SGreg Roach     */
540b6f35a76SGreg Roach    public function createImageFromObject(
541b6f35a76SGreg Roach        MediaFile $media_file,
542b6f35a76SGreg Roach        float $x,
543b6f35a76SGreg Roach        float $y,
544b6f35a76SGreg Roach        float $w,
545b6f35a76SGreg Roach        float $h,
546b6f35a76SGreg Roach        string $align,
547b6f35a76SGreg Roach        string $ln,
548f7cf8a15SGreg Roach        FilesystemOperator $data_filesystem
549b6f35a76SGreg Roach    ): ReportBaseImage {
550b6f35a76SGreg Roach        return new ReportPdfImage('@' . $media_file->fileContents($data_filesystem), $x, $y, $w, $h, $align, $ln);
551b6f35a76SGreg Roach    }
552b6f35a76SGreg Roach
553b6f35a76SGreg Roach    /**
554b6f35a76SGreg Roach     * Create a line.
555b6f35a76SGreg Roach     *
556b6f35a76SGreg Roach     * @param float $x1
557b6f35a76SGreg Roach     * @param float $y1
558b6f35a76SGreg Roach     * @param float $x2
559b6f35a76SGreg Roach     * @param float $y2
560b6f35a76SGreg Roach     *
561b6f35a76SGreg Roach     * @return ReportBaseLine
562b6f35a76SGreg Roach     */
563b6f35a76SGreg Roach    public function createLine(float $x1, float $y1, float $x2, float $y2): ReportBaseLine
564b6f35a76SGreg Roach    {
565b6f35a76SGreg Roach        return new ReportPdfLine($x1, $y1, $x2, $y2);
566b6f35a76SGreg Roach    }
567b6f35a76SGreg Roach}
568