Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
71.43% covered (success)
71.43%
20 / 28
89.47% covered (success)
89.47%
17 / 19
CRAP
0.00% covered (danger)
0.00%
0 / 1
AbstractPage
71.43% covered (success)
71.43%
20 / 28
89.47% covered (success)
89.47%
17 / 19
27.42
0.00% covered (danger)
0.00%
0 / 1
 setWidth
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 setHeight
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 setIndex
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getWidth
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getHeight
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getIndex
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getImages
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getText
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getTextStreams
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getAnnotations
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getPaths
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getFields
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 hasImages
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 hasText
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 hasTextStreams
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 hasAnnotations
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 hasPaths
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 hasFields
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 clearContent
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 __construct
n/a
0 / 0
n/a
0 / 0
0
 addImage
n/a
0 / 0
n/a
0 / 0
0
 addText
n/a
0 / 0
n/a
0 / 0
0
 addTextStream
n/a
0 / 0
n/a
0 / 0
0
 addAnnotation
n/a
0 / 0
n/a
0 / 0
0
 addUrl
n/a
0 / 0
n/a
0 / 0
0
 addLink
n/a
0 / 0
n/a
0 / 0
0
 addPath
n/a
0 / 0
n/a
0 / 0
0
 addField
n/a
0 / 0
n/a
0 / 0
0
1<?php
2/**
3 * Pop PHP Framework (http://www.popphp.org/)
4 *
5 * @link       https://github.com/popphp/popphp-framework
6 * @author     Nick Sagona, III <dev@nolainteractive.com>
7 * @copyright  Copyright (c) 2009-2023 NOLA Interactive, LLC. (http://www.nolainteractive.com)
8 * @license    http://www.popphp.org/license     New BSD License
9 */
10
11/**
12 * @namespace
13 */
14namespace Pop\Pdf\Document;
15
16use Pop\Pdf\Document\Page\Annotation;
17use Pop\Pdf\Document\Page\Field;
18
19/**
20 * Abstract Page class
21 *
22 * @category   Pop
23 * @package    Pop\Pdf
24 * @author     Nick Sagona, III <dev@nolainteractive.com>
25 * @copyright  Copyright (c) 2009-2023 NOLA Interactive, LLC. (http://www.nolainteractive.com)
26 * @license    http://www.popphp.org/license     New BSD License
27 * @version    4.2.0
28 */
29abstract class AbstractPage implements PageInterface
30{
31
32    /**
33     * Page size constants
34     */
35    const ENVELOPE_10 = 'ENVELOPE_10';
36    const ENVELOPE_C5 = 'ENVELOPE_C5';
37    const ENVELOPE_DL = 'ENVELOPE_DL';
38    const FOLIO       = 'FOLIO';
39    const EXECUTIVE   = 'EXECUTIVE';
40    const LETTER      = 'LETTER';
41    const LEGAL       = 'LEGAL';
42    const LEDGER      = 'LEDGER';
43    const TABLOID     = 'TABLOID';
44    const A0          = 'A0';
45    const A1          = 'A1';
46    const A2          = 'A2';
47    const A3          = 'A3';
48    const A4          = 'A4';
49    const A5          = 'A5';
50    const A6          = 'A6';
51    const A7          = 'A7';
52    const A8          = 'A8';
53    const A9          = 'A9';
54    const B0          = 'B0';
55    const B1          = 'B1';
56    const B2          = 'B2';
57    const B3          = 'B3';
58    const B4          = 'B4';
59    const B5          = 'B5';
60    const B6          = 'B6';
61    const B7          = 'B7';
62    const B8          = 'B8';
63    const B9          = 'B9';
64    const B10         = 'B10';
65
66    /**
67     * Array of page sizes
68     * @var array
69     */
70    protected $sizes = [
71        'ENVELOPE_10' => ['width' => 297,  'height' => 684],
72        'ENVELOPE_C5' => ['width' => 461,  'height' => 648],
73        'ENVELOPE_DL' => ['width' => 312,  'height' => 624],
74        'FOLIO'       => ['width' => 595,  'height' => 935],
75        'EXECUTIVE'   => ['width' => 522,  'height' => 756],
76        'LETTER'      => ['width' => 612,  'height' => 792],
77        'LEGAL'       => ['width' => 612,  'height' => 1008],
78        'LEDGER'      => ['width' => 1224, 'height' => 792],
79        'TABLOID'     => ['width' => 792,  'height' => 1224],
80        'A0'          => ['width' => 2384, 'height' => 3370],
81        'A1'          => ['width' => 1684, 'height' => 2384],
82        'A2'          => ['width' => 1191, 'height' => 1684],
83        'A3'          => ['width' => 842,  'height' => 1191],
84        'A4'          => ['width' => 595,  'height' => 842],
85        'A5'          => ['width' => 420,  'height' => 595],
86        'A6'          => ['width' => 297,  'height' => 420],
87        'A7'          => ['width' => 210,  'height' => 297],
88        'A8'          => ['width' => 148,  'height' => 210],
89        'A9'          => ['width' => 105,  'height' => 148],
90        'B0'          => ['width' => 2920, 'height' => 4127],
91        'B1'          => ['width' => 2064, 'height' => 2920],
92        'B2'          => ['width' => 1460, 'height' => 2064],
93        'B3'          => ['width' => 1032, 'height' => 1460],
94        'B4'          => ['width' => 729,  'height' => 1032],
95        'B5'          => ['width' => 516,  'height' => 729],
96        'B6'          => ['width' => 363,  'height' => 516],
97        'B7'          => ['width' => 258,  'height' => 363],
98        'B8'          => ['width' => 181,  'height' => 258],
99        'B9'          => ['width' => 127,  'height' => 181],
100        'B10'         => ['width' => 91,   'height' => 127]
101    ];
102
103    /**
104     * Page index if page object represents an imported page
105     * @var int
106     */
107    protected $index = null;
108
109    /**
110     * Page width
111     * @var int
112     */
113    protected $width = null;
114
115    /**
116     * Page height
117     * @var int
118     */
119    protected $height = null;
120
121    /**
122     * Images array
123     * @var array
124     */
125    protected $images = [];
126
127    /**
128     * Text array
129     * @var array
130     */
131    protected $text = [];
132
133    /**
134     * Text streams array
135     * @var array
136     */
137    protected $textStreams = [];
138
139    /**
140     * Annotations array
141     * @var array
142     */
143    protected $annotations = [];
144
145    /**
146     * Paths array
147     * @var array
148     */
149    protected $paths = [];
150
151    /**
152     * Fields array
153     * @var array
154     */
155    protected $fields = [];
156
157    /**
158     * Set the page width
159     *
160     * @param  mixed $width
161     * @return AbstractPage
162     */
163    public function setWidth($width)
164    {
165        $this->width = (float)$width;
166        return $this;
167    }
168
169    /**
170     * Set the page height
171     *
172     * @param  mixed $height
173     * @return AbstractPage
174     */
175    public function setHeight($height)
176    {
177        $this->height = (float)$height;
178        return $this;
179    }
180
181    /**
182     * Set the page index
183     *
184     * @param  int $i
185     * @return AbstractPage
186     */
187    public function setIndex($i)
188    {
189        $this->index = (int)$i;
190        return $this;
191    }
192
193    /**
194     * Get the page width
195     *
196     * @return int
197     */
198    public function getWidth()
199    {
200        return $this->width;
201    }
202
203    /**
204     * Get the page height
205     *
206     * @return int
207     */
208    public function getHeight()
209    {
210        return $this->height;
211    }
212
213    /**
214     * Get the page index
215     *
216     * @return int
217     */
218    public function getIndex()
219    {
220        return $this->index;
221    }
222
223    /**
224     * Get image objects
225     *
226     * @return array
227     */
228    public function getImages()
229    {
230        return $this->images;
231    }
232
233    /**
234     * Get text objects
235     *
236     * @return array
237     */
238    public function getText()
239    {
240        return $this->text;
241    }
242
243    /**
244     * Get text stream objects
245     *
246     * @return array
247     */
248    public function getTextStreams()
249    {
250        return $this->textStreams;
251    }
252
253    /**
254     * Get annotation objects
255     *
256     * @return array
257     */
258    public function getAnnotations()
259    {
260        return $this->annotations;
261    }
262
263    /**
264     * Get path objects
265     *
266     * @return array
267     */
268    public function getPaths()
269    {
270        return $this->paths;
271    }
272
273    /**
274     * Get field objects
275     *
276     * @return array
277     */
278    public function getFields()
279    {
280        return $this->fields;
281    }
282
283    /**
284     * Determine if the page has image objects
285     *
286     * @return boolean
287     */
288    public function hasImages()
289    {
290        return (count($this->images) > 0);
291    }
292
293    /**
294     * Determine if the page has text objects
295     *
296     * @return boolean
297     */
298    public function hasText()
299    {
300        return (count($this->text) > 0);
301    }
302
303    /**
304     * Determine if the page has text stream objects
305     *
306     * @return boolean
307     */
308    public function hasTextStreams()
309    {
310        return (count($this->textStreams) > 0);
311    }
312
313    /**
314     * Determine if the page has annotation objects
315     *
316     * @return boolean
317     */
318    public function hasAnnotations()
319    {
320        return (count($this->annotations) > 0);
321    }
322
323    /**
324     * Determine if the page has path objects
325     *
326     * @return boolean
327     */
328    public function hasPaths()
329    {
330        return (count($this->paths) > 0);
331    }
332
333    /**
334     * Determine if the page has field objects
335     *
336     * @return boolean
337     */
338    public function hasFields()
339    {
340        return (count($this->fields) > 0);
341    }
342
343    /**
344     * Clear page content
345     *
346     * @return AbstractPage
347     */
348    public function clearContent()
349    {
350        $this->images      = [];
351        $this->text        = [];
352        $this->textStreams = [];
353        $this->annotations = [];
354        $this->paths       = [];
355        $this->fields      = [];
356
357        return $this;
358    }
359
360    /**
361     * Constructor
362     *
363     * Instantiate a PDF page.
364     *
365     * @throws Exception
366     * @return AbstractPage
367     */
368    abstract public function __construct();
369
370    /**
371     * Add an image to the PDF page
372     *
373     * @param  Page\Image $image
374     * @param  int        $x
375     * @param  int        $y
376     * @return Page
377     */
378    abstract public function addImage(Page\Image $image, $x = 0, $y = 0);
379
380    /**
381     * Add text to the PDF page
382     *
383     * @param  Page\Text $text
384     * @param  string    $font
385     * @param  int       $x
386     * @param  int       $y
387     * @return Page
388     */
389    abstract public function addText(Page\Text $text, $font, $x = 0, $y = 0);
390
391    /**
392     * Add text stream to the PDF page
393     *
394     * @param  Page\Text\Stream $textStream
395     * @return Page
396     */
397    abstract public function addTextStream(Page\Text\Stream $textStream);
398
399    /**
400     * Add an annotation to the PDF page
401     *
402     * @param  Annotation\AbstractAnnotation $annotation
403     * @param  int                           $x
404     * @param  int                           $y
405     * @return Page
406     */
407    abstract public function addAnnotation(Annotation\AbstractAnnotation $annotation, $x = 0, $y = 0);
408
409    /**
410     * Add a URL annotation to the PDF page
411     *
412     * @param  Annotation\Url $url
413     * @param  int            $x
414     * @param  int            $y
415     * @return Page
416     */
417    abstract public function addUrl(Annotation\Url $url, $x = 0, $y = 0);
418
419    /**
420     * Add a link annotation to the PDF page
421     *
422     * @param  Annotation\Link $link
423     * @param  int             $x
424     * @param  int             $y
425     * @return Page
426     */
427    abstract public function addLink(Annotation\Link $link, $x = 0, $y = 0);
428
429    /**
430     * Add a path to the Pdf page
431     *
432     * @param  Page\Path $path
433     * @return Page
434     */
435    abstract public function addPath(Page\Path $path);
436
437    /**
438     * Add a form to the Pdf page
439     *
440     * @param  Page\Field\AbstractField $field
441     * @param  string                   $form
442     * @param  int                      $x
443     * @param  int                      $y
444     * @return Page
445     */
446    abstract public function addField(Page\Field\AbstractField $field, $form, $x = 0, $y = 0);
447
448}