xref: /plugin/dw2pdf/vendor/setasign/fpdi/src/Tfpdf/Fpdi.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\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}