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