Passed
Branch v3.5 (f0ef26)
by Samir
36:09
created
web_interface/astpp/application/libraries/html2pdf/_class/myPdf.class.php 3 patches
Doc Comments   +1 added lines, -3 removed lines patch added patch discarded remove patch
@@ -30,7 +30,7 @@  discard block
 block discarded – undo
30 30
      *
31 31
      * @param string  $orientation page orientation, same as TCPDF
32 32
      * @param string  $unit        User measure unit, same as TCPDF
33
-     * @param mixed   $format      The format used for pages, same as TCPDF
33
+     * @param string   $format      The format used for pages, same as TCPDF
34 34
      * @param boolean $unicode     TRUE means that the input text is unicode (default = true)
35 35
      * @param String  $encoding    charset encoding; default is UTF-8
36 36
      * @param boolean $diskcache   if TRUE reduce the RAM memory usage by caching temporary data on filesystem (slower).
@@ -1407,7 +1407,6 @@  discard block
 block discarded – undo
1407 1407
      * set $_myLastPageGroup;
1408 1408
      *
1409 1409
      * @access public
1410
-     * @param integer $myLastPageGroup;
1411 1410
      * @param integer $myLastPageGroup
1412 1411
      */
1413 1412
     public function setMyLastPageGroup($myLastPageGroup)
@@ -1430,7 +1429,6 @@  discard block
 block discarded – undo
1430 1429
      * set $_myLastPageGroupNb;
1431 1430
      *
1432 1431
      * @access public
1433
-     * @param integer $myLastPageGroupNb;
1434 1432
      * @param integer $myLastPageGroupNb
1435 1433
      */
1436 1434
     public function setMyLastPageGroupNb($myLastPageGroupNb)
Please login to merge, or discard this patch.
Indentation   +1423 added lines, -1423 removed lines patch added patch discarded remove patch
@@ -14,1427 +14,1427 @@
 block discarded – undo
14 14
 
15 15
 class HTML2PDF_myPdf extends TCPDF
16 16
 {
17
-    protected $_footerParam = array();
18
-    protected $_transf      = array();
19
-    protected $_myLastPageGroup = null;
20
-    protected $_myLastPageGroupNb = 0;
21
-
22
-    // used to make a radius with bezier : (4/3 * (sqrt(2) - 1))
23
-    const MY_ARC = 0.5522847498;
24
-
25
-    // nb of segment to build a arc with bezier curv
26
-    const ARC_NB_SEGMENT = 8;
27
-
28
-    /**
29
-     * class constructor
30
-     *
31
-     * @param string  $orientation page orientation, same as TCPDF
32
-     * @param string  $unit        User measure unit, same as TCPDF
33
-     * @param mixed   $format      The format used for pages, same as TCPDF
34
-     * @param boolean $unicode     TRUE means that the input text is unicode (default = true)
35
-     * @param String  $encoding    charset encoding; default is UTF-8
36
-     * @param boolean $diskcache   if TRUE reduce the RAM memory usage by caching temporary data on filesystem (slower).
37
-     * @access public
38
-     */
39
-    public function __construct(
40
-        $orientation = 'P',
41
-        $unit = 'mm',
42
-        $format = 'A4',
43
-        $unicode = true,
44
-        $encoding = 'UTF-8',
45
-        $diskcache = false)
46
-    {
47
-        // call the parent constructor
48
-        parent::__construct($orientation, $unit, $format, $unicode, $encoding, $diskcache);
49
-
50
-        // init the specific parameters used by HTML2PDF
51
-        $this->SetCreator(PDF_CREATOR);
52
-        $this->SetAutoPageBreak(false, 0);
53
-        $this->linestyleCap = '2 J';
54
-        $this->setPrintHeader(false);
55
-        $this->jpeg_quality = 90;
56
-
57
-        // prepare the automatic footer
58
-        $this->SetMyFooter();
59
-
60
-        $this->cMargin = 0;
61
-    }
62
-
63
-    /**
64
-     * Set the parameters for the automatic footer
65
-     *
66
-     * @param boolean $page display the page number
67
-     * @param boolean $date display the date
68
-     * @param boolean $hour display the hour
69
-     * @param boolean $form display a warning abour forms
70
-     * @access public
71
-     */
72
-    public function SetMyFooter($page = false, $date = false, $hour = false, $form = false)
73
-    {
74
-        $page    = ($page ? true : false);
75
-        $date    = ($date ? true : false);
76
-        $hour    = ($hour ? true : false);
77
-        $form    = ($form ? true : false);
78
-
79
-        $this->_footerParam = array('page' => $page, 'date' => $date, 'hour' => $hour, 'form' => $form);
80
-    }
81
-
82
-    /**
83
-     * This function is call automatically by TCPDF at the end of a page
84
-     * It takes no parameters
85
-     *
86
-     * @access public
87
-     */
88
-    public function Footer()
89
-    {
90
-        // prepare the text from the tranlated text
91
-        $txt = '';
92
-        if ($this->_footerParam['form']) {
93
-            $txt = (HTML2PDF_locale::get('pdf05'));
94
-        }
95
-        if ($this->_footerParam['date'] && $this->_footerParam['hour']) {
96
-            $txt .= ($txt ? ' - ' : '').(HTML2PDF_locale::get('pdf03'));
97
-        }
98
-        if ($this->_footerParam['date'] && ! $this->_footerParam['hour']) {
99
-            $txt .= ($txt ? ' - ' : '').(HTML2PDF_locale::get('pdf01'));
100
-        }
101
-        if ( ! $this->_footerParam['date'] && $this->_footerParam['hour']) {
102
-            $txt .= ($txt ? ' - ' : '').(HTML2PDF_locale::get('pdf02'));
103
-        }
104
-        if ($this->_footerParam['page']) {
105
-            $txt .= ($txt ? ' - ' : '').(HTML2PDF_locale::get('pdf04'));
106
-        }
107
-
108
-        if (strlen($txt) > 0) {
109
-            // replace some values
110
-            $toReplace = array(
111
-                '[[date_d]]'  => date('d'),
112
-                '[[date_m]]'  => date('m'),
113
-                '[[date_y]]'  => date('Y'),
114
-                '[[date_h]]'  => date('H'),
115
-                '[[date_i]]'  => date('i'),
116
-                '[[date_s]]'  => date('s'),
117
-                '[[page_cu]]' => $this->getMyNumPage(),
118
-                '[[page_nb]]' => $this->getMyAliasNbPages(),
119
-            );
120
-            $txt = str_replace(array_keys($toReplace), array_values($toReplace), $txt);
121
-
122
-            // draw the footer
123
-            parent::SetY(-11);
124
-            $this->SetFont('helvetica', 'I', 8);
125
-            $this->Cell(0, 10, $txt, 0, 0, 'R');
126
-        }
127
-    }
128
-
129
-     /**
130
-     * after cloning a object, we does not want to clone all the front informations
131
-     * because it take a lot a time and a lot of memory => we use reference
132
-     *
133
-     * @param &HTML2PDF_myPdf object
134
-     * @param HTML2PDF_myPdf $pdf
135
-     * @access public
136
-     */
137
-    public function cloneFontFrom(&$pdf)
138
-    {
139
-        $this->fonts            = &$pdf->getFonts();
140
-        $this->FontFiles        = &$pdf->getFontFiles();
141
-        $this->diffs            = &$pdf->getDiffs();
142
-        $this->fontlist         = &$pdf->getFontList();
143
-        $this->numfonts         = &$pdf->getNumFonts();
144
-        $this->fontkeys         = &$pdf->getFontKeys();
145
-        $this->font_obj_ids     = &$pdf->getFontObjIds();
146
-        $this->annotation_fonts = &$pdf->getAnnotFonts();
147
-    }
148
-
149
-    /**
150
-     * multiple public accessor for some private attributs
151
-     * used only by cloneFontFrom
152
-     *
153
-     * @return &array
154
-     * @access public
155
-     */
156
-    public function &getFonts()
157
-    {
158
-        return $this->fonts;
159
-    }
160
-    public function &getFontFiles()
161
-    {
162
-        return $this->FontFiles;
163
-    }
164
-    public function &getDiffs()
165
-    {
166
-        return $this->diffs;
167
-    }
168
-    public function &getFontList()
169
-    {
170
-        return $this->fontlist;
171
-    }
172
-    public function &getNumFonts()
173
-    {
174
-        return $this->numfonts;
175
-    }
176
-    public function &getFontKeys()
177
-    {
178
-        return $this->fontkeys;
179
-    }
180
-    public function &getFontObjIds()
181
-    {
182
-        return $this->font_obj_ids;
183
-    }
184
-    public function &getAnnotFonts()
185
-    {
186
-        return $this->annotation_fonts;
187
-    }
188
-
189
-    /**
190
-     * Verify that a Font is already loaded
191
-     *
192
-     * @param string Font Key
193
-     * @return boolean
194
-     * @access public
195
-     */
196
-    public function isLoadedFont($fontKey)
197
-    {
198
-        if (isset($this->fonts[$fontKey])) {
199
-            return true;
200
-        }
201
-
202
-        if (isset($this->CoreFonts[$fontKey])) {
203
-            return true;
204
-        }
205
-
206
-        return false;
207
-    }
208
-
209
-    /**
210
-     * Get the Word Spacing
211
-     *
212
-     * @access public
213
-     * @return float word spacing
214
-     */
215
-    public function getWordSpacing()
216
-    {
217
-        return $this->ws;
218
-    }
219
-
220
-    /**
221
-     * set the Word Spacing
222
-     *
223
-     * @param float word spacing
224
-     * @access public
225
-     */
226
-    public function setWordSpacing($ws = 0.)
227
-    {
228
-        $this->ws = $ws;
229
-        $this->_out(sprintf('%.3F Tw', $ws * $this->k));
230
-    }
231
-
232
-    /**
233
-     * start to use a rectangular Cliping Path with radius corners
234
-     *
235
-     * @param float $x (top left corner)
236
-     * @param float $y (top left corner)
237
-     * @param float $w (x+w  = botom rigth corner)
238
-     * @param float $h (y+h = botom rigth corner)
239
-     * @param array $cornerTL radius of the Top Left corner
240
-     * @param array $cornerTR radius of the Top Right corner
241
-     * @param array $cornerBL radius of the Bottom Left corner
242
-     * @param array $cornerBR radius of the Bottom Right corner
243
-     * @access public
244
-     */
245
-    public function clippingPathStart(
246
-        $x = null,
247
-        $y = null,
248
-        $w = null,
249
-        $h = null,
250
-        $cornerTL = null,
251
-        $cornerTR = null,
252
-        $cornerBL = null,
253
-        $cornerBR = null)
254
-    {
255
-        // init the path
256
-        $path = '';
257
-
258
-        // if we have the position and the size of the rectangle, we can proceed
259
-        if ($x !== null && $y !== null && $w !== null && $h !== null) {
260
-            // the positions of the rectangle's corners
261
-            $x1 = $x * $this->k;
262
-            $y1 = ($this->h - $y) * $this->k;
263
-
264
-            $x2 = ($x + $w) * $this->k;
265
-            $y2 = ($this->h - $y) * $this->k;
266
-
267
-            $x3 = ($x + $w) * $this->k;
268
-            $y3 = ($this->h - $y - $h) * $this->k;
269
-
270
-            $x4 = $x * $this->k;
271
-            $y4 = ($this->h - $y - $h) * $this->k;
272
-
273
-            // if we have at least one radius corner, then we proceed to a specific path, else it is just a rectangle
274
-            if ($cornerTL || $cornerTR || $cornerBL || $cornerBR) {
275
-                // prepare the radius values
276
-                if ($cornerTL) {
277
-                    $cornerTL[0] = $cornerTL[0] * $this->k;
278
-                    $cornerTL[1] = -$cornerTL[1] * $this->k;
279
-                }
280
-                if ($cornerTR) {
281
-                    $cornerTR[0] = $cornerTR[0] * $this->k;
282
-                    $cornerTR[1] = -$cornerTR[1] * $this->k;
283
-                }
284
-                if ($cornerBL) {
285
-                    $cornerBL[0] = $cornerBL[0] * $this->k;
286
-                    $cornerBL[1] = -$cornerBL[1] * $this->k;
287
-                }
288
-                if ($cornerBR) {
289
-                    $cornerBR[0] = $cornerBR[0] * $this->k;
290
-                    $cornerBR[1] = -$cornerBR[1] * $this->k;
291
-                }
292
-
293
-                // if TL radius then specific start else (X1,Y1)
294
-                if ($cornerTL) {
295
-                    $path .= sprintf('%.2F %.2F m ', $x1 + $cornerTL[0], $y1);
296
-                } else {
297
-                    $path .= sprintf('%.2F %.2F m ', $x1, $y1);
298
-                }
299
-
300
-                // if TR radius then line + arc, else line to (X2,Y2)
301
-                if ($cornerTR) {
302
-                    $xt1 = ($x2 - $cornerTR[0]) + $cornerTR[0] * self::MY_ARC;
303
-                    $yt1 = ($y2 + $cornerTR[1]) - $cornerTR[1];
304
-                    $xt2 = ($x2 - $cornerTR[0]) + $cornerTR[0];
305
-                    $yt2 = ($y2 + $cornerTR[1]) - $cornerTR[1] * self::MY_ARC;
306
-
307
-                    $path .= sprintf('%.2F %.2F l ', $x2 - $cornerTR[0], $y2);
308
-                    $path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x2, $y2 + $cornerTR[1]);
309
-                } else {
310
-                    $path .= sprintf('%.2F %.2F l ', $x2, $y2);
311
-                }
312
-
313
-                // if BR radius then line + arc, else line to (X3, Y3)
314
-                if ($cornerBR) {
315
-                    $xt1 = ($x3 - $cornerBR[0]) + $cornerBR[0];
316
-                    $yt1 = ($y3 - $cornerBR[1]) + $cornerBR[1] * self::MY_ARC;
317
-                    $xt2 = ($x3 - $cornerBR[0]) + $cornerBR[0] * self::MY_ARC;
318
-                    $yt2 = ($y3 - $cornerBR[1]) + $cornerBR[1];
319
-
320
-                    $path .= sprintf('%.2F %.2F l ', $x3, $y3 - $cornerBR[1]);
321
-                    $path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x3 - $cornerBR[0], $y3);
322
-                } else {
323
-                    $path .= sprintf('%.2F %.2F l ', $x3, $y3);
324
-                }
325
-
326
-                // if BL radius then line + arc, else line to (X4, Y4)
327
-                if ($cornerBL) {
328
-                    $xt1 = ($x4 + $cornerBL[0]) - $cornerBL[0] * self::MY_ARC;
329
-                    $yt1 = ($y4 - $cornerBL[1]) + $cornerBL[1];
330
-                    $xt2 = ($x4 + $cornerBL[0]) - $cornerBL[0];
331
-                    $yt2 = ($y4 - $cornerBL[1]) + $cornerBL[1] * self::MY_ARC;
332
-
333
-                    $path .= sprintf('%.2F %.2F l ', $x4 + $cornerBL[0], $y4);
334
-                    $path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x4, $y4 - $cornerBL[1]);
335
-                } else {
336
-                    $path .= sprintf('%.2F %.2F l ', $x4, $y4);
337
-                }
338
-
339
-                // if RL radius then line + arc
340
-                if ($cornerTL) {
341
-                    $xt1 = ($x1 + $cornerTL[0]) - $cornerTL[0];
342
-                    $yt1 = ($y1 + $cornerTL[1]) - $cornerTL[1] * self::MY_ARC;
343
-                    $xt2 = ($x1 + $cornerTL[0]) - $cornerTL[0] * self::MY_ARC;
344
-                    $yt2 = ($y1 + $cornerTL[1]) - $cornerTL[1];
345
-
346
-                    $path .= sprintf('%.2F %.2F l ', $x1, $y1 + $cornerTL[1]);
347
-                    $path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x1 + $cornerTL[0], $y1);
348
-                }
349
-            } else {
350
-                $path .= sprintf('%.2F %.2F m ', $x1, $y1);
351
-                $path .= sprintf('%.2F %.2F l ', $x2, $y2);
352
-                $path .= sprintf('%.2F %.2F l ', $x3, $y3);
353
-                $path .= sprintf('%.2F %.2F l ', $x4, $y4);
354
-            }
355
-
356
-            // close the path
357
-            $path .= ' h W n';
358
-        }
359
-
360
-        // using the path as a clipping path
361
-        $this->_out('q '.$path.' ');
362
-    }
363
-
364
-    /**
365
-     * stop to use the Cliping Path
366
-     *
367
-     * @access public
368
-     */
369
-    public function clippingPathStop()
370
-    {
371
-        $this->_out(' Q');
372
-    }
373
-
374
-    /**
375
-     * draw a filled corner of a border with a external and a internal radius
376
-     *         /--------+ ext2
377
-     *        /         |
378
-     *       /  /-------+ int2
379
-     *      /  /
380
-     *      | /
381
-     *      | |
382
-     *      | |
383
-     * ext1 +-+ int1        + cen
384
-     *
385
-     * @param float $ext1X
386
-     * @param float $ext1Y
387
-     * @param float $ext2X
388
-     * @param float $ext2Y
389
-     * @param float $int1X
390
-     * @param float $int1Y
391
-     * @param float $int2X
392
-     * @param float $int2Y
393
-     * @param float $cenX
394
-     * @param float $cenY
395
-     * @access public
396
-     */
397
-    public function drawCurve($ext1X, $ext1Y, $ext2X, $ext2Y, $int1X, $int1Y, $int2X, $int2Y, $cenX, $cenY)
398
-    {
399
-        // prepare the coordinates
400
-        $ext1X = $ext1X * $this->k;
401
-        $ext2X = $ext2X * $this->k;
402
-        $int1X = $int1X * $this->k;
403
-        $int2X = $int2X * $this->k;
404
-        $cenX  = $cenX * $this->k;
405
-
406
-        $ext1Y = ($this->h - $ext1Y) * $this->k;
407
-        $ext2Y = ($this->h - $ext2Y) * $this->k;
408
-        $int1Y = ($this->h - $int1Y) * $this->k;
409
-        $int2Y = ($this->h - $int2Y) * $this->k;
410
-        $cenY  = ($this->h - $cenY) * $this->k;
411
-
412
-        // init the curve
413
-        $path = '';
414
-
415
-        if ($ext1X - $cenX != 0) {
416
-            $xt1 = $cenX + ($ext1X - $cenX);
417
-            $yt1 = $cenY + ($ext2Y - $cenY) * self::MY_ARC;
418
-            $xt2 = $cenX + ($ext1X - $cenX) * self::MY_ARC;
419
-            $yt2 = $cenY + ($ext2Y - $cenY);
420
-        } else {
421
-            $xt1 = $cenX + ($ext2X - $cenX) * self::MY_ARC;
422
-            $yt1 = $cenY + ($ext1Y - $cenY);
423
-            $xt2 = $cenX + ($ext2X - $cenX);
424
-            $yt2 = $cenY + ($ext1Y - $cenY) * self::MY_ARC;
425
-        }
426
-        $path .= sprintf('%.2F %.2F m ', $ext1X, $ext1Y);
427
-        $path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $ext2X, $ext2Y);
428
-
429
-        if ($int1X - $cenX != 0) {
430
-            $xt1 = $cenX + ($int1X - $cenX) * self::MY_ARC;
431
-            $yt1 = $cenY + ($int2Y - $cenY);
432
-            $xt2 = $cenX + ($int1X - $cenX);
433
-            $yt2 = $cenY + ($int2Y - $cenY) * self::MY_ARC;
434
-        } else {
435
-            $xt1 = $cenX + ($int2X - $cenX);
436
-            $yt1 = $cenY + ($int1Y - $cenY) * self::MY_ARC;
437
-            $xt2 = $cenX + ($int2X - $cenX) * self::MY_ARC;
438
-            $yt2 = $cenY + ($int1Y - $cenY);
439
-        }
440
-        $path .= sprintf('%.2F %.2F l ', $int2X, $int2Y);
441
-        $path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $int1X, $int1Y);
442
-
443
-        // draw the curve
444
-        $this->_out($path.'f');
445
-    }
446
-
447
-    /**
448
-     * draw a filled corner of a border with only a external radius
449
-     *         /--+ ext2
450
-     *        /   |
451
-     *       /    |
452
-     *      /     |
453
-     *      |     |
454
-     *      |     |
455
-     *      |     |
456
-     * ext1 +-----+ int      + cen
457
-     *
458
-     * @param float $ext1X
459
-     * @param float $ext1Y
460
-     * @param float $ext2X
461
-     * @param float $ext2Y
462
-     * @param float $intX
463
-     * @param float $intY
464
-     * @param float $cenX
465
-     * @param float $cenY
466
-     * @access public
467
-     */
468
-    public function drawCorner($ext1X, $ext1Y, $ext2X, $ext2Y, $intX, $intY, $cenX, $cenY)
469
-    {
470
-        // prepare the coordinates
471
-        $ext1X = $ext1X * $this->k;
472
-        $ext2X = $ext2X * $this->k;
473
-        $intX  = $intX * $this->k;
474
-        $cenX  = $cenX * $this->k;
475
-
476
-        $ext1Y = ($this->h - $ext1Y) * $this->k;
477
-        $ext2Y = ($this->h - $ext2Y) * $this->k;
478
-        $intY  = ($this->h - $intY) * $this->k;
479
-        $cenY  = ($this->h - $cenY) * $this->k;
480
-
481
-        // init the curve
482
-        $path = '';
483
-
484
-        if ($ext1X - $cenX != 0) {
485
-            $xt1 = $cenX + ($ext1X - $cenX);
486
-            $yt1 = $cenY + ($ext2Y - $cenY) * self::MY_ARC;
487
-            $xt2 = $cenX + ($ext1X - $cenX) * self::MY_ARC;
488
-            $yt2 = $cenY + ($ext2Y - $cenY);
489
-        } else {
490
-            $xt1 = $cenX + ($ext2X - $cenX) * self::MY_ARC;
491
-            $yt1 = $cenY + ($ext1Y - $cenY);
492
-            $xt2 = $cenX + ($ext2X - $cenX);
493
-            $yt2 = $cenY + ($ext1Y - $cenY) * self::MY_ARC;
494
-        }
495
-        $path .= sprintf('%.2F %.2F m ', $ext1X, $ext1Y);
496
-        $path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $ext2X, $ext2Y);
497
-        $path .= sprintf('%.2F %.2F l ', $intX, $intY);
498
-        $path .= sprintf('%.2F %.2F l ', $ext1X, $ext1Y);
499
-
500
-        // draw the curve
501
-        $this->_out($path.'f');
502
-    }
503
-
504
-    /**
505
-     * Start a transformation
506
-     *
507
-     * @access public
508
-     */
509
-    public function startTransform()
510
-    {
511
-        $this->_out('q');
512
-    }
513
-
514
-    /**
515
-     * Stop a transformation
516
-     *
517
-     * @access public
518
-     */
519
-    public function stopTransform()
520
-    {
521
-        $this->_out('Q');
522
-    }
523
-
524
-    /**
525
-     * add a Translate transformation
526
-     *
527
-     * @access public
528
-     */
529
-    public function setTranslate($xT, $yT)
530
-    {
531
-        // Matrix for Translate
532
-        $tm[0] = 1;
533
-        $tm[1] = 0;
534
-        $tm[2] = 0;
535
-        $tm[3] = 1;
536
-        $tm[4] = $xT * $this->k;
537
-        $tm[5] = -$yT * $this->k;
538
-
539
-        // apply the Transform Matric
540
-        $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5]));
541
-    }
542
-
543
-    /**
544
-     * add a Rotate transformation
545
-     *
546
-     * @param float $angle
547
-     * @access public
548
-     */
549
-    public function setRotation($angle, $xC = null, $yC = null)
550
-    {
551
-        // if no center, rotate around the current posiition
552
-        if ($xC === null) $xC = $this->x;
553
-        if ($yC === null) $yC = $this->y;
554
-
555
-        // prepare the coordinate
556
-        $yC = ($this->h - $yC) * $this->k;
557
-        $xC *= $this->k;
558
-
559
-        // Matrix for Rotate
560
-        $tm[0] = cos(deg2rad($angle));
561
-        $tm[1] = sin(deg2rad($angle));
562
-        $tm[2] = -$tm[1];
563
-        $tm[3] = $tm[0];
564
-        $tm[4] = $xC + $tm[1] * $yC - $tm[0] * $xC;
565
-        $tm[5] = $yC - $tm[0] * $yC - $tm[1] * $xC;
566
-
567
-        // apply the Transform Matric
568
-        $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5]));
569
-    }
570
-
571
-    /**
572
-     * we redifine the original SetX method, because we don't want the automatic treatment.
573
-     * It is HTML2PDF that make the treatment
574
-     *
575
-     * @param float   $x
576
-     * @param boolean $rtloff NOT USED
577
-     * @access public
578
-     */
579
-    public function SetX($x, $rtloff = false)
580
-    {
581
-        $this->x = $x;
582
-    }
583
-
584
-    /**
585
-     * we redifine the original SetY method, because we don't want the automatic treatment.
586
-     * It is HTML2PDF that make the treatment
587
-     *
588
-     * @param float   $y
589
-     * @param boolean $resetx Reset the X position
590
-     * @param boolean $rtloff NOT USED
591
-     * @access public
592
-     */
593
-    public function SetY($y, $resetx = true, $rtloff = false)
594
-    {
595
-        if ($resetx)
596
-            $this->x = $this->lMargin;
597
-
598
-        $this->y = $y;
599
-    }
600
-
601
-    /**
602
-     * we redifine the original SetXY method, because we don't want the automatic treatment.
603
-     * It is HTML2PDF that make the treatment
604
-     *
605
-     * @param integer $x
606
-     * @param integer $y
607
-     * @param boolean $rtloff NOT USED
608
-     * @access public
609
-     */
610
-    public function SetXY($x, $y, $rtloff = false)
611
-    {
612
-        $this->x = $x;
613
-        $this->y = $y;
614
-    }
615
-
616
-    /**
617
-     * multiple public accessor because HTML2PDF need to use TCPDF without being a extend of it
618
-     *
619
-     * @param  mixed
620
-     * @return mixed
621
-     * @access public
622
-     */
623
-    public function getK()
624
-    {
625
-        return $this->k;
626
-    }
627
-
628
-    /**
629
-     * @return double
630
-     */
631
-    public function getW()
632
-    {
633
-        return $this->w;
634
-    }
635
-
636
-    /**
637
-     * @return double
638
-     */
639
-    public function getH()
640
-    {
641
-        return $this->h;
642
-    }
643
-    public function getlMargin()
644
-    {
645
-        return $this->lMargin;
646
-    }
647
-
648
-    /**
649
-     * @return double
650
-     */
651
-    public function getrMargin()
652
-    {
653
-        return $this->rMargin;
654
-    }
655
-
656
-    /**
657
-     * @return double
658
-     */
659
-    public function gettMargin()
660
-    {
661
-        return $this->tMargin;
662
-    }
663
-    public function getbMargin()
664
-    {
665
-        return $this->bMargin;
666
-    }
667
-    public function setbMargin($v)
668
-    {
669
-        $this->bMargin = $v;
670
-    }
671
-
672
-    /**
673
-     * SVG - Convert a SVG Style in PDF Style
674
-     *
675
-     * @param  array  $styles SVG Style
676
-     * @return string PDF style
677
-     * @access public
678
-     */
679
-    public function svgSetStyle($styles)
680
-    {
681
-        // init the PDF style
682
-        $style = '';
683
-
684
-        // Style : fill
685
-        if ($styles['fill']) {
686
-            $this->setFillColorArray($styles['fill']);
687
-            $style .= 'F';
688
-        }
689
-
690
-        // Style : stroke
691
-        if ($styles['stroke'] && $styles['stroke-width']) {
692
-            $this->SetDrawColorArray($styles['stroke']);
693
-            $this->SetLineWidth($styles['stroke-width']);
694
-            $style .= 'D';
695
-        }
696
-
697
-        // Style : opacity
698
-        if ($styles['fill-opacity']) {
699
-            $this->SetAlpha($styles['fill-opacity']);
700
-        }
701
-
702
-        return $style;
703
-    }
704
-
705
-    /**
706
-     * SVG - make a Rectangle
707
-     *
708
-     * @param float $x
709
-     * @param float $y
710
-     * @param float $w
711
-     * @param float $h
712
-     * @param string $style PDF Style
713
-     * @access public
714
-     */
715
-    public function svgRect($x, $y, $w, $h, $style)
716
-    {
717
-        // prepare the 4 corners
718
-        $x1 = $x;
719
-        $x2 = $x + $w;
720
-        $x3 = $x + $w;
721
-        $x4 = $x;
722
-
723
-        $y1 = $y;
724
-        $y2 = $y;
725
-        $y3 = $y + $h;
726
-        $y4 = $y + $h;
727
-
728
-        // get the Closing operator from the PDF Style
729
-        if ($style == 'F') $op = 'f';
730
-        elseif ($style == 'FD' || $style == 'DF') $op = 'B';
731
-        else $op = 'S';
732
-
733
-        // drawing
734
-        $this->_Point($x1, $y1, true);
735
-        $this->_Line($x2, $y2, true);
736
-        $this->_Line($x3, $y3, true);
737
-        $this->_Line($x4, $y4, true);
738
-        $this->_Line($x1, $y1, true);
739
-        $this->_out($op);
740
-    }
741
-
742
-    /**
743
-     * SVG - make a Line
744
-     *
745
-     * @param float $x1
746
-     * @param float $y1
747
-     * @param float $x2
748
-     * @param float $y2
749
-     * @access public
750
-     */
751
-    public function svgLine($x1, $y1, $x2, $y2)
752
-    {
753
-        // get the Closing operator
754
-        $op = 'S';
755
-
756
-        // drawing
757
-        $this->_Point($x1, $y1, true);
758
-        $this->_Line($x2, $y2, true);
759
-        $this->_out($op);
760
-    }
761
-
762
-    /**
763
-     * SVG - make a Ellipse
764
-     *
765
-     * @param float  $x0 x Center
766
-     * @param float  $y0 y Center
767
-     * @param float  $rx x radius
768
-     * @param float  $ry y radius
769
-     * @param string $style PDF Style
770
-     * @access public
771
-     */
772
-    public function svgEllipse($x0, $y0, $rx, $ry, $style)
773
-    {
774
-        // get the Closing operator from the PDF Style
775
-        if ($style == 'F') $op = 'f';
776
-        elseif ($style == 'FD' || $style == 'DF') $op = 'B';
777
-        else $op = 'S';
778
-
779
-        // drawing
780
-        $this->_Arc($x0, $y0, $rx, $ry, 0, 2 * M_PI, true, true, true);
781
-        $this->_out($op);
782
-    }
783
-
784
-    /**
785
-     * SVG - make a Advanced Polygone
786
-     *
787
-     * @param array  $actions list of actions
788
-     * @param string $style PDF Style
789
-     * @access public
790
-     */
791
-    public function svgPolygone($actions, $style)
792
-    {
793
-        // get the Closing operator from the PDF Style
794
-        if ($style == 'F') $op = 'f';
795
-        elseif ($style == 'FD' || $style == 'DF') $op = 'B';
796
-        else $op = 'S';
797
-
798
-        // To save the First action and the last point
799
-        $first = array('', 0, 0);
800
-        $last = array(0, 0, 0, 0);
801
-
802
-        foreach ($actions as $action) {
803
-            switch ($action[0])
804
-            {
805
-                // Start the Path
806
-                case 'M':
807
-                case 'm':
808
-                    $first = $action;
809
-                    $x = $action[1]; $y = $action[2]; $xc = $x; $yc = $y;
810
-                    $this->_Point($x, $y, true);
811
-                    break;
812
-
813
-                // Close the Path
814
-                case 'Z':
815
-                case 'z':
816
-                    $x = $first[1]; $y = $first[2]; $xc = $x; $yc = $y;
817
-                    $this->_Line($x, $y, true);
818
-                    break;
819
-
820
-                // Make a Line (new point)
821
-                case 'L':
822
-                    $x = $action[1]; $y = $action[2]; $xc = $x; $yc = $y;
823
-                    $this->_Line($x, $y, true);
824
-                    break;
825
-
826
-                // Make a Line (vector from last point)
827
-                case 'l':
828
-                    $x = $last[0] + $action[1]; $y = $last[1] + $action[2]; $xc = $x; $yc = $y;
829
-                    $this->_Line($x, $y, true);
830
-                    break;
831
-
832
-                // Make a Horizontal Line (new point)
833
-                case 'H':
834
-                    $x = $action[1]; $y = $last[1]; $xc = $x; $yc = $y;
835
-                    $this->_Line($x, $y, true);
836
-                    break;
837
-
838
-                // Make a Horisontal Line (vector from last point)
839
-                case 'h':
840
-                    $x = $last[0] + $action[1]; $y = $last[1]; $xc = $x; $yc = $y;
841
-                    $this->_Line($x, $y, true);
842
-                    break;
843
-
844
-                // Make a Vertical Line (new point)
845
-                case 'V':
846
-                    $x = $last[0]; $y = $action[1]; $xc = $x; $yc = $y;
847
-                    $this->_Line($x, $y, true);
848
-                    break;
849
-
850
-                // Make a Vertical Line (vector from last point)
851
-                case 'v':
852
-                    $x = $last[0]; $y = $last[1] + $action[1]; $xc = $x; $yc = $y;
853
-                    $this->_Line($x, $y, true);
854
-                    break;
855
-
856
-                // Make a Arc (new point)
857
-                case 'A':
858
-                    $rx = $action[1]; // rx
859
-                    $ry = $action[2]; // ry
860
-                    $a = $action[3]; // deviation angle of the axis X
861
-                    $l = $action[4]; // large-arc-flag
862
-                    $s = $action[5]; // sweep-flag
863
-                    $x1 = $last[0]; // begin x
864
-                    $y1 = $last[1]; // begin y
865
-                    $x2 = $action[6]; // final x
866
-                    $y2 = $action[7]; // final y
867
-
868
-                    $this->_Arc2($x1, $y1, $x2, $y2, $rx, $ry, $a, $l, $s, true);
869
-                    $x = $x2; $y = $y2; $xc = $x; $yc = $y;
870
-                    break;
871
-
872
-                // Make a Arc (vector from last point)
873
-                case 'a':
874
-                    $rx = $action[1]; // rx
875
-                    $ry = $action[2]; // ry
876
-                    $a = $action[3]; // deviation angle of the axis X
877
-                    $l = $action[4]; // large-arc-flag
878
-                    $s = $action[5]; // sweep-flag
879
-                    $x1 = $last[0]; // begin x
880
-                    $y1 = $last[1]; // begin y
881
-                    $x2 = $last[0] + $action[6]; // final x
882
-                    $y2 = $last[1] + $action[7]; // final y
883
-
884
-                    $this->_Arc2($x1, $y1, $x2, $y2, $rx, $ry, $a, $l, $s, true);
885
-                    $x = $x2; $y = $y2; $xc = $x; $yc = $y;
886
-                    break;
887
-
888
-                // Make a Bezier Curve (new point)
889
-                case 'C':
890
-                    $x1 = $action[1];
891
-                    $y1 = $action[2];
892
-                    $x2 = $action[3];
893
-                    $y2 = $action[4];
894
-                    $xf = $action[5];
895
-                    $yf = $action[6];
896
-                    $this->_Curve($x1, $y1, $x2, $y2, $xf, $yf, true);
897
-                    $x = $xf; $y = $yf; $xc = $x2; $yc = $y2;
898
-                    break;
899
-
900
-                // Make a Bezier Curve (vector from last point)
901
-                case 'c':
902
-                    $x1 = $last[0] + $action[1];
903
-                    $y1 = $last[1] + $action[2];
904
-                    $x2 = $last[0] + $action[3];
905
-                    $y2 = $last[1] + $action[4];
906
-                    $xf = $last[0] + $action[5];
907
-                    $yf = $last[1] + $action[6];
908
-                    $this->_Curve($x1, $y1, $x2, $y2, $xf, $yf, true);
909
-                    $x = $xf; $y = $yf; $xc = $x2; $yc = $y2;
910
-                    break;
911
-
912
-                // Unknown Path
913
-                default:
914
-                    throw new HTML2PDF_exception(0, 'SVG Path Error : ['.$action[0].'] unkown');
915
-            }
916
-
917
-            // save the last point
918
-            $last = array($x, $y, $xc, $yc);
919
-        }
920
-
921
-        // finish the path
922
-        $this->_out($op);
923
-    }
924
-
925
-    /**
926
-     * SVG - go to a point
927
-     *
928
-     * @param float   $x
929
-     * @param float   $y
930
-     * @param boolean $trans apply transformation
931
-     * @access protected
932
-     */
933
-    protected function _Point($x, $y, $trans = false)
934
-    {
935
-        if ($trans) {
936
-        	$this->ptTransform($x, $y);
937
-        }
938
-
939
-        $this->_out(sprintf('%.2F %.2F m', $x, $y));
940
-    }
941
-
942
-    /**
943
-     * SVG - make a line from the last point to (x,y)
944
-     *
945
-     * @param float   $x
946
-     * @param float   $y
947
-     * @param boolean $trans apply transformation
948
-     * @access protected
949
-     */
950
-    protected function _Line($x, $y, $trans = false)
951
-    {
952
-        if ($trans) {
953
-        	$this->ptTransform($x, $y);
954
-        }
955
-
956
-        $this->_out(sprintf('%.2F %.2F l', $x, $y));
957
-    }
958
-
959
-    /**
960
-     * SVG - make a bezier curve from the last point to (xf,yf), with the 2 direction points (x1,y1) and (x2,y2)
961
-     *
962
-     * @param float $x1
963
-     * @param float $y1
964
-     * @param float $x2
965
-     * @param float $y2
966
-     * @param float $xf
967
-     * @param float $yf
968
-     * @param boolean $trans apply transformation
969
-     * @access protected
970
-     */
971
-    protected function _Curve($x1, $y1, $x2, $y2, $xf, $yf, $trans = false)
972
-    {
973
-        if ($trans) {
974
-            $this->ptTransform($x1, $y1);
975
-            $this->ptTransform($x2, $y2);
976
-            $this->ptTransform($xf, $yf);
977
-        }
978
-        $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c', $x1, $y1, $x2, $y2, $xf, $yf));
979
-    }
980
-
981
-    /**
982
-     * SVG - make a arc with Center, Radius, from angleBegin to angleEnd
983
-     *
984
-     * @param float $xc
985
-     * @param float $yc
986
-     * @param float $rx
987
-     * @param float $ry
988
-     * @param float $angleBegin in radians
989
-     * @param float $angleEnd in radians
990
-     * @param boolean $direction
991
-     * @param boolean $drawFirst, true => add the first point
992
-     * @param boolean $trans apply transformation
993
-     * @access protected
994
-     */
995
-    protected function _Arc(
996
-        $xc,
997
-        $yc,
998
-        $rx,
999
-        $ry,
1000
-        $angleBegin,
1001
-        $angleEnd,
1002
-        $direction = true,
1003
-        $drawFirst = true,
1004
-        $trans = false)
1005
-    {
1006
-        // if we want the no trigo direction : add 2PI to the begin angle, to invert the direction
1007
-        if ( ! $direction) $angleBegin += M_PI * 2.;
1008
-
1009
-        // cut in segment to convert in berize curv
1010
-        $dt = ($angleEnd - $angleBegin) / self::ARC_NB_SEGMENT;
1011
-        $dtm = $dt / 3;
1012
-
1013
-        // center of the arc
1014
-        $x0 = $xc; $y0 = $yc;
1015
-
1016
-        // calculing the first point
1017
-        $t1 = $angleBegin;
1018
-        $a0 = $x0 + ($rx * cos($t1));
1019
-        $b0 = $y0 + ($ry * sin($t1));
1020
-        $c0 = -$rx * sin($t1);
1021
-        $d0 = $ry * cos($t1);
1022
-
1023
-        // if drawFirst => draw the first point
1024
-        if ($drawFirst) {
1025
-        	$this->_Point($a0, $b0, $trans);
1026
-        }
1027
-
1028
-        // foreach segment
1029
-        for ($i = 1; $i <= self::ARC_NB_SEGMENT; $i++) {
1030
-            // calculing the next point
1031
-            $t1 = ($i * $dt) + $angleBegin;
1032
-            $a1 = $x0 + ($rx * cos($t1));
1033
-            $b1 = $y0 + ($ry * sin($t1));
1034
-            $c1 = -$rx * sin($t1);
1035
-            $d1 = $ry * cos($t1);
1036
-
1037
-            // make the bezier curv
1038
-            $this->_Curve(
1039
-                $a0 + ($c0 * $dtm), $b0 + ($d0 * $dtm),
1040
-                $a1 - ($c1 * $dtm), $b1 - ($d1 * $dtm),
1041
-                $a1, $b1,
1042
-                $trans
1043
-            );
1044
-
1045
-            // save the point
1046
-            $a0 = $a1;
1047
-            $b0 = $b1;
1048
-            $c0 = $c1;
1049
-            $d0 = $d1;
1050
-        }
1051
-    }
1052
-
1053
-    /**
1054
-     * SVG - make a arc from Pt1 to Pt2, with Radius
1055
-     *
1056
-     * @param float $x1
1057
-     * @param float $y1
1058
-     * @param float $x2
1059
-     * @param float $y2
1060
-     * @param float $rx
1061
-     * @param float $ry
1062
-     * @param float $angle deviation angle of the axis X
1063
-     * @param integer $l large-arc-flag
1064
-     * @param integer $s sweep-flag
1065
-     * @param boolean $trans apply transformation
1066
-     * @access protected
1067
-     */
1068
-    protected function _Arc2($x1, $y1, $x2, $y2, $rx, $ry, $angle = 0., $l = 0, $s = 0, $trans = false)
1069
-    {
1070
-        // array to stock the parameters
1071
-        $v = array();
1072
-
1073
-        // the original values
1074
-        $v['x1'] = $x1;
1075
-        $v['y1'] = $y1;
1076
-        $v['x2'] = $x2;
1077
-        $v['y2'] = $y2;
1078
-        $v['rx'] = $rx;
1079
-        $v['ry'] = $ry;
1080
-
1081
-        // rotate with the deviation angle of the axis X
1082
-        $v['xr1'] = $v['x1'] * cos($angle) - $v['y1'] * sin($angle);
1083
-        $v['yr1'] = $v['x1'] * sin($angle) + $v['y1'] * cos($angle);
1084
-        $v['xr2'] = $v['x2'] * cos($angle) - $v['y2'] * sin($angle);
1085
-        $v['yr2'] = $v['x2'] * sin($angle) + $v['y2'] * cos($angle);
1086
-
1087
-        // the normalized vector
1088
-        $v['Xr1'] = $v['xr1'] / $v['rx'];
1089
-        $v['Yr1'] = $v['yr1'] / $v['ry'];
1090
-        $v['Xr2'] = $v['xr2'] / $v['rx'];
1091
-        $v['Yr2'] = $v['yr2'] / $v['ry'];
1092
-        $v['dXr'] = $v['Xr2'] - $v['Xr1'];
1093
-        $v['dYr'] = $v['Yr2'] - $v['Yr1'];
1094
-        $v['D'] = $v['dXr'] * $v['dXr'] + $v['dYr'] * $v['dYr'];
1095
-
1096
-        // if |vector| is Null, or if |vector| > 2 : impossible to make a arc => Line
1097
-        if ($v['D'] == 0 || $v['D'] > 4) {
1098
-            $this->_Line($x2, $y2, $trans);
1099
-            return false;
1100
-        }
1101
-
1102
-        // convert paramters for make a arc with Center, Radius, from angleBegin to angleEnd
1103
-        $v['s1'] = array();
1104
-        $v['s1']['t'] = sqrt((4. - $v['D']) / $v['D']);
1105
-        $v['s1']['Xr'] = ($v['Xr1'] + $v['Xr2']) / 2. + $v['s1']['t'] * ($v['Yr2'] - $v['Yr1']) / 2.;
1106
-        $v['s1']['Yr'] = ($v['Yr1'] + $v['Yr2']) / 2. + $v['s1']['t'] * ($v['Xr1'] - $v['Xr2']) / 2.;
1107
-        $v['s1']['xr'] = $v['s1']['Xr'] * $v['rx'];
1108
-        $v['s1']['yr'] = $v['s1']['Yr'] * $v['ry'];
1109
-        $v['s1']['x'] = $v['s1']['xr'] * cos($angle) + $v['s1']['yr'] * sin($angle);
1110
-        $v['s1']['y'] = -$v['s1']['xr'] * sin($angle) + $v['s1']['yr'] * cos($angle);
1111
-        $v['s1']['a1'] = atan2($v['y1'] - $v['s1']['y'], $v['x1'] - $v['s1']['x']);
1112
-        $v['s1']['a2'] = atan2($v['y2'] - $v['s1']['y'], $v['x2'] - $v['s1']['x']);
1113
-        if ($v['s1']['a1'] > $v['s1']['a2']) $v['s1']['a1'] -= 2 * M_PI;
1114
-
1115
-        $v['s2'] = array();
1116
-        $v['s2']['t'] = -$v['s1']['t'];
1117
-        $v['s2']['Xr'] = ($v['Xr1'] + $v['Xr2']) / 2. + $v['s2']['t'] * ($v['Yr2'] - $v['Yr1']) / 2.;
1118
-        $v['s2']['Yr'] = ($v['Yr1'] + $v['Yr2']) / 2. + $v['s2']['t'] * ($v['Xr1'] - $v['Xr2']) / 2.;
1119
-        $v['s2']['xr'] = $v['s2']['Xr'] * $v['rx'];
1120
-        $v['s2']['yr'] = $v['s2']['Yr'] * $v['ry'];
1121
-        $v['s2']['x'] = $v['s2']['xr'] * cos($angle) + $v['s2']['yr'] * sin($angle);
1122
-        $v['s2']['y'] = -$v['s2']['xr'] * sin($angle) + $v['s2']['yr'] * cos($angle);
1123
-        $v['s2']['a1'] = atan2($v['y1'] - $v['s2']['y'], $v['x1'] - $v['s2']['x']);
1124
-        $v['s2']['a2'] = atan2($v['y2'] - $v['s2']['y'], $v['x2'] - $v['s2']['x']);
1125
-        if ($v['s2']['a1'] > $v['s2']['a2']) $v['s2']['a1'] -= 2 * M_PI;
1126
-
1127
-        if ( ! $l) {
1128
-            if ($s) {
1129
-                $xc = $v['s2']['x'];
1130
-                $yc = $v['s2']['y'];
1131
-                $a1 = $v['s2']['a1'];
1132
-                $a2 = $v['s2']['a2'];
1133
-                $this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, true, false, $trans);
1134
-            } else {
1135
-                $xc = $v['s1']['x'];
1136
-                $yc = $v['s1']['y'];
1137
-                $a1 = $v['s1']['a1'];
1138
-                $a2 = $v['s1']['a2'];
1139
-                $this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, false, false, $trans);
1140
-            }
1141
-        } else {
1142
-            if ($s) {
1143
-                $xc = $v['s1']['x'];
1144
-                $yc = $v['s1']['y'];
1145
-                $a1 = $v['s1']['a1'];
1146
-                $a2 = $v['s1']['a2'];
1147
-                $this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, true, false, $trans);
1148
-            } else {
1149
-                $xc = $v['s2']['x'];
1150
-                $yc = $v['s2']['y'];
1151
-                $a1 = $v['s2']['a1'];
1152
-                $a2 = $v['s2']['a2'];
1153
-                $this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, false, false, $trans);
1154
-            }
1155
-        }
1156
-    }
1157
-
1158
-    /**
1159
-     * SVG - transform the point (reference)
1160
-     *
1161
-     * @param float &$x
1162
-     * @param float &$y
1163
-     * @param boolean $trans true => convert into PDF unit
1164
-     * @param double $x
1165
-     * @param double $y
1166
-     * @return boolean
1167
-     * @access public
1168
-     */
1169
-    public function ptTransform(&$x, &$y, $trans = true)
1170
-    {
1171
-        // load the last Transfomation Matrix
1172
-        $nb = count($this->_transf);
1173
-        if ($nb)    $m = $this->_transf[$nb - 1];
1174
-        else        $m = array(1, 0, 0, 1, 0, 0);
1175
-
1176
-        // apply the Transformation Matrix
1177
-        list($x, $y) = array(($x * $m[0] + $y * $m[2] + $m[4]), ($x * $m[1] + $y * $m[3] + $m[5]));
1178
-
1179
-        // if true => convert into PDF unit
1180
-        if ($trans) {
1181
-            $x = $x * $this->k;
1182
-            $y = ($this->h - $y) * $this->k;
1183
-        }
1184
-
1185
-        return true;
1186
-    }
1187
-
1188
-    /**
1189
-     * SVG - add a transformation Matric
1190
-     *
1191
-     * @param array $n matrix
1192
-     * @access public
1193
-     */
1194
-    public function doTransform($n = null)
1195
-    {
1196
-        // get the last Transformation Matrix
1197
-        $nb = count($this->_transf);
1198
-        if ($nb)    $m = $this->_transf[$nb - 1];
1199
-        else        $m = array(1, 0, 0, 1, 0, 0);
1200
-
1201
-        // if no transform, get the Identity Matrix
1202
-        if ( ! $n) $n = array(1, 0, 0, 1, 0, 0);
1203
-
1204
-        // create the new Transformation Matrix
1205
-        $this->_transf[] = array(
1206
-            $m[0] * $n[0] + $m[2] * $n[1],
1207
-            $m[1] * $n[0] + $m[3] * $n[1],
1208
-            $m[0] * $n[2] + $m[2] * $n[3],
1209
-            $m[1] * $n[2] + $m[3] * $n[3],
1210
-            $m[0] * $n[4] + $m[2] * $n[5] + $m[4],
1211
-            $m[1] * $n[4] + $m[3] * $n[5] + $m[5]
1212
-        );
1213
-    }
1214
-
1215
-    /**
1216
-     * SVG - remove a transformation Matric
1217
-     *
1218
-     * @access public
1219
-     */
1220
-    public function undoTransform()
1221
-    {
1222
-        array_pop($this->_transf);
1223
-    }
1224
-
1225
-    /**
1226
-     * Convert a HTML2PDF barcode in a TCPDF barcode
1227
-     *
1228
-     * @param string $code code to print
1229
-     * @param string $type type of barcode (see tcpdf/barcodes.php for supported formats)
1230
-     * @param int $x x position in user units
1231
-     * @param int $y y position in user units
1232
-     * @param int $w width in user units
1233
-     * @param int $h height in user units
1234
-     * @param int $labelFontsize of the Test Label. If false : no Label
1235
-     * @param array $color color of the foreground
1236
-     * @access public
1237
-     */
1238
-    public function myBarcode($code, $type, $x, $y, $w, $h, $labelFontsize, $color)
1239
-    {
1240
-        // the style of the barcode
1241
-        $style = array(
1242
-            'position' => 'S',
1243
-            'text' => ($labelFontsize ? true : false),
1244
-            'fgcolor' => $color,
1245
-            'bgcolor' => false,
1246
-        );
1247
-
1248
-        // build the barcode
1249
-        $this->write1DBarcode($code, $type, $x, $y, $w, $h, '', $style, 'N');
1250
-
1251
-        // it Label => add the FontSize to the height
1252
-        if ($labelFontsize) $h += ($labelFontsize);
1253
-
1254
-        // return the size of the barcode
1255
-        return array($w, $h);
1256
-    }
1257
-
1258
-    /**
1259
-     * create a automatic Index on a page
1260
-     *
1261
-     * @param html2pdf $obj           parent object
1262
-     * @param string   $titre         Title of the Index Page
1263
-     * @param integer  $sizeTitle     Font size for hthe Title
1264
-     * @param integer  $sizeBookmark  Font size for the bookmarks
1265
-     * @param boolean  $bookmarkTitle Bookmark the Title
1266
-     * @param boolean  $displayPage   Display the page number for each bookmark
1267
-     * @param integer  $page draw the automatic Index on a specific Page. if null => add a page at the end
1268
-     * @param string   $fontName      FontName to use
1269
-     * @access public
1270
-     */
1271
-    public function createIndex(
1272
-        &$obj,
1273
-        $titre = 'Index',
1274
-        $sizeTitle = 20,
1275
-        $sizeBookmark = 15,
1276
-        $bookmarkTitle = true,
1277
-        $displayPage = true,
1278
-        $page = null,
1279
-        $fontName = 'helvetica')
1280
-    {
1281
-        // bookmark the Title if wanted
1282
-        if ($bookmarkTitle) {
1283
-        	$this->Bookmark($titre, 0, -1);
1284
-        }
1285
-
1286
-        // display the Title with the good Font size
1287
-        $this->SetFont($fontName, '', $sizeTitle);
1288
-        $this->Cell(0, 5, $titre, 0, 1, 'C');
1289
-
1290
-        // set the good Font size for the bookmarks
1291
-        $this->SetFont($fontName, '', $sizeBookmark);
1292
-        $this->Ln(10);
1293
-
1294
-        // get the number of bookmarks
1295
-        $size = sizeof($this->outlines);
1296
-
1297
-        // get the size of the "P. xx" cell
1298
-        $pageCellSize = $this->GetStringWidth('p. '.$this->outlines[$size - 1]['p']) + 2;
1299
-
1300
-        // Foreach bookmark
1301
-        for ($i = 0; $i < $size; $i++) {
1302
-            // if we need a new page => add a new page
1303
-            if ($this->getY() + $this->FontSize >= ($this->h - $this->bMargin)) {
1304
-                $obj->_INDEX_NewPage($page);
1305
-                $this->SetFont($fontName, '', $sizeBookmark);
1306
-            }
1307
-
1308
-            // Offset of the current level
1309
-            $level = $this->outlines[$i]['l'];
1310
-            if ($level > 0) $this->Cell($level * 8);
1311
-
1312
-            // Caption (cut to fit on the width page)
1313
-            $str = $this->outlines[$i]['t'];
1314
-            $strsize = $this->GetStringWidth($str);
1315
-            $availableSize = $this->w - $this->lMargin - $this->rMargin - $pageCellSize - ($level * 8) - 4;
1316
-            while ($strsize >= $availableSize) {
1317
-                $str = substr($str, 0, -1);
1318
-                $strsize = $this->GetStringWidth($str);
1319
-            }
1320
-
1321
-            // if we want to display the page nmber
1322
-            if ($displayPage) {
1323
-                // display the Bookmark Caption
1324
-                $this->Cell($strsize + 2, $this->FontSize + 2, $str);
1325
-
1326
-                //Filling dots
1327
-                $w = $this->w - $this->lMargin - $this->rMargin - $pageCellSize - ($level * 8) - ($strsize + 2);
1328
-                $nb = $w / $this->GetStringWidth('.');
1329
-                $dots = str_repeat('.', $nb);
1330
-                $this->Cell($w, $this->FontSize + 2, $dots, 0, 0, 'R');
1331
-
1332
-                //Page number
1333
-                $this->Cell($pageCellSize, $this->FontSize + 2, 'p. '.$this->outlines[$i]['p'], 0, 1, 'R');
1334
-            } else {
1335
-                // display the Bookmark Caption
1336
-                $this->Cell($strsize + 2, $this->FontSize + 2, $str, 0, 1);
1337
-            }
1338
-        }
1339
-    }
1340
-
1341
-    /**
1342
-     * Returns the string alias used for the total number of pages.
1343
-     *
1344
-     * @access public
1345
-     * @return string;
1346
-     * @see TCPDF::getAliasNbPages(), TCPDF::getPageGroupAlias()
1347
-     */
1348
-    public function getMyAliasNbPages()
1349
-    {
1350
-        if ($this->_myLastPageGroupNb == 0) {
1351
-            return $this->getAliasNbPages();
1352
-        } else {
1353
-            $old = $this->currpagegroup;
1354
-            $this->currpagegroup = '{nb'.$this->_myLastPageGroupNb.'}';
1355
-            $new = $this->getPageGroupAlias();
1356
-            $this->currpagegroup = $old;
1357
-
1358
-            return $new;
1359
-        }
1360
-    }
1361
-
1362
-    /**
1363
-     * Returns the current page number.
1364
-     *
1365
-     * @access public
1366
-     * @param  integer $page
1367
-     * @return integer;
1368
-     */
1369
-    public function getMyNumPage($page = null)
1370
-    {
1371
-        if ($page === null) {
1372
-            $page = $this->page;
1373
-        }
1374
-
1375
-        if ($this->_myLastPageGroupNb == 0) {
1376
-            return $page;
1377
-        } else {
1378
-            return $page - $this->_myLastPageGroup;
1379
-        }
1380
-    }
1381
-
1382
-    /**
1383
-     * Start a new group of pages
1384
-     *
1385
-     * @access public
1386
-     * @return integer;
1387
-     * @see tcpdf::startPageGroup
1388
-     */
1389
-    public function myStartPageGroup()
1390
-    {
1391
-        $this->_myLastPageGroup = $this->page - 1;
1392
-        $this->_myLastPageGroupNb++;
1393
-    }
1394
-
1395
-    /**
1396
-     * get $_myLastPageGroup;
1397
-     *
1398
-     * @access public
1399
-     * @return integer $_myLastPageGroup;
1400
-     */
1401
-    public function getMyLastPageGroup()
1402
-    {
1403
-        return $this->_myLastPageGroup;
1404
-    }
1405
-
1406
-    /**
1407
-     * set $_myLastPageGroup;
1408
-     *
1409
-     * @access public
1410
-     * @param integer $myLastPageGroup;
1411
-     * @param integer $myLastPageGroup
1412
-     */
1413
-    public function setMyLastPageGroup($myLastPageGroup)
1414
-    {
1415
-        $this->_myLastPageGroup = $myLastPageGroup;
1416
-    }
1417
-
1418
-    /**
1419
-     * get $_myLastPageGroupNb;
1420
-     *
1421
-     * @access public
1422
-     * @return integer $_myLastPageGroupNb;
1423
-     */
1424
-    public function getMyLastPageGroupNb()
1425
-    {
1426
-        return $this->_myLastPageGroupNb;
1427
-    }
1428
-
1429
-    /**
1430
-     * set $_myLastPageGroupNb;
1431
-     *
1432
-     * @access public
1433
-     * @param integer $myLastPageGroupNb;
1434
-     * @param integer $myLastPageGroupNb
1435
-     */
1436
-    public function setMyLastPageGroupNb($myLastPageGroupNb)
1437
-    {
1438
-        $this->_myLastPageGroupNb = $myLastPageGroupNb;
1439
-    }
17
+	protected $_footerParam = array();
18
+	protected $_transf      = array();
19
+	protected $_myLastPageGroup = null;
20
+	protected $_myLastPageGroupNb = 0;
21
+
22
+	// used to make a radius with bezier : (4/3 * (sqrt(2) - 1))
23
+	const MY_ARC = 0.5522847498;
24
+
25
+	// nb of segment to build a arc with bezier curv
26
+	const ARC_NB_SEGMENT = 8;
27
+
28
+	/**
29
+	 * class constructor
30
+	 *
31
+	 * @param string  $orientation page orientation, same as TCPDF
32
+	 * @param string  $unit        User measure unit, same as TCPDF
33
+	 * @param mixed   $format      The format used for pages, same as TCPDF
34
+	 * @param boolean $unicode     TRUE means that the input text is unicode (default = true)
35
+	 * @param String  $encoding    charset encoding; default is UTF-8
36
+	 * @param boolean $diskcache   if TRUE reduce the RAM memory usage by caching temporary data on filesystem (slower).
37
+	 * @access public
38
+	 */
39
+	public function __construct(
40
+		$orientation = 'P',
41
+		$unit = 'mm',
42
+		$format = 'A4',
43
+		$unicode = true,
44
+		$encoding = 'UTF-8',
45
+		$diskcache = false)
46
+	{
47
+		// call the parent constructor
48
+		parent::__construct($orientation, $unit, $format, $unicode, $encoding, $diskcache);
49
+
50
+		// init the specific parameters used by HTML2PDF
51
+		$this->SetCreator(PDF_CREATOR);
52
+		$this->SetAutoPageBreak(false, 0);
53
+		$this->linestyleCap = '2 J';
54
+		$this->setPrintHeader(false);
55
+		$this->jpeg_quality = 90;
56
+
57
+		// prepare the automatic footer
58
+		$this->SetMyFooter();
59
+
60
+		$this->cMargin = 0;
61
+	}
62
+
63
+	/**
64
+	 * Set the parameters for the automatic footer
65
+	 *
66
+	 * @param boolean $page display the page number
67
+	 * @param boolean $date display the date
68
+	 * @param boolean $hour display the hour
69
+	 * @param boolean $form display a warning abour forms
70
+	 * @access public
71
+	 */
72
+	public function SetMyFooter($page = false, $date = false, $hour = false, $form = false)
73
+	{
74
+		$page    = ($page ? true : false);
75
+		$date    = ($date ? true : false);
76
+		$hour    = ($hour ? true : false);
77
+		$form    = ($form ? true : false);
78
+
79
+		$this->_footerParam = array('page' => $page, 'date' => $date, 'hour' => $hour, 'form' => $form);
80
+	}
81
+
82
+	/**
83
+	 * This function is call automatically by TCPDF at the end of a page
84
+	 * It takes no parameters
85
+	 *
86
+	 * @access public
87
+	 */
88
+	public function Footer()
89
+	{
90
+		// prepare the text from the tranlated text
91
+		$txt = '';
92
+		if ($this->_footerParam['form']) {
93
+			$txt = (HTML2PDF_locale::get('pdf05'));
94
+		}
95
+		if ($this->_footerParam['date'] && $this->_footerParam['hour']) {
96
+			$txt .= ($txt ? ' - ' : '').(HTML2PDF_locale::get('pdf03'));
97
+		}
98
+		if ($this->_footerParam['date'] && ! $this->_footerParam['hour']) {
99
+			$txt .= ($txt ? ' - ' : '').(HTML2PDF_locale::get('pdf01'));
100
+		}
101
+		if ( ! $this->_footerParam['date'] && $this->_footerParam['hour']) {
102
+			$txt .= ($txt ? ' - ' : '').(HTML2PDF_locale::get('pdf02'));
103
+		}
104
+		if ($this->_footerParam['page']) {
105
+			$txt .= ($txt ? ' - ' : '').(HTML2PDF_locale::get('pdf04'));
106
+		}
107
+
108
+		if (strlen($txt) > 0) {
109
+			// replace some values
110
+			$toReplace = array(
111
+				'[[date_d]]'  => date('d'),
112
+				'[[date_m]]'  => date('m'),
113
+				'[[date_y]]'  => date('Y'),
114
+				'[[date_h]]'  => date('H'),
115
+				'[[date_i]]'  => date('i'),
116
+				'[[date_s]]'  => date('s'),
117
+				'[[page_cu]]' => $this->getMyNumPage(),
118
+				'[[page_nb]]' => $this->getMyAliasNbPages(),
119
+			);
120
+			$txt = str_replace(array_keys($toReplace), array_values($toReplace), $txt);
121
+
122
+			// draw the footer
123
+			parent::SetY(-11);
124
+			$this->SetFont('helvetica', 'I', 8);
125
+			$this->Cell(0, 10, $txt, 0, 0, 'R');
126
+		}
127
+	}
128
+
129
+	 /**
130
+	  * after cloning a object, we does not want to clone all the front informations
131
+	  * because it take a lot a time and a lot of memory => we use reference
132
+	  *
133
+	  * @param &HTML2PDF_myPdf object
134
+	  * @param HTML2PDF_myPdf $pdf
135
+	  * @access public
136
+	  */
137
+	public function cloneFontFrom(&$pdf)
138
+	{
139
+		$this->fonts            = &$pdf->getFonts();
140
+		$this->FontFiles        = &$pdf->getFontFiles();
141
+		$this->diffs            = &$pdf->getDiffs();
142
+		$this->fontlist         = &$pdf->getFontList();
143
+		$this->numfonts         = &$pdf->getNumFonts();
144
+		$this->fontkeys         = &$pdf->getFontKeys();
145
+		$this->font_obj_ids     = &$pdf->getFontObjIds();
146
+		$this->annotation_fonts = &$pdf->getAnnotFonts();
147
+	}
148
+
149
+	/**
150
+	 * multiple public accessor for some private attributs
151
+	 * used only by cloneFontFrom
152
+	 *
153
+	 * @return &array
154
+	 * @access public
155
+	 */
156
+	public function &getFonts()
157
+	{
158
+		return $this->fonts;
159
+	}
160
+	public function &getFontFiles()
161
+	{
162
+		return $this->FontFiles;
163
+	}
164
+	public function &getDiffs()
165
+	{
166
+		return $this->diffs;
167
+	}
168
+	public function &getFontList()
169
+	{
170
+		return $this->fontlist;
171
+	}
172
+	public function &getNumFonts()
173
+	{
174
+		return $this->numfonts;
175
+	}
176
+	public function &getFontKeys()
177
+	{
178
+		return $this->fontkeys;
179
+	}
180
+	public function &getFontObjIds()
181
+	{
182
+		return $this->font_obj_ids;
183
+	}
184
+	public function &getAnnotFonts()
185
+	{
186
+		return $this->annotation_fonts;
187
+	}
188
+
189
+	/**
190
+	 * Verify that a Font is already loaded
191
+	 *
192
+	 * @param string Font Key
193
+	 * @return boolean
194
+	 * @access public
195
+	 */
196
+	public function isLoadedFont($fontKey)
197
+	{
198
+		if (isset($this->fonts[$fontKey])) {
199
+			return true;
200
+		}
201
+
202
+		if (isset($this->CoreFonts[$fontKey])) {
203
+			return true;
204
+		}
205
+
206
+		return false;
207
+	}
208
+
209
+	/**
210
+	 * Get the Word Spacing
211
+	 *
212
+	 * @access public
213
+	 * @return float word spacing
214
+	 */
215
+	public function getWordSpacing()
216
+	{
217
+		return $this->ws;
218
+	}
219
+
220
+	/**
221
+	 * set the Word Spacing
222
+	 *
223
+	 * @param float word spacing
224
+	 * @access public
225
+	 */
226
+	public function setWordSpacing($ws = 0.)
227
+	{
228
+		$this->ws = $ws;
229
+		$this->_out(sprintf('%.3F Tw', $ws * $this->k));
230
+	}
231
+
232
+	/**
233
+	 * start to use a rectangular Cliping Path with radius corners
234
+	 *
235
+	 * @param float $x (top left corner)
236
+	 * @param float $y (top left corner)
237
+	 * @param float $w (x+w  = botom rigth corner)
238
+	 * @param float $h (y+h = botom rigth corner)
239
+	 * @param array $cornerTL radius of the Top Left corner
240
+	 * @param array $cornerTR radius of the Top Right corner
241
+	 * @param array $cornerBL radius of the Bottom Left corner
242
+	 * @param array $cornerBR radius of the Bottom Right corner
243
+	 * @access public
244
+	 */
245
+	public function clippingPathStart(
246
+		$x = null,
247
+		$y = null,
248
+		$w = null,
249
+		$h = null,
250
+		$cornerTL = null,
251
+		$cornerTR = null,
252
+		$cornerBL = null,
253
+		$cornerBR = null)
254
+	{
255
+		// init the path
256
+		$path = '';
257
+
258
+		// if we have the position and the size of the rectangle, we can proceed
259
+		if ($x !== null && $y !== null && $w !== null && $h !== null) {
260
+			// the positions of the rectangle's corners
261
+			$x1 = $x * $this->k;
262
+			$y1 = ($this->h - $y) * $this->k;
263
+
264
+			$x2 = ($x + $w) * $this->k;
265
+			$y2 = ($this->h - $y) * $this->k;
266
+
267
+			$x3 = ($x + $w) * $this->k;
268
+			$y3 = ($this->h - $y - $h) * $this->k;
269
+
270
+			$x4 = $x * $this->k;
271
+			$y4 = ($this->h - $y - $h) * $this->k;
272
+
273
+			// if we have at least one radius corner, then we proceed to a specific path, else it is just a rectangle
274
+			if ($cornerTL || $cornerTR || $cornerBL || $cornerBR) {
275
+				// prepare the radius values
276
+				if ($cornerTL) {
277
+					$cornerTL[0] = $cornerTL[0] * $this->k;
278
+					$cornerTL[1] = -$cornerTL[1] * $this->k;
279
+				}
280
+				if ($cornerTR) {
281
+					$cornerTR[0] = $cornerTR[0] * $this->k;
282
+					$cornerTR[1] = -$cornerTR[1] * $this->k;
283
+				}
284
+				if ($cornerBL) {
285
+					$cornerBL[0] = $cornerBL[0] * $this->k;
286
+					$cornerBL[1] = -$cornerBL[1] * $this->k;
287
+				}
288
+				if ($cornerBR) {
289
+					$cornerBR[0] = $cornerBR[0] * $this->k;
290
+					$cornerBR[1] = -$cornerBR[1] * $this->k;
291
+				}
292
+
293
+				// if TL radius then specific start else (X1,Y1)
294
+				if ($cornerTL) {
295
+					$path .= sprintf('%.2F %.2F m ', $x1 + $cornerTL[0], $y1);
296
+				} else {
297
+					$path .= sprintf('%.2F %.2F m ', $x1, $y1);
298
+				}
299
+
300
+				// if TR radius then line + arc, else line to (X2,Y2)
301
+				if ($cornerTR) {
302
+					$xt1 = ($x2 - $cornerTR[0]) + $cornerTR[0] * self::MY_ARC;
303
+					$yt1 = ($y2 + $cornerTR[1]) - $cornerTR[1];
304
+					$xt2 = ($x2 - $cornerTR[0]) + $cornerTR[0];
305
+					$yt2 = ($y2 + $cornerTR[1]) - $cornerTR[1] * self::MY_ARC;
306
+
307
+					$path .= sprintf('%.2F %.2F l ', $x2 - $cornerTR[0], $y2);
308
+					$path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x2, $y2 + $cornerTR[1]);
309
+				} else {
310
+					$path .= sprintf('%.2F %.2F l ', $x2, $y2);
311
+				}
312
+
313
+				// if BR radius then line + arc, else line to (X3, Y3)
314
+				if ($cornerBR) {
315
+					$xt1 = ($x3 - $cornerBR[0]) + $cornerBR[0];
316
+					$yt1 = ($y3 - $cornerBR[1]) + $cornerBR[1] * self::MY_ARC;
317
+					$xt2 = ($x3 - $cornerBR[0]) + $cornerBR[0] * self::MY_ARC;
318
+					$yt2 = ($y3 - $cornerBR[1]) + $cornerBR[1];
319
+
320
+					$path .= sprintf('%.2F %.2F l ', $x3, $y3 - $cornerBR[1]);
321
+					$path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x3 - $cornerBR[0], $y3);
322
+				} else {
323
+					$path .= sprintf('%.2F %.2F l ', $x3, $y3);
324
+				}
325
+
326
+				// if BL radius then line + arc, else line to (X4, Y4)
327
+				if ($cornerBL) {
328
+					$xt1 = ($x4 + $cornerBL[0]) - $cornerBL[0] * self::MY_ARC;
329
+					$yt1 = ($y4 - $cornerBL[1]) + $cornerBL[1];
330
+					$xt2 = ($x4 + $cornerBL[0]) - $cornerBL[0];
331
+					$yt2 = ($y4 - $cornerBL[1]) + $cornerBL[1] * self::MY_ARC;
332
+
333
+					$path .= sprintf('%.2F %.2F l ', $x4 + $cornerBL[0], $y4);
334
+					$path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x4, $y4 - $cornerBL[1]);
335
+				} else {
336
+					$path .= sprintf('%.2F %.2F l ', $x4, $y4);
337
+				}
338
+
339
+				// if RL radius then line + arc
340
+				if ($cornerTL) {
341
+					$xt1 = ($x1 + $cornerTL[0]) - $cornerTL[0];
342
+					$yt1 = ($y1 + $cornerTL[1]) - $cornerTL[1] * self::MY_ARC;
343
+					$xt2 = ($x1 + $cornerTL[0]) - $cornerTL[0] * self::MY_ARC;
344
+					$yt2 = ($y1 + $cornerTL[1]) - $cornerTL[1];
345
+
346
+					$path .= sprintf('%.2F %.2F l ', $x1, $y1 + $cornerTL[1]);
347
+					$path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x1 + $cornerTL[0], $y1);
348
+				}
349
+			} else {
350
+				$path .= sprintf('%.2F %.2F m ', $x1, $y1);
351
+				$path .= sprintf('%.2F %.2F l ', $x2, $y2);
352
+				$path .= sprintf('%.2F %.2F l ', $x3, $y3);
353
+				$path .= sprintf('%.2F %.2F l ', $x4, $y4);
354
+			}
355
+
356
+			// close the path
357
+			$path .= ' h W n';
358
+		}
359
+
360
+		// using the path as a clipping path
361
+		$this->_out('q '.$path.' ');
362
+	}
363
+
364
+	/**
365
+	 * stop to use the Cliping Path
366
+	 *
367
+	 * @access public
368
+	 */
369
+	public function clippingPathStop()
370
+	{
371
+		$this->_out(' Q');
372
+	}
373
+
374
+	/**
375
+	 * draw a filled corner of a border with a external and a internal radius
376
+	 *         /--------+ ext2
377
+	 *        /         |
378
+	 *       /  /-------+ int2
379
+	 *      /  /
380
+	 *      | /
381
+	 *      | |
382
+	 *      | |
383
+	 * ext1 +-+ int1        + cen
384
+	 *
385
+	 * @param float $ext1X
386
+	 * @param float $ext1Y
387
+	 * @param float $ext2X
388
+	 * @param float $ext2Y
389
+	 * @param float $int1X
390
+	 * @param float $int1Y
391
+	 * @param float $int2X
392
+	 * @param float $int2Y
393
+	 * @param float $cenX
394
+	 * @param float $cenY
395
+	 * @access public
396
+	 */
397
+	public function drawCurve($ext1X, $ext1Y, $ext2X, $ext2Y, $int1X, $int1Y, $int2X, $int2Y, $cenX, $cenY)
398
+	{
399
+		// prepare the coordinates
400
+		$ext1X = $ext1X * $this->k;
401
+		$ext2X = $ext2X * $this->k;
402
+		$int1X = $int1X * $this->k;
403
+		$int2X = $int2X * $this->k;
404
+		$cenX  = $cenX * $this->k;
405
+
406
+		$ext1Y = ($this->h - $ext1Y) * $this->k;
407
+		$ext2Y = ($this->h - $ext2Y) * $this->k;
408
+		$int1Y = ($this->h - $int1Y) * $this->k;
409
+		$int2Y = ($this->h - $int2Y) * $this->k;
410
+		$cenY  = ($this->h - $cenY) * $this->k;
411
+
412
+		// init the curve
413
+		$path = '';
414
+
415
+		if ($ext1X - $cenX != 0) {
416
+			$xt1 = $cenX + ($ext1X - $cenX);
417
+			$yt1 = $cenY + ($ext2Y - $cenY) * self::MY_ARC;
418
+			$xt2 = $cenX + ($ext1X - $cenX) * self::MY_ARC;
419
+			$yt2 = $cenY + ($ext2Y - $cenY);
420
+		} else {
421
+			$xt1 = $cenX + ($ext2X - $cenX) * self::MY_ARC;
422
+			$yt1 = $cenY + ($ext1Y - $cenY);
423
+			$xt2 = $cenX + ($ext2X - $cenX);
424
+			$yt2 = $cenY + ($ext1Y - $cenY) * self::MY_ARC;
425
+		}
426
+		$path .= sprintf('%.2F %.2F m ', $ext1X, $ext1Y);
427
+		$path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $ext2X, $ext2Y);
428
+
429
+		if ($int1X - $cenX != 0) {
430
+			$xt1 = $cenX + ($int1X - $cenX) * self::MY_ARC;
431
+			$yt1 = $cenY + ($int2Y - $cenY);
432
+			$xt2 = $cenX + ($int1X - $cenX);
433
+			$yt2 = $cenY + ($int2Y - $cenY) * self::MY_ARC;
434
+		} else {
435
+			$xt1 = $cenX + ($int2X - $cenX);
436
+			$yt1 = $cenY + ($int1Y - $cenY) * self::MY_ARC;
437
+			$xt2 = $cenX + ($int2X - $cenX) * self::MY_ARC;
438
+			$yt2 = $cenY + ($int1Y - $cenY);
439
+		}
440
+		$path .= sprintf('%.2F %.2F l ', $int2X, $int2Y);
441
+		$path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $int1X, $int1Y);
442
+
443
+		// draw the curve
444
+		$this->_out($path.'f');
445
+	}
446
+
447
+	/**
448
+	 * draw a filled corner of a border with only a external radius
449
+	 *         /--+ ext2
450
+	 *        /   |
451
+	 *       /    |
452
+	 *      /     |
453
+	 *      |     |
454
+	 *      |     |
455
+	 *      |     |
456
+	 * ext1 +-----+ int      + cen
457
+	 *
458
+	 * @param float $ext1X
459
+	 * @param float $ext1Y
460
+	 * @param float $ext2X
461
+	 * @param float $ext2Y
462
+	 * @param float $intX
463
+	 * @param float $intY
464
+	 * @param float $cenX
465
+	 * @param float $cenY
466
+	 * @access public
467
+	 */
468
+	public function drawCorner($ext1X, $ext1Y, $ext2X, $ext2Y, $intX, $intY, $cenX, $cenY)
469
+	{
470
+		// prepare the coordinates
471
+		$ext1X = $ext1X * $this->k;
472
+		$ext2X = $ext2X * $this->k;
473
+		$intX  = $intX * $this->k;
474
+		$cenX  = $cenX * $this->k;
475
+
476
+		$ext1Y = ($this->h - $ext1Y) * $this->k;
477
+		$ext2Y = ($this->h - $ext2Y) * $this->k;
478
+		$intY  = ($this->h - $intY) * $this->k;
479
+		$cenY  = ($this->h - $cenY) * $this->k;
480
+
481
+		// init the curve
482
+		$path = '';
483
+
484
+		if ($ext1X - $cenX != 0) {
485
+			$xt1 = $cenX + ($ext1X - $cenX);
486
+			$yt1 = $cenY + ($ext2Y - $cenY) * self::MY_ARC;
487
+			$xt2 = $cenX + ($ext1X - $cenX) * self::MY_ARC;
488
+			$yt2 = $cenY + ($ext2Y - $cenY);
489
+		} else {
490
+			$xt1 = $cenX + ($ext2X - $cenX) * self::MY_ARC;
491
+			$yt1 = $cenY + ($ext1Y - $cenY);
492
+			$xt2 = $cenX + ($ext2X - $cenX);
493
+			$yt2 = $cenY + ($ext1Y - $cenY) * self::MY_ARC;
494
+		}
495
+		$path .= sprintf('%.2F %.2F m ', $ext1X, $ext1Y);
496
+		$path .= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $ext2X, $ext2Y);
497
+		$path .= sprintf('%.2F %.2F l ', $intX, $intY);
498
+		$path .= sprintf('%.2F %.2F l ', $ext1X, $ext1Y);
499
+
500
+		// draw the curve
501
+		$this->_out($path.'f');
502
+	}
503
+
504
+	/**
505
+	 * Start a transformation
506
+	 *
507
+	 * @access public
508
+	 */
509
+	public function startTransform()
510
+	{
511
+		$this->_out('q');
512
+	}
513
+
514
+	/**
515
+	 * Stop a transformation
516
+	 *
517
+	 * @access public
518
+	 */
519
+	public function stopTransform()
520
+	{
521
+		$this->_out('Q');
522
+	}
523
+
524
+	/**
525
+	 * add a Translate transformation
526
+	 *
527
+	 * @access public
528
+	 */
529
+	public function setTranslate($xT, $yT)
530
+	{
531
+		// Matrix for Translate
532
+		$tm[0] = 1;
533
+		$tm[1] = 0;
534
+		$tm[2] = 0;
535
+		$tm[3] = 1;
536
+		$tm[4] = $xT * $this->k;
537
+		$tm[5] = -$yT * $this->k;
538
+
539
+		// apply the Transform Matric
540
+		$this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5]));
541
+	}
542
+
543
+	/**
544
+	 * add a Rotate transformation
545
+	 *
546
+	 * @param float $angle
547
+	 * @access public
548
+	 */
549
+	public function setRotation($angle, $xC = null, $yC = null)
550
+	{
551
+		// if no center, rotate around the current posiition
552
+		if ($xC === null) $xC = $this->x;
553
+		if ($yC === null) $yC = $this->y;
554
+
555
+		// prepare the coordinate
556
+		$yC = ($this->h - $yC) * $this->k;
557
+		$xC *= $this->k;
558
+
559
+		// Matrix for Rotate
560
+		$tm[0] = cos(deg2rad($angle));
561
+		$tm[1] = sin(deg2rad($angle));
562
+		$tm[2] = -$tm[1];
563
+		$tm[3] = $tm[0];
564
+		$tm[4] = $xC + $tm[1] * $yC - $tm[0] * $xC;
565
+		$tm[5] = $yC - $tm[0] * $yC - $tm[1] * $xC;
566
+
567
+		// apply the Transform Matric
568
+		$this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5]));
569
+	}
570
+
571
+	/**
572
+	 * we redifine the original SetX method, because we don't want the automatic treatment.
573
+	 * It is HTML2PDF that make the treatment
574
+	 *
575
+	 * @param float   $x
576
+	 * @param boolean $rtloff NOT USED
577
+	 * @access public
578
+	 */
579
+	public function SetX($x, $rtloff = false)
580
+	{
581
+		$this->x = $x;
582
+	}
583
+
584
+	/**
585
+	 * we redifine the original SetY method, because we don't want the automatic treatment.
586
+	 * It is HTML2PDF that make the treatment
587
+	 *
588
+	 * @param float   $y
589
+	 * @param boolean $resetx Reset the X position
590
+	 * @param boolean $rtloff NOT USED
591
+	 * @access public
592
+	 */
593
+	public function SetY($y, $resetx = true, $rtloff = false)
594
+	{
595
+		if ($resetx)
596
+			$this->x = $this->lMargin;
597
+
598
+		$this->y = $y;
599
+	}
600
+
601
+	/**
602
+	 * we redifine the original SetXY method, because we don't want the automatic treatment.
603
+	 * It is HTML2PDF that make the treatment
604
+	 *
605
+	 * @param integer $x
606
+	 * @param integer $y
607
+	 * @param boolean $rtloff NOT USED
608
+	 * @access public
609
+	 */
610
+	public function SetXY($x, $y, $rtloff = false)
611
+	{
612
+		$this->x = $x;
613
+		$this->y = $y;
614
+	}
615
+
616
+	/**
617
+	 * multiple public accessor because HTML2PDF need to use TCPDF without being a extend of it
618
+	 *
619
+	 * @param  mixed
620
+	 * @return mixed
621
+	 * @access public
622
+	 */
623
+	public function getK()
624
+	{
625
+		return $this->k;
626
+	}
627
+
628
+	/**
629
+	 * @return double
630
+	 */
631
+	public function getW()
632
+	{
633
+		return $this->w;
634
+	}
635
+
636
+	/**
637
+	 * @return double
638
+	 */
639
+	public function getH()
640
+	{
641
+		return $this->h;
642
+	}
643
+	public function getlMargin()
644
+	{
645
+		return $this->lMargin;
646
+	}
647
+
648
+	/**
649
+	 * @return double
650
+	 */
651
+	public function getrMargin()
652
+	{
653
+		return $this->rMargin;
654
+	}
655
+
656
+	/**
657
+	 * @return double
658
+	 */
659
+	public function gettMargin()
660
+	{
661
+		return $this->tMargin;
662
+	}
663
+	public function getbMargin()
664
+	{
665
+		return $this->bMargin;
666
+	}
667
+	public function setbMargin($v)
668
+	{
669
+		$this->bMargin = $v;
670
+	}
671
+
672
+	/**
673
+	 * SVG - Convert a SVG Style in PDF Style
674
+	 *
675
+	 * @param  array  $styles SVG Style
676
+	 * @return string PDF style
677
+	 * @access public
678
+	 */
679
+	public function svgSetStyle($styles)
680
+	{
681
+		// init the PDF style
682
+		$style = '';
683
+
684
+		// Style : fill
685
+		if ($styles['fill']) {
686
+			$this->setFillColorArray($styles['fill']);
687
+			$style .= 'F';
688
+		}
689
+
690
+		// Style : stroke
691
+		if ($styles['stroke'] && $styles['stroke-width']) {
692
+			$this->SetDrawColorArray($styles['stroke']);
693
+			$this->SetLineWidth($styles['stroke-width']);
694
+			$style .= 'D';
695
+		}
696
+
697
+		// Style : opacity
698
+		if ($styles['fill-opacity']) {
699
+			$this->SetAlpha($styles['fill-opacity']);
700
+		}
701
+
702
+		return $style;
703
+	}
704
+
705
+	/**
706
+	 * SVG - make a Rectangle
707
+	 *
708
+	 * @param float $x
709
+	 * @param float $y
710
+	 * @param float $w
711
+	 * @param float $h
712
+	 * @param string $style PDF Style
713
+	 * @access public
714
+	 */
715
+	public function svgRect($x, $y, $w, $h, $style)
716
+	{
717
+		// prepare the 4 corners
718
+		$x1 = $x;
719
+		$x2 = $x + $w;
720
+		$x3 = $x + $w;
721
+		$x4 = $x;
722
+
723
+		$y1 = $y;
724
+		$y2 = $y;
725
+		$y3 = $y + $h;
726
+		$y4 = $y + $h;
727
+
728
+		// get the Closing operator from the PDF Style
729
+		if ($style == 'F') $op = 'f';
730
+		elseif ($style == 'FD' || $style == 'DF') $op = 'B';
731
+		else $op = 'S';
732
+
733
+		// drawing
734
+		$this->_Point($x1, $y1, true);
735
+		$this->_Line($x2, $y2, true);
736
+		$this->_Line($x3, $y3, true);
737
+		$this->_Line($x4, $y4, true);
738
+		$this->_Line($x1, $y1, true);
739
+		$this->_out($op);
740
+	}
741
+
742
+	/**
743
+	 * SVG - make a Line
744
+	 *
745
+	 * @param float $x1
746
+	 * @param float $y1
747
+	 * @param float $x2
748
+	 * @param float $y2
749
+	 * @access public
750
+	 */
751
+	public function svgLine($x1, $y1, $x2, $y2)
752
+	{
753
+		// get the Closing operator
754
+		$op = 'S';
755
+
756
+		// drawing
757
+		$this->_Point($x1, $y1, true);
758
+		$this->_Line($x2, $y2, true);
759
+		$this->_out($op);
760
+	}
761
+
762
+	/**
763
+	 * SVG - make a Ellipse
764
+	 *
765
+	 * @param float  $x0 x Center
766
+	 * @param float  $y0 y Center
767
+	 * @param float  $rx x radius
768
+	 * @param float  $ry y radius
769
+	 * @param string $style PDF Style
770
+	 * @access public
771
+	 */
772
+	public function svgEllipse($x0, $y0, $rx, $ry, $style)
773
+	{
774
+		// get the Closing operator from the PDF Style
775
+		if ($style == 'F') $op = 'f';
776
+		elseif ($style == 'FD' || $style == 'DF') $op = 'B';
777
+		else $op = 'S';
778
+
779
+		// drawing
780
+		$this->_Arc($x0, $y0, $rx, $ry, 0, 2 * M_PI, true, true, true);
781
+		$this->_out($op);
782
+	}
783
+
784
+	/**
785
+	 * SVG - make a Advanced Polygone
786
+	 *
787
+	 * @param array  $actions list of actions
788
+	 * @param string $style PDF Style
789
+	 * @access public
790
+	 */
791
+	public function svgPolygone($actions, $style)
792
+	{
793
+		// get the Closing operator from the PDF Style
794
+		if ($style == 'F') $op = 'f';
795
+		elseif ($style == 'FD' || $style == 'DF') $op = 'B';
796
+		else $op = 'S';
797
+
798
+		// To save the First action and the last point
799
+		$first = array('', 0, 0);
800
+		$last = array(0, 0, 0, 0);
801
+
802
+		foreach ($actions as $action) {
803
+			switch ($action[0])
804
+			{
805
+				// Start the Path
806
+				case 'M':
807
+				case 'm':
808
+					$first = $action;
809
+					$x = $action[1]; $y = $action[2]; $xc = $x; $yc = $y;
810
+					$this->_Point($x, $y, true);
811
+					break;
812
+
813
+				// Close the Path
814
+				case 'Z':
815
+				case 'z':
816
+					$x = $first[1]; $y = $first[2]; $xc = $x; $yc = $y;
817
+					$this->_Line($x, $y, true);
818
+					break;
819
+
820
+				// Make a Line (new point)
821
+				case 'L':
822
+					$x = $action[1]; $y = $action[2]; $xc = $x; $yc = $y;
823
+					$this->_Line($x, $y, true);
824
+					break;
825
+
826
+				// Make a Line (vector from last point)
827
+				case 'l':
828
+					$x = $last[0] + $action[1]; $y = $last[1] + $action[2]; $xc = $x; $yc = $y;
829
+					$this->_Line($x, $y, true);
830
+					break;
831
+
832
+				// Make a Horizontal Line (new point)
833
+				case 'H':
834
+					$x = $action[1]; $y = $last[1]; $xc = $x; $yc = $y;
835
+					$this->_Line($x, $y, true);
836
+					break;
837
+
838
+				// Make a Horisontal Line (vector from last point)
839
+				case 'h':
840
+					$x = $last[0] + $action[1]; $y = $last[1]; $xc = $x; $yc = $y;
841
+					$this->_Line($x, $y, true);
842
+					break;
843
+
844
+				// Make a Vertical Line (new point)
845
+				case 'V':
846
+					$x = $last[0]; $y = $action[1]; $xc = $x; $yc = $y;
847
+					$this->_Line($x, $y, true);
848
+					break;
849
+
850
+				// Make a Vertical Line (vector from last point)
851
+				case 'v':
852
+					$x = $last[0]; $y = $last[1] + $action[1]; $xc = $x; $yc = $y;
853
+					$this->_Line($x, $y, true);
854
+					break;
855
+
856
+				// Make a Arc (new point)
857
+				case 'A':
858
+					$rx = $action[1]; // rx
859
+					$ry = $action[2]; // ry
860
+					$a = $action[3]; // deviation angle of the axis X
861
+					$l = $action[4]; // large-arc-flag
862
+					$s = $action[5]; // sweep-flag
863
+					$x1 = $last[0]; // begin x
864
+					$y1 = $last[1]; // begin y
865
+					$x2 = $action[6]; // final x
866
+					$y2 = $action[7]; // final y
867
+
868
+					$this->_Arc2($x1, $y1, $x2, $y2, $rx, $ry, $a, $l, $s, true);
869
+					$x = $x2; $y = $y2; $xc = $x; $yc = $y;
870
+					break;
871
+
872
+				// Make a Arc (vector from last point)
873
+				case 'a':
874
+					$rx = $action[1]; // rx
875
+					$ry = $action[2]; // ry
876
+					$a = $action[3]; // deviation angle of the axis X
877
+					$l = $action[4]; // large-arc-flag
878
+					$s = $action[5]; // sweep-flag
879
+					$x1 = $last[0]; // begin x
880
+					$y1 = $last[1]; // begin y
881
+					$x2 = $last[0] + $action[6]; // final x
882
+					$y2 = $last[1] + $action[7]; // final y
883
+
884
+					$this->_Arc2($x1, $y1, $x2, $y2, $rx, $ry, $a, $l, $s, true);
885
+					$x = $x2; $y = $y2; $xc = $x; $yc = $y;
886
+					break;
887
+
888
+				// Make a Bezier Curve (new point)
889
+				case 'C':
890
+					$x1 = $action[1];
891
+					$y1 = $action[2];
892
+					$x2 = $action[3];
893
+					$y2 = $action[4];
894
+					$xf = $action[5];
895
+					$yf = $action[6];
896
+					$this->_Curve($x1, $y1, $x2, $y2, $xf, $yf, true);
897
+					$x = $xf; $y = $yf; $xc = $x2; $yc = $y2;
898
+					break;
899
+
900
+				// Make a Bezier Curve (vector from last point)
901
+				case 'c':
902
+					$x1 = $last[0] + $action[1];
903
+					$y1 = $last[1] + $action[2];
904
+					$x2 = $last[0] + $action[3];
905
+					$y2 = $last[1] + $action[4];
906
+					$xf = $last[0] + $action[5];
907
+					$yf = $last[1] + $action[6];
908
+					$this->_Curve($x1, $y1, $x2, $y2, $xf, $yf, true);
909
+					$x = $xf; $y = $yf; $xc = $x2; $yc = $y2;
910
+					break;
911
+
912
+				// Unknown Path
913
+				default:
914
+					throw new HTML2PDF_exception(0, 'SVG Path Error : ['.$action[0].'] unkown');
915
+			}
916
+
917
+			// save the last point
918
+			$last = array($x, $y, $xc, $yc);
919
+		}
920
+
921
+		// finish the path
922
+		$this->_out($op);
923
+	}
924
+
925
+	/**
926
+	 * SVG - go to a point
927
+	 *
928
+	 * @param float   $x
929
+	 * @param float   $y
930
+	 * @param boolean $trans apply transformation
931
+	 * @access protected
932
+	 */
933
+	protected function _Point($x, $y, $trans = false)
934
+	{
935
+		if ($trans) {
936
+			$this->ptTransform($x, $y);
937
+		}
938
+
939
+		$this->_out(sprintf('%.2F %.2F m', $x, $y));
940
+	}
941
+
942
+	/**
943
+	 * SVG - make a line from the last point to (x,y)
944
+	 *
945
+	 * @param float   $x
946
+	 * @param float   $y
947
+	 * @param boolean $trans apply transformation
948
+	 * @access protected
949
+	 */
950
+	protected function _Line($x, $y, $trans = false)
951
+	{
952
+		if ($trans) {
953
+			$this->ptTransform($x, $y);
954
+		}
955
+
956
+		$this->_out(sprintf('%.2F %.2F l', $x, $y));
957
+	}
958
+
959
+	/**
960
+	 * SVG - make a bezier curve from the last point to (xf,yf), with the 2 direction points (x1,y1) and (x2,y2)
961
+	 *
962
+	 * @param float $x1
963
+	 * @param float $y1
964
+	 * @param float $x2
965
+	 * @param float $y2
966
+	 * @param float $xf
967
+	 * @param float $yf
968
+	 * @param boolean $trans apply transformation
969
+	 * @access protected
970
+	 */
971
+	protected function _Curve($x1, $y1, $x2, $y2, $xf, $yf, $trans = false)
972
+	{
973
+		if ($trans) {
974
+			$this->ptTransform($x1, $y1);
975
+			$this->ptTransform($x2, $y2);
976
+			$this->ptTransform($xf, $yf);
977
+		}
978
+		$this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c', $x1, $y1, $x2, $y2, $xf, $yf));
979
+	}
980
+
981
+	/**
982
+	 * SVG - make a arc with Center, Radius, from angleBegin to angleEnd
983
+	 *
984
+	 * @param float $xc
985
+	 * @param float $yc
986
+	 * @param float $rx
987
+	 * @param float $ry
988
+	 * @param float $angleBegin in radians
989
+	 * @param float $angleEnd in radians
990
+	 * @param boolean $direction
991
+	 * @param boolean $drawFirst, true => add the first point
992
+	 * @param boolean $trans apply transformation
993
+	 * @access protected
994
+	 */
995
+	protected function _Arc(
996
+		$xc,
997
+		$yc,
998
+		$rx,
999
+		$ry,
1000
+		$angleBegin,
1001
+		$angleEnd,
1002
+		$direction = true,
1003
+		$drawFirst = true,
1004
+		$trans = false)
1005
+	{
1006
+		// if we want the no trigo direction : add 2PI to the begin angle, to invert the direction
1007
+		if ( ! $direction) $angleBegin += M_PI * 2.;
1008
+
1009
+		// cut in segment to convert in berize curv
1010
+		$dt = ($angleEnd - $angleBegin) / self::ARC_NB_SEGMENT;
1011
+		$dtm = $dt / 3;
1012
+
1013
+		// center of the arc
1014
+		$x0 = $xc; $y0 = $yc;
1015
+
1016
+		// calculing the first point
1017
+		$t1 = $angleBegin;
1018
+		$a0 = $x0 + ($rx * cos($t1));
1019
+		$b0 = $y0 + ($ry * sin($t1));
1020
+		$c0 = -$rx * sin($t1);
1021
+		$d0 = $ry * cos($t1);
1022
+
1023
+		// if drawFirst => draw the first point
1024
+		if ($drawFirst) {
1025
+			$this->_Point($a0, $b0, $trans);
1026
+		}
1027
+
1028
+		// foreach segment
1029
+		for ($i = 1; $i <= self::ARC_NB_SEGMENT; $i++) {
1030
+			// calculing the next point
1031
+			$t1 = ($i * $dt) + $angleBegin;
1032
+			$a1 = $x0 + ($rx * cos($t1));
1033
+			$b1 = $y0 + ($ry * sin($t1));
1034
+			$c1 = -$rx * sin($t1);
1035
+			$d1 = $ry * cos($t1);
1036
+
1037
+			// make the bezier curv
1038
+			$this->_Curve(
1039
+				$a0 + ($c0 * $dtm), $b0 + ($d0 * $dtm),
1040
+				$a1 - ($c1 * $dtm), $b1 - ($d1 * $dtm),
1041
+				$a1, $b1,
1042
+				$trans
1043
+			);
1044
+
1045
+			// save the point
1046
+			$a0 = $a1;
1047
+			$b0 = $b1;
1048
+			$c0 = $c1;
1049
+			$d0 = $d1;
1050
+		}
1051
+	}
1052
+
1053
+	/**
1054
+	 * SVG - make a arc from Pt1 to Pt2, with Radius
1055
+	 *
1056
+	 * @param float $x1
1057
+	 * @param float $y1
1058
+	 * @param float $x2
1059
+	 * @param float $y2
1060
+	 * @param float $rx
1061
+	 * @param float $ry
1062
+	 * @param float $angle deviation angle of the axis X
1063
+	 * @param integer $l large-arc-flag
1064
+	 * @param integer $s sweep-flag
1065
+	 * @param boolean $trans apply transformation
1066
+	 * @access protected
1067
+	 */
1068
+	protected function _Arc2($x1, $y1, $x2, $y2, $rx, $ry, $angle = 0., $l = 0, $s = 0, $trans = false)
1069
+	{
1070
+		// array to stock the parameters
1071
+		$v = array();
1072
+
1073
+		// the original values
1074
+		$v['x1'] = $x1;
1075
+		$v['y1'] = $y1;
1076
+		$v['x2'] = $x2;
1077
+		$v['y2'] = $y2;
1078
+		$v['rx'] = $rx;
1079
+		$v['ry'] = $ry;
1080
+
1081
+		// rotate with the deviation angle of the axis X
1082
+		$v['xr1'] = $v['x1'] * cos($angle) - $v['y1'] * sin($angle);
1083
+		$v['yr1'] = $v['x1'] * sin($angle) + $v['y1'] * cos($angle);
1084
+		$v['xr2'] = $v['x2'] * cos($angle) - $v['y2'] * sin($angle);
1085
+		$v['yr2'] = $v['x2'] * sin($angle) + $v['y2'] * cos($angle);
1086
+
1087
+		// the normalized vector
1088
+		$v['Xr1'] = $v['xr1'] / $v['rx'];
1089
+		$v['Yr1'] = $v['yr1'] / $v['ry'];
1090
+		$v['Xr2'] = $v['xr2'] / $v['rx'];
1091
+		$v['Yr2'] = $v['yr2'] / $v['ry'];
1092
+		$v['dXr'] = $v['Xr2'] - $v['Xr1'];
1093
+		$v['dYr'] = $v['Yr2'] - $v['Yr1'];
1094
+		$v['D'] = $v['dXr'] * $v['dXr'] + $v['dYr'] * $v['dYr'];
1095
+
1096
+		// if |vector| is Null, or if |vector| > 2 : impossible to make a arc => Line
1097
+		if ($v['D'] == 0 || $v['D'] > 4) {
1098
+			$this->_Line($x2, $y2, $trans);
1099
+			return false;
1100
+		}
1101
+
1102
+		// convert paramters for make a arc with Center, Radius, from angleBegin to angleEnd
1103
+		$v['s1'] = array();
1104
+		$v['s1']['t'] = sqrt((4. - $v['D']) / $v['D']);
1105
+		$v['s1']['Xr'] = ($v['Xr1'] + $v['Xr2']) / 2. + $v['s1']['t'] * ($v['Yr2'] - $v['Yr1']) / 2.;
1106
+		$v['s1']['Yr'] = ($v['Yr1'] + $v['Yr2']) / 2. + $v['s1']['t'] * ($v['Xr1'] - $v['Xr2']) / 2.;
1107
+		$v['s1']['xr'] = $v['s1']['Xr'] * $v['rx'];
1108
+		$v['s1']['yr'] = $v['s1']['Yr'] * $v['ry'];
1109
+		$v['s1']['x'] = $v['s1']['xr'] * cos($angle) + $v['s1']['yr'] * sin($angle);
1110
+		$v['s1']['y'] = -$v['s1']['xr'] * sin($angle) + $v['s1']['yr'] * cos($angle);
1111
+		$v['s1']['a1'] = atan2($v['y1'] - $v['s1']['y'], $v['x1'] - $v['s1']['x']);
1112
+		$v['s1']['a2'] = atan2($v['y2'] - $v['s1']['y'], $v['x2'] - $v['s1']['x']);
1113
+		if ($v['s1']['a1'] > $v['s1']['a2']) $v['s1']['a1'] -= 2 * M_PI;
1114
+
1115
+		$v['s2'] = array();
1116
+		$v['s2']['t'] = -$v['s1']['t'];
1117
+		$v['s2']['Xr'] = ($v['Xr1'] + $v['Xr2']) / 2. + $v['s2']['t'] * ($v['Yr2'] - $v['Yr1']) / 2.;
1118
+		$v['s2']['Yr'] = ($v['Yr1'] + $v['Yr2']) / 2. + $v['s2']['t'] * ($v['Xr1'] - $v['Xr2']) / 2.;
1119
+		$v['s2']['xr'] = $v['s2']['Xr'] * $v['rx'];
1120
+		$v['s2']['yr'] = $v['s2']['Yr'] * $v['ry'];
1121
+		$v['s2']['x'] = $v['s2']['xr'] * cos($angle) + $v['s2']['yr'] * sin($angle);
1122
+		$v['s2']['y'] = -$v['s2']['xr'] * sin($angle) + $v['s2']['yr'] * cos($angle);
1123
+		$v['s2']['a1'] = atan2($v['y1'] - $v['s2']['y'], $v['x1'] - $v['s2']['x']);
1124
+		$v['s2']['a2'] = atan2($v['y2'] - $v['s2']['y'], $v['x2'] - $v['s2']['x']);
1125
+		if ($v['s2']['a1'] > $v['s2']['a2']) $v['s2']['a1'] -= 2 * M_PI;
1126
+
1127
+		if ( ! $l) {
1128
+			if ($s) {
1129
+				$xc = $v['s2']['x'];
1130
+				$yc = $v['s2']['y'];
1131
+				$a1 = $v['s2']['a1'];
1132
+				$a2 = $v['s2']['a2'];
1133
+				$this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, true, false, $trans);
1134
+			} else {
1135
+				$xc = $v['s1']['x'];
1136
+				$yc = $v['s1']['y'];
1137
+				$a1 = $v['s1']['a1'];
1138
+				$a2 = $v['s1']['a2'];
1139
+				$this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, false, false, $trans);
1140
+			}
1141
+		} else {
1142
+			if ($s) {
1143
+				$xc = $v['s1']['x'];
1144
+				$yc = $v['s1']['y'];
1145
+				$a1 = $v['s1']['a1'];
1146
+				$a2 = $v['s1']['a2'];
1147
+				$this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, true, false, $trans);
1148
+			} else {
1149
+				$xc = $v['s2']['x'];
1150
+				$yc = $v['s2']['y'];
1151
+				$a1 = $v['s2']['a1'];
1152
+				$a2 = $v['s2']['a2'];
1153
+				$this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, false, false, $trans);
1154
+			}
1155
+		}
1156
+	}
1157
+
1158
+	/**
1159
+	 * SVG - transform the point (reference)
1160
+	 *
1161
+	 * @param float &$x
1162
+	 * @param float &$y
1163
+	 * @param boolean $trans true => convert into PDF unit
1164
+	 * @param double $x
1165
+	 * @param double $y
1166
+	 * @return boolean
1167
+	 * @access public
1168
+	 */
1169
+	public function ptTransform(&$x, &$y, $trans = true)
1170
+	{
1171
+		// load the last Transfomation Matrix
1172
+		$nb = count($this->_transf);
1173
+		if ($nb)    $m = $this->_transf[$nb - 1];
1174
+		else        $m = array(1, 0, 0, 1, 0, 0);
1175
+
1176
+		// apply the Transformation Matrix
1177
+		list($x, $y) = array(($x * $m[0] + $y * $m[2] + $m[4]), ($x * $m[1] + $y * $m[3] + $m[5]));
1178
+
1179
+		// if true => convert into PDF unit
1180
+		if ($trans) {
1181
+			$x = $x * $this->k;
1182
+			$y = ($this->h - $y) * $this->k;
1183
+		}
1184
+
1185
+		return true;
1186
+	}
1187
+
1188
+	/**
1189
+	 * SVG - add a transformation Matric
1190
+	 *
1191
+	 * @param array $n matrix
1192
+	 * @access public
1193
+	 */
1194
+	public function doTransform($n = null)
1195
+	{
1196
+		// get the last Transformation Matrix
1197
+		$nb = count($this->_transf);
1198
+		if ($nb)    $m = $this->_transf[$nb - 1];
1199
+		else        $m = array(1, 0, 0, 1, 0, 0);
1200
+
1201
+		// if no transform, get the Identity Matrix
1202
+		if ( ! $n) $n = array(1, 0, 0, 1, 0, 0);
1203
+
1204
+		// create the new Transformation Matrix
1205
+		$this->_transf[] = array(
1206
+			$m[0] * $n[0] + $m[2] * $n[1],
1207
+			$m[1] * $n[0] + $m[3] * $n[1],
1208
+			$m[0] * $n[2] + $m[2] * $n[3],
1209
+			$m[1] * $n[2] + $m[3] * $n[3],
1210
+			$m[0] * $n[4] + $m[2] * $n[5] + $m[4],
1211
+			$m[1] * $n[4] + $m[3] * $n[5] + $m[5]
1212
+		);
1213
+	}
1214
+
1215
+	/**
1216
+	 * SVG - remove a transformation Matric
1217
+	 *
1218
+	 * @access public
1219
+	 */
1220
+	public function undoTransform()
1221
+	{
1222
+		array_pop($this->_transf);
1223
+	}
1224
+
1225
+	/**
1226
+	 * Convert a HTML2PDF barcode in a TCPDF barcode
1227
+	 *
1228
+	 * @param string $code code to print
1229
+	 * @param string $type type of barcode (see tcpdf/barcodes.php for supported formats)
1230
+	 * @param int $x x position in user units
1231
+	 * @param int $y y position in user units
1232
+	 * @param int $w width in user units
1233
+	 * @param int $h height in user units
1234
+	 * @param int $labelFontsize of the Test Label. If false : no Label
1235
+	 * @param array $color color of the foreground
1236
+	 * @access public
1237
+	 */
1238
+	public function myBarcode($code, $type, $x, $y, $w, $h, $labelFontsize, $color)
1239
+	{
1240
+		// the style of the barcode
1241
+		$style = array(
1242
+			'position' => 'S',
1243
+			'text' => ($labelFontsize ? true : false),
1244
+			'fgcolor' => $color,
1245
+			'bgcolor' => false,
1246
+		);
1247
+
1248
+		// build the barcode
1249
+		$this->write1DBarcode($code, $type, $x, $y, $w, $h, '', $style, 'N');
1250
+
1251
+		// it Label => add the FontSize to the height
1252
+		if ($labelFontsize) $h += ($labelFontsize);
1253
+
1254
+		// return the size of the barcode
1255
+		return array($w, $h);
1256
+	}
1257
+
1258
+	/**
1259
+	 * create a automatic Index on a page
1260
+	 *
1261
+	 * @param html2pdf $obj           parent object
1262
+	 * @param string   $titre         Title of the Index Page
1263
+	 * @param integer  $sizeTitle     Font size for hthe Title
1264
+	 * @param integer  $sizeBookmark  Font size for the bookmarks
1265
+	 * @param boolean  $bookmarkTitle Bookmark the Title
1266
+	 * @param boolean  $displayPage   Display the page number for each bookmark
1267
+	 * @param integer  $page draw the automatic Index on a specific Page. if null => add a page at the end
1268
+	 * @param string   $fontName      FontName to use
1269
+	 * @access public
1270
+	 */
1271
+	public function createIndex(
1272
+		&$obj,
1273
+		$titre = 'Index',
1274
+		$sizeTitle = 20,
1275
+		$sizeBookmark = 15,
1276
+		$bookmarkTitle = true,
1277
+		$displayPage = true,
1278
+		$page = null,
1279
+		$fontName = 'helvetica')
1280
+	{
1281
+		// bookmark the Title if wanted
1282
+		if ($bookmarkTitle) {
1283
+			$this->Bookmark($titre, 0, -1);
1284
+		}
1285
+
1286
+		// display the Title with the good Font size
1287
+		$this->SetFont($fontName, '', $sizeTitle);
1288
+		$this->Cell(0, 5, $titre, 0, 1, 'C');
1289
+
1290
+		// set the good Font size for the bookmarks
1291
+		$this->SetFont($fontName, '', $sizeBookmark);
1292
+		$this->Ln(10);
1293
+
1294
+		// get the number of bookmarks
1295
+		$size = sizeof($this->outlines);
1296
+
1297
+		// get the size of the "P. xx" cell
1298
+		$pageCellSize = $this->GetStringWidth('p. '.$this->outlines[$size - 1]['p']) + 2;
1299
+
1300
+		// Foreach bookmark
1301
+		for ($i = 0; $i < $size; $i++) {
1302
+			// if we need a new page => add a new page
1303
+			if ($this->getY() + $this->FontSize >= ($this->h - $this->bMargin)) {
1304
+				$obj->_INDEX_NewPage($page);
1305
+				$this->SetFont($fontName, '', $sizeBookmark);
1306
+			}
1307
+
1308
+			// Offset of the current level
1309
+			$level = $this->outlines[$i]['l'];
1310
+			if ($level > 0) $this->Cell($level * 8);
1311
+
1312
+			// Caption (cut to fit on the width page)
1313
+			$str = $this->outlines[$i]['t'];
1314
+			$strsize = $this->GetStringWidth($str);
1315
+			$availableSize = $this->w - $this->lMargin - $this->rMargin - $pageCellSize - ($level * 8) - 4;
1316
+			while ($strsize >= $availableSize) {
1317
+				$str = substr($str, 0, -1);
1318
+				$strsize = $this->GetStringWidth($str);
1319
+			}
1320
+
1321
+			// if we want to display the page nmber
1322
+			if ($displayPage) {
1323
+				// display the Bookmark Caption
1324
+				$this->Cell($strsize + 2, $this->FontSize + 2, $str);
1325
+
1326
+				//Filling dots
1327
+				$w = $this->w - $this->lMargin - $this->rMargin - $pageCellSize - ($level * 8) - ($strsize + 2);
1328
+				$nb = $w / $this->GetStringWidth('.');
1329
+				$dots = str_repeat('.', $nb);
1330
+				$this->Cell($w, $this->FontSize + 2, $dots, 0, 0, 'R');
1331
+
1332
+				//Page number
1333
+				$this->Cell($pageCellSize, $this->FontSize + 2, 'p. '.$this->outlines[$i]['p'], 0, 1, 'R');
1334
+			} else {
1335
+				// display the Bookmark Caption
1336
+				$this->Cell($strsize + 2, $this->FontSize + 2, $str, 0, 1);
1337
+			}
1338
+		}
1339
+	}
1340
+
1341
+	/**
1342
+	 * Returns the string alias used for the total number of pages.
1343
+	 *
1344
+	 * @access public
1345
+	 * @return string;
1346
+	 * @see TCPDF::getAliasNbPages(), TCPDF::getPageGroupAlias()
1347
+	 */
1348
+	public function getMyAliasNbPages()
1349
+	{
1350
+		if ($this->_myLastPageGroupNb == 0) {
1351
+			return $this->getAliasNbPages();
1352
+		} else {
1353
+			$old = $this->currpagegroup;
1354
+			$this->currpagegroup = '{nb'.$this->_myLastPageGroupNb.'}';
1355
+			$new = $this->getPageGroupAlias();
1356
+			$this->currpagegroup = $old;
1357
+
1358
+			return $new;
1359
+		}
1360
+	}
1361
+
1362
+	/**
1363
+	 * Returns the current page number.
1364
+	 *
1365
+	 * @access public
1366
+	 * @param  integer $page
1367
+	 * @return integer;
1368
+	 */
1369
+	public function getMyNumPage($page = null)
1370
+	{
1371
+		if ($page === null) {
1372
+			$page = $this->page;
1373
+		}
1374
+
1375
+		if ($this->_myLastPageGroupNb == 0) {
1376
+			return $page;
1377
+		} else {
1378
+			return $page - $this->_myLastPageGroup;
1379
+		}
1380
+	}
1381
+
1382
+	/**
1383
+	 * Start a new group of pages
1384
+	 *
1385
+	 * @access public
1386
+	 * @return integer;
1387
+	 * @see tcpdf::startPageGroup
1388
+	 */
1389
+	public function myStartPageGroup()
1390
+	{
1391
+		$this->_myLastPageGroup = $this->page - 1;
1392
+		$this->_myLastPageGroupNb++;
1393
+	}
1394
+
1395
+	/**
1396
+	 * get $_myLastPageGroup;
1397
+	 *
1398
+	 * @access public
1399
+	 * @return integer $_myLastPageGroup;
1400
+	 */
1401
+	public function getMyLastPageGroup()
1402
+	{
1403
+		return $this->_myLastPageGroup;
1404
+	}
1405
+
1406
+	/**
1407
+	 * set $_myLastPageGroup;
1408
+	 *
1409
+	 * @access public
1410
+	 * @param integer $myLastPageGroup;
1411
+	 * @param integer $myLastPageGroup
1412
+	 */
1413
+	public function setMyLastPageGroup($myLastPageGroup)
1414
+	{
1415
+		$this->_myLastPageGroup = $myLastPageGroup;
1416
+	}
1417
+
1418
+	/**
1419
+	 * get $_myLastPageGroupNb;
1420
+	 *
1421
+	 * @access public
1422
+	 * @return integer $_myLastPageGroupNb;
1423
+	 */
1424
+	public function getMyLastPageGroupNb()
1425
+	{
1426
+		return $this->_myLastPageGroupNb;
1427
+	}
1428
+
1429
+	/**
1430
+	 * set $_myLastPageGroupNb;
1431
+	 *
1432
+	 * @access public
1433
+	 * @param integer $myLastPageGroupNb;
1434
+	 * @param integer $myLastPageGroupNb
1435
+	 */
1436
+	public function setMyLastPageGroupNb($myLastPageGroupNb)
1437
+	{
1438
+		$this->_myLastPageGroupNb = $myLastPageGroupNb;
1439
+	}
1440 1440
 }
Please login to merge, or discard this patch.
Braces   +58 added lines, -23 removed lines patch added patch discarded remove patch
@@ -549,8 +549,12 @@  discard block
 block discarded – undo
549 549
     public function setRotation($angle, $xC = null, $yC = null)
550 550
     {
551 551
         // if no center, rotate around the current posiition
552
-        if ($xC === null) $xC = $this->x;
553
-        if ($yC === null) $yC = $this->y;
552
+        if ($xC === null) {
553
+        	$xC = $this->x;
554
+        }
555
+        if ($yC === null) {
556
+        	$yC = $this->y;
557
+        }
554 558
 
555 559
         // prepare the coordinate
556 560
         $yC = ($this->h - $yC) * $this->k;
@@ -592,8 +596,9 @@  discard block
 block discarded – undo
592 596
      */
593 597
     public function SetY($y, $resetx = true, $rtloff = false)
594 598
     {
595
-        if ($resetx)
596
-            $this->x = $this->lMargin;
599
+        if ($resetx) {
600
+                    $this->x = $this->lMargin;
601
+        }
597 602
 
598 603
         $this->y = $y;
599 604
     }
@@ -726,9 +731,13 @@  discard block
 block discarded – undo
726 731
         $y4 = $y + $h;
727 732
 
728 733
         // get the Closing operator from the PDF Style
729
-        if ($style == 'F') $op = 'f';
730
-        elseif ($style == 'FD' || $style == 'DF') $op = 'B';
731
-        else $op = 'S';
734
+        if ($style == 'F') {
735
+        	$op = 'f';
736
+        } elseif ($style == 'FD' || $style == 'DF') {
737
+        	$op = 'B';
738
+        } else {
739
+        	$op = 'S';
740
+        }
732 741
 
733 742
         // drawing
734 743
         $this->_Point($x1, $y1, true);
@@ -772,9 +781,13 @@  discard block
 block discarded – undo
772 781
     public function svgEllipse($x0, $y0, $rx, $ry, $style)
773 782
     {
774 783
         // get the Closing operator from the PDF Style
775
-        if ($style == 'F') $op = 'f';
776
-        elseif ($style == 'FD' || $style == 'DF') $op = 'B';
777
-        else $op = 'S';
784
+        if ($style == 'F') {
785
+        	$op = 'f';
786
+        } elseif ($style == 'FD' || $style == 'DF') {
787
+        	$op = 'B';
788
+        } else {
789
+        	$op = 'S';
790
+        }
778 791
 
779 792
         // drawing
780 793
         $this->_Arc($x0, $y0, $rx, $ry, 0, 2 * M_PI, true, true, true);
@@ -791,9 +804,13 @@  discard block
 block discarded – undo
791 804
     public function svgPolygone($actions, $style)
792 805
     {
793 806
         // get the Closing operator from the PDF Style
794
-        if ($style == 'F') $op = 'f';
795
-        elseif ($style == 'FD' || $style == 'DF') $op = 'B';
796
-        else $op = 'S';
807
+        if ($style == 'F') {
808
+        	$op = 'f';
809
+        } elseif ($style == 'FD' || $style == 'DF') {
810
+        	$op = 'B';
811
+        } else {
812
+        	$op = 'S';
813
+        }
797 814
 
798 815
         // To save the First action and the last point
799 816
         $first = array('', 0, 0);
@@ -1004,7 +1021,9 @@  discard block
 block discarded – undo
1004 1021
         $trans = false)
1005 1022
     {
1006 1023
         // if we want the no trigo direction : add 2PI to the begin angle, to invert the direction
1007
-        if ( ! $direction) $angleBegin += M_PI * 2.;
1024
+        if ( ! $direction) {
1025
+        	$angleBegin += M_PI * 2.;
1026
+        }
1008 1027
 
1009 1028
         // cut in segment to convert in berize curv
1010 1029
         $dt = ($angleEnd - $angleBegin) / self::ARC_NB_SEGMENT;
@@ -1110,7 +1129,9 @@  discard block
 block discarded – undo
1110 1129
         $v['s1']['y'] = -$v['s1']['xr'] * sin($angle) + $v['s1']['yr'] * cos($angle);
1111 1130
         $v['s1']['a1'] = atan2($v['y1'] - $v['s1']['y'], $v['x1'] - $v['s1']['x']);
1112 1131
         $v['s1']['a2'] = atan2($v['y2'] - $v['s1']['y'], $v['x2'] - $v['s1']['x']);
1113
-        if ($v['s1']['a1'] > $v['s1']['a2']) $v['s1']['a1'] -= 2 * M_PI;
1132
+        if ($v['s1']['a1'] > $v['s1']['a2']) {
1133
+        	$v['s1']['a1'] -= 2 * M_PI;
1134
+        }
1114 1135
 
1115 1136
         $v['s2'] = array();
1116 1137
         $v['s2']['t'] = -$v['s1']['t'];
@@ -1122,7 +1143,9 @@  discard block
 block discarded – undo
1122 1143
         $v['s2']['y'] = -$v['s2']['xr'] * sin($angle) + $v['s2']['yr'] * cos($angle);
1123 1144
         $v['s2']['a1'] = atan2($v['y1'] - $v['s2']['y'], $v['x1'] - $v['s2']['x']);
1124 1145
         $v['s2']['a2'] = atan2($v['y2'] - $v['s2']['y'], $v['x2'] - $v['s2']['x']);
1125
-        if ($v['s2']['a1'] > $v['s2']['a2']) $v['s2']['a1'] -= 2 * M_PI;
1146
+        if ($v['s2']['a1'] > $v['s2']['a2']) {
1147
+        	$v['s2']['a1'] -= 2 * M_PI;
1148
+        }
1126 1149
 
1127 1150
         if ( ! $l) {
1128 1151
             if ($s) {
@@ -1170,8 +1193,11 @@  discard block
 block discarded – undo
1170 1193
     {
1171 1194
         // load the last Transfomation Matrix
1172 1195
         $nb = count($this->_transf);
1173
-        if ($nb)    $m = $this->_transf[$nb - 1];
1174
-        else        $m = array(1, 0, 0, 1, 0, 0);
1196
+        if ($nb) {
1197
+        	$m = $this->_transf[$nb - 1];
1198
+        } else {
1199
+        	$m = array(1, 0, 0, 1, 0, 0);
1200
+        }
1175 1201
 
1176 1202
         // apply the Transformation Matrix
1177 1203
         list($x, $y) = array(($x * $m[0] + $y * $m[2] + $m[4]), ($x * $m[1] + $y * $m[3] + $m[5]));
@@ -1195,11 +1221,16 @@  discard block
 block discarded – undo
1195 1221
     {
1196 1222
         // get the last Transformation Matrix
1197 1223
         $nb = count($this->_transf);
1198
-        if ($nb)    $m = $this->_transf[$nb - 1];
1199
-        else        $m = array(1, 0, 0, 1, 0, 0);
1224
+        if ($nb) {
1225
+        	$m = $this->_transf[$nb - 1];
1226
+        } else {
1227
+        	$m = array(1, 0, 0, 1, 0, 0);
1228
+        }
1200 1229
 
1201 1230
         // if no transform, get the Identity Matrix
1202
-        if ( ! $n) $n = array(1, 0, 0, 1, 0, 0);
1231
+        if ( ! $n) {
1232
+        	$n = array(1, 0, 0, 1, 0, 0);
1233
+        }
1203 1234
 
1204 1235
         // create the new Transformation Matrix
1205 1236
         $this->_transf[] = array(
@@ -1249,7 +1280,9 @@  discard block
 block discarded – undo
1249 1280
         $this->write1DBarcode($code, $type, $x, $y, $w, $h, '', $style, 'N');
1250 1281
 
1251 1282
         // it Label => add the FontSize to the height
1252
-        if ($labelFontsize) $h += ($labelFontsize);
1283
+        if ($labelFontsize) {
1284
+        	$h += ($labelFontsize);
1285
+        }
1253 1286
 
1254 1287
         // return the size of the barcode
1255 1288
         return array($w, $h);
@@ -1307,7 +1340,9 @@  discard block
 block discarded – undo
1307 1340
 
1308 1341
             // Offset of the current level
1309 1342
             $level = $this->outlines[$i]['l'];
1310
-            if ($level > 0) $this->Cell($level * 8);
1343
+            if ($level > 0) {
1344
+            	$this->Cell($level * 8);
1345
+            }
1311 1346
 
1312 1347
             // Caption (cut to fit on the width page)
1313 1348
             $str = $this->outlines[$i]['t'];
Please login to merge, or discard this patch.
astpp/application/libraries/html2pdf/_class/parsingCss.class.php 4 patches
Doc Comments   +1 added lines patch added patch discarded remove patch
@@ -43,6 +43,7 @@
 block discarded – undo
43 43
      * Set the HTML2PDF parent object
44 44
      *
45 45
      * @param  &HTML2PDF reference to the HTML2PDF parent $object
46
+     * @param HTML2PDF_myPdf|null $pdf
46 47
      * @access public
47 48
      */
48 49
     public function setPdfParent(&$pdf)
Please login to merge, or discard this patch.
Indentation   +1844 added lines, -1844 removed lines patch added patch discarded remove patch
@@ -11,1849 +11,1849 @@
 block discarded – undo
11 11
 
12 12
 class HTML2PDF_parsingCss
13 13
 {
14
-    /**
15
-     * reference to the pdf object
16
-     * @var TCPDF
17
-     */
18
-    protected $_pdf         = null;
19
-
20
-    protected $_htmlColor   = array(); // list of the HTML colors
21
-    protected $_onlyLeft    = false; // flag if we are in a sub html => only "text-align:left" is used
22
-    protected $_defaultFont = null; // default font to use if the asked font does not exist
23
-
24
-    public    $value        = array(); // current values
25
-    public    $css          = array(); // css values
26
-    public    $cssKeys      = array(); // css key, for the execution order
27
-    public    $table        = array(); // level history
28
-
29
-    /**
30
-     * Constructor
31
-     *
32
-     * @param  &HTML2PDF_myPdf reference to the PDF $object
33
-     * @param HTML2PDF_myPdf $pdf
34
-     * @access public
35
-     */
36
-    public function __construct(&$pdf)
37
-    {
38
-        $this->_init();
39
-        $this->setPdfParent($pdf);
40
-    }
41
-
42
-    /**
43
-     * Set the HTML2PDF parent object
44
-     *
45
-     * @param  &HTML2PDF reference to the HTML2PDF parent $object
46
-     * @access public
47
-     */
48
-    public function setPdfParent(&$pdf)
49
-    {
50
-        $this->_pdf = &$pdf;
51
-    }
52
-
53
-    /**
54
-     * Inform that we want only "test-align:left" because we are in a sub HTML
55
-     *
56
-     * @access public
57
-     */
58
-    public function setOnlyLeft()
59
-    {
60
-        $this->value['text-align'] = 'left';
61
-        $this->_onlyLeft = true;
62
-    }
63
-
64
-    /**
65
-     * Get the vales of the parent, if exist
66
-     *
67
-     * @return array CSS values
68
-     * @access public
69
-     */
70
-    public function getOldValues()
71
-    {
72
-        return isset($this->table[count($this->table) - 1]) ? $this->table[count($this->table) - 1] : $this->value;
73
-    }
74
-
75
-    /**
76
-    * define the Default Font to use, if the font does not exist, or if no font asked
77
-    *
78
-    * @param  string  default font-family. If null : Arial for no font asked, and error fot ont does not exist
79
-    * @param string $default
80
-    * @return string  old default font-family
81
-    * @access public
82
-    */
83
-    public function setDefaultFont($default = null)
84
-    {
85
-        $old = $this->_defaultFont;
86
-        $this->_defaultFont = $default;
87
-        if ($default) {
88
-        	$this->value['font-family'] = $default;
89
-        }
90
-        return $old;
91
-    }
92
-
93
-     /**
94
-     * Init the object
95
-     *
96
-     * @access protected
97
-     */
98
-    protected function _init()
99
-    {
100
-        // get the Web Colors from TCPDF
101
-        require(K_PATH_MAIN.'htmlcolors.php');
102
-        $this->_htmlColor = $webcolor;
103
-
104
-        // init the Style
105
-        $this->table = array();
106
-        $this->value = array();
107
-        $this->initStyle();
108
-
109
-        // Init the styles without legacy
110
-        $this->resetStyle();
111
-    }
112
-
113
-    /**
114
-     * Init the CSS Style
115
-     *
116
-     * @access public
117
-     */
118
-    public function initStyle()
119
-    {
120
-        $this->value['id_tag'] = 'body'; // tag name
121
-        $this->value['id_name']          = null; // tag - attribute name
122
-        $this->value['id_id']            = null; // tag - attribute id
123
-        $this->value['id_class']         = null; // tag - attribute class
124
-        $this->value['id_lst']           = array('*'); // tag - list of legacy
125
-        $this->value['mini-size']        = 1.; // specific size report for sup, sub
126
-        $this->value['mini-decal']       = 0; // specific position report for sup, sub
127
-        $this->value['font-family']      = 'Arial';
128
-        $this->value['font-bold']        = false;
129
-        $this->value['font-italic']      = false;
130
-        $this->value['font-underline']   = false;
131
-        $this->value['font-overline']    = false;
132
-        $this->value['font-linethrough'] = false;
133
-        $this->value['text-transform']   = 'none';
134
-        $this->value['font-size']        = $this->convertToMM('10pt');
135
-        $this->value['text-indent']      = 0;
136
-        $this->value['text-align']       = 'left';
137
-        $this->value['vertical-align']   = 'middle';
138
-        $this->value['line-height']      = 'normal';
139
-
140
-        $this->value['position']         = null;
141
-        $this->value['x']                = null;
142
-        $this->value['y']                = null;
143
-        $this->value['width']            = 0;
144
-        $this->value['height']           = 0;
145
-        $this->value['top']              = null;
146
-        $this->value['right']            = null;
147
-        $this->value['bottom']           = null;
148
-        $this->value['left']             = null;
149
-        $this->value['float']            = null;
150
-        $this->value['display']          = null;
151
-        $this->value['rotate']           = null;
152
-        $this->value['overflow']         = 'visible';
153
-
154
-        $this->value['color']            = array(0, 0, 0);
155
-        $this->value['background']       = array('color' => null, 'image' => null, 'position' => null, 'repeat' => null);
156
-        $this->value['border']           = array();
157
-        $this->value['padding']          = array();
158
-        $this->value['margin']           = array();
159
-        $this->value['margin-auto']      = false;
160
-
161
-        $this->value['list-style-type']  = '';
162
-        $this->value['list-style-image'] = '';
163
-
164
-        $this->value['xc'] = null;
165
-        $this->value['yc'] = null;
166
-    }
167
-
168
-    /**
169
-     * Init the CSS Style without legacy
170
-     *
171
-     * @param  string  tag name
172
-     * @access public
173
-     */
174
-    public function resetStyle($tagName = '')
175
-    {
176
-        // prepare somme values
177
-        $border = $this->readBorder('solid 1px #000000');
178
-        $units = array(
179
-            '1px' => $this->convertToMM('1px'),
180
-            '5px' => $this->convertToMM('5px'),
181
-        );
182
-
183
-
184
-        // prepare the Collapse attribute
185
-        $collapse = isset($this->value['border']['collapse']) ? $this->value['border']['collapse'] : false;
186
-        if ( ! in_array($tagName, array('tr', 'td', 'th', 'thead', 'tbody', 'tfoot'))) $collapse = false;
187
-
188
-        // set the global css values
189
-        $this->value['position']   = null;
190
-        $this->value['x']          = null;
191
-        $this->value['y']          = null;
192
-        $this->value['width']      = 0;
193
-        $this->value['height']     = 0;
194
-        $this->value['top']        = null;
195
-        $this->value['right']      = null;
196
-        $this->value['bottom']     = null;
197
-        $this->value['left']       = null;
198
-        $this->value['float']      = null;
199
-        $this->value['display']    = null;
200
-        $this->value['rotate']     = null;
201
-        $this->value['overflow']   = 'visible';
202
-        $this->value['background'] = array('color' => null, 'image' => null, 'position' => null, 'repeat' => null);
203
-        $this->value['border']     = array(
204
-            't' => $this->readBorder('none'),
205
-            'r' => $this->readBorder('none'),
206
-            'b' => $this->readBorder('none'),
207
-            'l' => $this->readBorder('none'),
208
-            'radius' => array(
209
-                'tl' => array(0, 0),
210
-                'tr' => array(0, 0),
211
-                'br' => array(0, 0),
212
-                'bl' => array(0, 0)
213
-            ),
214
-            'collapse' => $collapse,
215
-        );
216
-
217
-        // specific values for some tags
218
-        if ( ! in_array($tagName, array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) {
219
-            $this->value['margin'] = array('t'=>0, 'r'=>0, 'b'=>0, 'l'=>0);
220
-        }
221
-
222
-        if (in_array($tagName, array('input', 'select', 'textarea'))) {
223
-            $this->value['border']['t'] = null;
224
-            $this->value['border']['r'] = null;
225
-            $this->value['border']['b'] = null;
226
-            $this->value['border']['l'] = null;
227
-        }
228
-
229
-        if ($tagName == 'p') {
230
-            $this->value['margin']['t'] = null;
231
-            $this->value['margin']['b'] = null;
232
-        }
233
-        if ($tagName == 'blockquote') {
234
-            $this->value['margin']['t'] = 3;
235
-            $this->value['margin']['r'] = 3;
236
-            $this->value['margin']['b'] = 3;
237
-            $this->value['margin']['l'] = 6;
238
-        }
239
-        $this->value['margin-auto'] = false;
240
-
241
-        if (in_array($tagName, array('blockquote', 'div', 'fieldset'))) {
242
-            $this->value['vertical-align'] = 'top';
243
-        }
244
-
245
-        if (in_array($tagName, array('fieldset', 'legend'))) {
246
-            $this->value['border'] = array(
247
-                't' => $border,
248
-                'r' => $border,
249
-                'b' => $border,
250
-                'l' => $border,
251
-                'radius' => array(
252
-                    'tl' => array($units['5px'], $units['5px']),
253
-                    'tr' => array($units['5px'], $units['5px']),
254
-                    'br' => array($units['5px'], $units['5px']),
255
-                    'bl' => array($units['5px'], $units['5px'])
256
-                ),
257
-                'collapse' => false,
258
-            );
259
-        }
260
-
261
-        if (in_array($tagName, array('ul', 'li'))) {
262
-            $this->value['list-style-type']  = '';
263
-            $this->value['list-style-image'] = '';
264
-        }
265
-
266
-        if ( ! in_array($tagName, array('tr', 'td'))) {
267
-            $this->value['padding'] = array(
268
-                't' => 0,
269
-                'r' => 0,
270
-                'b' => 0,
271
-                'l' => 0
272
-            );
273
-        } else {
274
-            $this->value['padding'] = array(
275
-                't' => $units['1px'],
276
-                'r' => $units['1px'],
277
-                'b' => $units['1px'],
278
-                'l' => $units['1px']
279
-            );
280
-        }
281
-
282
-        if ($tagName == 'hr') {
283
-            $this->value['border'] = array(
284
-                't' => $border,
285
-                'r' => $border,
286
-                'b' => $border,
287
-                'l' => $border,
288
-                'radius' => array(
289
-                    'tl' => array(0, 0),
290
-                    'tr' => array(0, 0),
291
-                    'br' => array(0, 0),
292
-                    'bl' => array(0, 0)
293
-                ),
294
-                'collapse' => false,
295
-            );
296
-            $this->convertBackground('#FFFFFF', $this->value['background']);
297
-        }
298
-
299
-        $this->value['xc'] = null;
300
-        $this->value['yc'] = null;
301
-    }
302
-
303
-    /**
304
-     * Init the PDF Font
305
-     *
306
-     * @access public
307
-     */
308
-    public function fontSet()
309
-    {
310
-        $family = strtolower($this->value['font-family']);
311
-
312
-        $b = ($this->value['font-bold'] ? 'B' : '');
313
-        $i = ($this->value['font-italic'] ? 'I' : '');
314
-        $u = ($this->value['font-underline'] ? 'U' : '');
315
-        $d = ($this->value['font-linethrough'] ? 'D' : '');
316
-        $o = ($this->value['font-overline'] ? 'O' : '');
317
-
318
-        // font style
319
-        $style = $b.$i;
320
-
321
-        if ($this->_defaultFont) {
322
-            if ($family == 'arial')
323
-                $family = 'helvetica';
324
-            elseif ($family == 'symbol' || $family == 'zapfdingbats')
325
-                $style = '';
326
-
327
-            $fontkey = $family.$style;
328
-            if ( ! $this->_pdf->isLoadedFont($fontkey))
329
-                $family = $this->_defaultFont;
330
-        }
331
-
332
-        if ($family == 'arial')
333
-            $family = 'helvetica';
334
-        elseif ($family == 'symbol' || $family == 'zapfdingbats')
335
-            $style = '';
336
-
337
-        // complete style
338
-        $style .= $u.$d.$o;
339
-
340
-        // size : mm => pt
341
-        $size = $this->value['font-size'];
342
-        $size = 72 * $size / 25.4;
343
-
344
-        // apply the font
345
-        $this->_pdf->SetFont($family, $style, $this->value['mini-size'] * $size);
346
-        $this->_pdf->setTextColorArray($this->value['color']);
347
-        if ($this->value['background']['color']) {
348
-                    $this->_pdf->setFillColorArray($this->value['background']['color']);
349
-        } else {
350
-                    $this->_pdf->setFillColor(255);
351
-        }
352
-    }
353
-
354
-     /**
355
-     * add a level in the CSS history
356
-     *
357
-     * @access public
358
-     */
359
-    public function save()
360
-    {
361
-        array_push($this->table, $this->value);
362
-    }
363
-
364
-     /**
365
-     * remove a level in the CSS history
366
-     *
367
-     * @access public
368
-     */
369
-    public function load()
370
-    {
371
-        if (count($this->table)) {
372
-            $this->value = array_pop($this->table);
373
-        }
374
-    }
375
-
376
-     /**
377
-     * restore the Y positiony (used after a span)
378
-     *
379
-     * @access public
380
-     */
381
-    public function restorePosition()
382
-    {
383
-        if ($this->value['y'] == $this->_pdf->getY()) $this->_pdf->setY($this->value['yc'], false);
384
-    }
385
-
386
-     /**
387
-     * set the New position for the current Tag
388
-     *
389
-     * @access public
390
-     */
391
-    public function setPosition()
392
-    {
393
-        // get the current position
394
-        $currentX = $this->_pdf->getX();
395
-        $currentY = $this->_pdf->getY();
396
-
397
-        // save it
398
-        $this->value['xc'] = $currentX;
399
-        $this->value['yc'] = $currentY;
400
-
401
-        if ($this->value['position'] == 'relative' || $this->value['position'] == 'absolute') {
402
-            if ($this->value['right'] !== null) {
403
-                $x = $this->getLastWidth(true) - $this->value['right'] - $this->value['width'];
404
-                if ($this->value['margin']['r']) $x -= $this->value['margin']['r'];
405
-            } else {
406
-                $x = $this->value['left'];
407
-                if ($this->value['margin']['l']) $x += $this->value['margin']['l'];
408
-            }
409
-
410
-            if ($this->value['bottom'] !== null) {
411
-                $y = $this->getLastHeight(true) - $this->value['bottom'] - $this->value['height'];
412
-                if ($this->value['margin']['b']) $y -= $this->value['margin']['b'];
413
-            } else {
414
-                $y = $this->value['top'];
415
-                if ($this->value['margin']['t']) $y += $this->value['margin']['t'];
416
-            }
417
-
418
-            if ($this->value['position'] == 'relative') {
419
-                $this->value['x'] = $currentX + $x;
420
-                $this->value['y'] = $currentY + $y;
421
-            } else {
422
-                $this->value['x'] = $this->_getLastAbsoluteX() + $x;
423
-                $this->value['y'] = $this->_getLastAbsoluteY() + $y;
424
-            }
425
-        } else {
426
-            $this->value['x'] = $currentX;
427
-            $this->value['y'] = $currentY;
428
-            if ($this->value['margin']['l']) $this->value['x'] += $this->value['margin']['l'];
429
-            if ($this->value['margin']['t']) $this->value['y'] += $this->value['margin']['t'];
430
-        }
431
-
432
-        // save the new position
433
-        $this->_pdf->setXY($this->value['x'], $this->value['y']);
434
-    }
435
-
436
-     /**
437
-     * Analise the CSS style to convert it into Form style
438
-     *
439
-     * @access public
440
-     * @param  array    styles
441
-     */
442
-    public function getFormStyle()
443
-    {
444
-        $prop = array();
445
-
446
-        $prop['alignment'] = $this->value['text-align'];
447
-
448
-        if (isset($this->value['background']['color']) && is_array($this->value['background']['color'])) {
449
-            $prop['fillColor'] = $this->value['background']['color'];
450
-        }
451
-
452
-        if (isset($this->value['border']['t']['color'])) {
453
-            $prop['strokeColor'] = $this->value['border']['t']['color'];
454
-        }
455
-
456
-        if (isset($this->value['border']['t']['width'])) {
457
-            $prop['lineWidth'] = $this->value['border']['t']['width'];
458
-        }
459
-
460
-        if (isset($this->value['border']['t']['type'])) {
461
-            $prop['borderStyle'] = $this->value['border']['t']['type'];
462
-        }
463
-
464
-        if ( ! empty($this->value['color'])) {
465
-            $prop['textColor'] = $this->value['color'];
466
-        }
467
-
468
-        if ( ! empty($this->value['font-size'])) {
469
-            $prop['textSize'] = $this->value['font-size'];
470
-        }
471
-
472
-        return $prop;
473
-    }
474
-
475
-     /**
476
-     * Analise the CSS style to convert it into SVG style
477
-     *
478
-     * @access public
479
-     * @param  string   tag name
480
-     * @param  array    styles
481
-     * @param string $tagName
482
-     */
483
-    public function getSvgStyle($tagName, &$param)
484
-    {
485
-        // prepare
486
-        $tagName = strtolower($tagName);
487
-        $id   = isset($param['id']) ? strtolower(trim($param['id'])) : null; if ( ! $id)   $id   = null;
488
-        $name = isset($param['name']) ? strtolower(trim($param['name'])) : null; if ( ! $name) $name = null;
489
-
490
-        // read the class attribute
491
-        $class = array();
492
-        $tmp = isset($param['class']) ? strtolower(trim($param['class'])) : '';
493
-        $tmp = explode(' ', $tmp);
494
-        foreach ($tmp as $k => $v) {
495
-            $v = trim($v);
496
-            if ($v) {
497
-            	$class[] = $v;
498
-            }
499
-        }
500
-
501
-        // identify the tag, and the direct styles
502
-        $this->value['id_tag'] = $tagName;
503
-        $this->value['id_name']   = $name;
504
-        $this->value['id_id']     = $id;
505
-        $this->value['id_class']  = $class;
506
-        $this->value['id_lst']    = array();
507
-        $this->value['id_lst'][] = '*';
508
-        $this->value['id_lst'][] = $tagName;
509
-        if ( ! isset($this->value['svg'])) {
510
-            $this->value['svg'] = array(
511
-                'stroke'         => null,
512
-                'stroke-width'   => $this->convertToMM('1pt'),
513
-                'fill'           => null,
514
-                'fill-opacity'   => null,
515
-            );
516
-        }
517
-
518
-        if (count($class)) {
519
-            foreach ($class as $v) {
520
-                $this->value['id_lst'][] = '*.'.$v;
521
-                $this->value['id_lst'][] = '.'.$v;
522
-                $this->value['id_lst'][] = $tagName.'.'.$v;
523
-            }
524
-        }
525
-        if ($id) {
526
-            $this->value['id_lst'][] = '*#'.$id;
527
-            $this->value['id_lst'][] = '#'.$id;
528
-            $this->value['id_lst'][] = $tagName.'#'.$id;
529
-        }
530
-
531
-        // CSS style
532
-        $styles = $this->_getFromCSS();
533
-
534
-        // adding the style from the tag
535
-        $styles = array_merge($styles, $param['style']);
536
-
537
-        if (isset($styles['stroke']))        $this->value['svg']['stroke']       = $this->convertToColor($styles['stroke'], $res);
538
-        if (isset($styles['stroke-width']))  $this->value['svg']['stroke-width'] = $this->convertToMM($styles['stroke-width']);
539
-        if (isset($styles['fill']))          $this->value['svg']['fill']         = $this->convertToColor($styles['fill'], $res);
540
-        if (isset($styles['fill-opacity']))  $this->value['svg']['fill-opacity'] = 1. * $styles['fill-opacity'];
541
-
542
-        return $this->value['svg'];
543
-    }
544
-
545
-    /**
546
-     * analyse the css properties from the HTML parsing
547
-     *
548
-     * @access public
549
-     * @param  string  $tagName
550
-     * @param  array   $param
551
-     * @param  array   $legacy
552
-     */
553
-    public function analyse($tagName, &$param, $legacy = null)
554
-    {
555
-        // prepare the informations
556
-        $tagName = strtolower($tagName);
557
-        $id   = isset($param['id']) ? strtolower(trim($param['id'])) : null; if ( ! $id)   $id   = null;
558
-        $name = isset($param['name']) ? strtolower(trim($param['name'])) : null; if ( ! $name) $name = null;
559
-
560
-        // get the class names to use
561
-        $class = array();
562
-        $tmp = isset($param['class']) ? strtolower(trim($param['class'])) : '';
563
-        $tmp = explode(' ', $tmp);
564
-        foreach ($tmp as $k => $v) {
565
-            $v = trim($v);
566
-            if ($v) {
567
-            	$class[] = $v;
568
-            }
569
-        }
570
-
571
-        // prepare the values, and the list of css tags to identify
572
-        $this->value['id_tag']   = $tagName;
573
-        $this->value['id_name']  = $name;
574
-        $this->value['id_id']    = $id;
575
-        $this->value['id_class'] = $class;
576
-        $this->value['id_lst']   = array();
577
-        $this->value['id_lst'][] = '*';
578
-        $this->value['id_lst'][] = $tagName;
579
-        if (count($class)) {
580
-            foreach ($class as $v) {
581
-                $this->value['id_lst'][] = '*.'.$v;
582
-                $this->value['id_lst'][] = '.'.$v;
583
-                $this->value['id_lst'][] = $tagName.'.'.$v;
584
-            }
585
-        }
586
-        if ($id) {
587
-            $this->value['id_lst'][] = '*#'.$id;
588
-            $this->value['id_lst'][] = '#'.$id;
589
-            $this->value['id_lst'][] = $tagName.'#'.$id;
590
-        }
591
-
592
-        // get the css styles from class
593
-        $styles = $this->_getFromCSS();
594
-
595
-        // merge with the css styles from tag
596
-        $styles = array_merge($styles, $param['style']);
597
-        if (isset($param['allwidth']) && ! isset($styles['width'])) $styles['width'] = '100%';
598
-
599
-        // reset some styles, depending on the tag name
600
-        $this->resetStyle($tagName);
601
-
602
-        // add the legacy values
603
-        if ($legacy) {
604
-            foreach ($legacy as $legacyName => $legacyValue) {
605
-                if (is_array($legacyValue)) {
606
-                    foreach ($legacyValue as $legacy2Name => $legacy2Value)
607
-                        $this->value[$legacyName][$legacy2Name] = $legacy2Value;
608
-                } else {
609
-                    $this->value[$legacyName] = $legacyValue;
610
-                }
611
-            }
612
-        }
613
-
614
-        // some flags
615
-        $correctWidth = false;
616
-        $noWidth = true;
617
-
618
-        // read all the css styles
619
-        foreach ($styles as $nom => $val) {
620
-            switch ($nom)
621
-            {
622
-                case 'font-family':
623
-                    $val = explode(',', $val);
624
-                    $val = trim($val[0]);
625
-                    if ($val) {
626
-                    	$this->value['font-family'] = $val;
627
-                    }
628
-                    break;
629
-
630
-                case 'font-weight':
631
-                    $this->value['font-bold'] = ($val == 'bold');
632
-                    break;
633
-
634
-                case 'font-style':
635
-                    $this->value['font-italic'] = ($val == 'italic');
636
-                    break;
637
-
638
-                case 'text-decoration':
639
-                    $val = explode(' ', $val);
640
-                    $this->value['font-underline']   = (in_array('underline', $val));
641
-                    $this->value['font-overline']    = (in_array('overline', $val));
642
-                    $this->value['font-linethrough'] = (in_array('line-through', $val));
643
-                    break;
644
-
645
-                case 'text-indent':
646
-                    $this->value['text-indent'] = $this->convertToMM($val);
647
-                    break;
648
-
649
-                case 'text-transform':
650
-                    if ( ! in_array($val, array('none', 'capitalize', 'uppercase', 'lowercase'))) $val = 'none';
651
-                    $this->value['text-transform'] = $val;
652
-                    break;
653
-
654
-                case 'font-size':
655
-                    $val = $this->convertToMM($val, $this->value['font-size']);
656
-                    if ($val) $this->value['font-size'] = $val;
657
-                    break;
658
-
659
-                case 'color':
660
-                    $res = null;
661
-                    $this->value['color'] = $this->convertToColor($val, $res);
662
-                    if ($tagName == 'hr') {
663
-                        $this->value['border']['l']['color'] = $this->value['color'];
664
-                        $this->value['border']['t']['color'] = $this->value['color'];
665
-                        $this->value['border']['r']['color'] = $this->value['color'];
666
-                        $this->value['border']['b']['color'] = $this->value['color'];
667
-                    }
668
-                    break;
669
-
670
-                case 'text-align':
671
-                    $val = strtolower($val);
672
-                    if ( ! in_array($val, array('left', 'right', 'center', 'justify', 'li_right'))) $val = 'left';
673
-                    $this->value['text-align'] = $val;
674
-                    break;
675
-
676
-                case 'vertical-align':
677
-                    $this->value['vertical-align'] = $val;
678
-                    break;
679
-
680
-                case 'width':
681
-                    $this->value['width'] = $this->convertToMM($val, $this->getLastWidth());
682
-                    if ($this->value['width'] && substr($val, -1) == '%') $correctWidth = true;
683
-                    $noWidth = false;
684
-                    break;
685
-
686
-                case 'height':
687
-                    $this->value['height'] = $this->convertToMM($val, $this->getLastHeight());
688
-                    break;
689
-
690
-                case 'line-height':
691
-                    if (preg_match('/^[0-9\.]+$/isU', $val)) $val = floor($val * 100).'%';
692
-                    $this->value['line-height'] = $val;
693
-                    break;
694
-
695
-                case 'rotate':
696
-                    if ( ! in_array($val, array(0, -90, 90, 180, 270, -180, -270))) $val = null;
697
-                    if ($val < 0) $val += 360;
698
-                    $this->value['rotate'] = $val;
699
-                    break;
700
-
701
-                case 'overflow':
702
-                    if ( ! in_array($val, array('visible', 'hidden'))) $val = 'visible';
703
-                    $this->value['overflow'] = $val;
704
-                    break;
705
-
706
-                case 'padding':
707
-                    $val = explode(' ', $val);
708
-                    foreach ($val as $k => $v) {
709
-                        $v = trim($v);
710
-                        if ($v != '') {
711
-                            $val[$k] = $v;
712
-                        } else {
713
-                            unset($val[$k]);
714
-                        }
715
-                    }
716
-                    $val = array_values($val);
717
-                    $this->_duplicateBorder($val);
718
-                    $this->value['padding']['t'] = $this->convertToMM($val[0], 0);
719
-                    $this->value['padding']['r'] = $this->convertToMM($val[1], 0);
720
-                    $this->value['padding']['b'] = $this->convertToMM($val[2], 0);
721
-                    $this->value['padding']['l'] = $this->convertToMM($val[3], 0);
722
-                    break;
723
-
724
-                case 'padding-top':
725
-                    $this->value['padding']['t'] = $this->convertToMM($val, 0);
726
-                    break;
727
-
728
-                case 'padding-right':
729
-                    $this->value['padding']['r'] = $this->convertToMM($val, 0);
730
-                    break;
731
-
732
-                case 'padding-bottom':
733
-                    $this->value['padding']['b'] = $this->convertToMM($val, 0);
734
-                    break;
735
-
736
-                case 'padding-left':
737
-                    $this->value['padding']['l'] = $this->convertToMM($val, 0);
738
-                    break;
739
-
740
-                case 'margin':
741
-                    if ($val == 'auto') {
742
-                        $this->value['margin-auto'] = true;
743
-                        break;
744
-                    }
745
-                    $val = explode(' ', $val);
746
-                    foreach ($val as $k => $v) {
747
-                        $v = trim($v);
748
-                        if ($v != '') {
749
-                            $val[$k] = $v;
750
-                        } else {
751
-                            unset($val[$k]);
752
-                        }
753
-                    }
754
-                    $val = array_values($val);
755
-                    $this->_duplicateBorder($val);
756
-                    $this->value['margin']['t'] = $this->convertToMM($val[0], 0);
757
-                    $this->value['margin']['r'] = $this->convertToMM($val[1], 0);
758
-                    $this->value['margin']['b'] = $this->convertToMM($val[2], 0);
759
-                    $this->value['margin']['l'] = $this->convertToMM($val[3], 0);
760
-                    break;
761
-
762
-                case 'margin-top':
763
-                    $this->value['margin']['t'] = $this->convertToMM($val, 0);
764
-                    break;
765
-
766
-                case 'margin-right':
767
-                    $this->value['margin']['r'] = $this->convertToMM($val, 0);
768
-                    break;
769
-
770
-                case 'margin-bottom':
771
-                    $this->value['margin']['b'] = $this->convertToMM($val, 0);
772
-                    break;
773
-
774
-                case 'margin-left':
775
-                    $this->value['margin']['l'] = $this->convertToMM($val, 0);
776
-                    break;
777
-
778
-                case 'border':
779
-                    $val = $this->readBorder($val);
780
-                    $this->value['border']['t'] = $val;
781
-                    $this->value['border']['r'] = $val;
782
-                    $this->value['border']['b'] = $val;
783
-                    $this->value['border']['l'] = $val;
784
-                    break;
785
-
786
-                case 'border-style':
787
-                    $val = explode(' ', $val);
788
-                    foreach ($val as $valK => $valV) {
789
-                        if ( ! in_array($valV, array('solid', 'dotted', 'dashed'))) {
790
-                            $val[$valK] = null;
791
-                        }
792
-                    }
793
-                    $this->_duplicateBorder($val);
794
-                    if ($val[0]) {
795
-                    	$this->value['border']['t']['type'] = $val[0];
796
-                    }
797
-                    if ($val[1]) {
798
-                    	$this->value['border']['r']['type'] = $val[1];
799
-                    }
800
-                    if ($val[2]) {
801
-                    	$this->value['border']['b']['type'] = $val[2];
802
-                    }
803
-                    if ($val[3]) {
804
-                    	$this->value['border']['l']['type'] = $val[3];
805
-                    }
806
-                    break;
807
-
808
-                case 'border-top-style':
809
-                    if (in_array($val, array('solid', 'dotted', 'dashed'))) {
810
-                        $this->value['border']['t']['type'] = $val;
811
-                    }
812
-                    break;
813
-
814
-                case 'border-right-style':
815
-                    if (in_array($val, array('solid', 'dotted', 'dashed'))) {
816
-                        $this->value['border']['r']['type'] = $val;
817
-                    }
818
-                    break;
819
-
820
-                case 'border-bottom-style':
821
-                    if (in_array($val, array('solid', 'dotted', 'dashed'))) {
822
-                        $this->value['border']['b']['type'] = $val;
823
-                    }
824
-                    break;
825
-
826
-                case 'border-left-style':
827
-                    if (in_array($val, array('solid', 'dotted', 'dashed'))) {
828
-                                            $this->value['border']['l']['type'] = $val;
829
-                    }
830
-                    break;
831
-
832
-                case 'border-color':
833
-                    $res = false;
834
-                    $val = preg_replace('/,[\s]+/', ',', $val);
835
-                    $val = explode(' ', $val);
836
-                    foreach ($val as $valK => $valV) {
837
-                            $val[$valK] = $this->convertToColor($valV, $res);
838
-                            if ( ! $res) {
839
-                                $val[$valK] = null;
840
-                            }
841
-                    }
842
-                    $this->_duplicateBorder($val);
843
-                    if (is_array($val[0])) {
844
-                    	$this->value['border']['t']['color'] = $val[0];
845
-                    }
846
-                    if (is_array($val[1])) {
847
-                    	$this->value['border']['r']['color'] = $val[1];
848
-                    }
849
-                    if (is_array($val[2])) {
850
-                    	$this->value['border']['b']['color'] = $val[2];
851
-                    }
852
-                    if (is_array($val[3])) {
853
-                    	$this->value['border']['l']['color'] = $val[3];
854
-                    }
855
-
856
-                    break;
857
-
858
-                case 'border-top-color':
859
-                    $res = false;
860
-                    $val = $this->convertToColor($val, $res);
861
-                    if ($res) {
862
-                    	$this->value['border']['t']['color'] = $val;
863
-                    }
864
-                    break;
865
-
866
-                case 'border-right-color':
867
-                    $res = false;
868
-                    $val = $this->convertToColor($val, $res);
869
-                    if ($res) {
870
-                    	$this->value['border']['r']['color'] = $val;
871
-                    }
872
-                    break;
873
-
874
-                case 'border-bottom-color':
875
-                    $res = false;
876
-                    $val = $this->convertToColor($val, $res);
877
-                    if ($res) {
878
-                    	$this->value['border']['b']['color'] = $val;
879
-                    }
880
-                    break;
881
-
882
-                case 'border-left-color':
883
-                    $res = false;
884
-                    $val = $this->convertToColor($val, $res);
885
-                    if ($res) {
886
-                    	$this->value['border']['l']['color'] = $val;
887
-                    }
888
-                    break;
889
-
890
-                case 'border-width':
891
-                    $val = explode(' ', $val);
892
-                    foreach ($val as $valK => $valV) {
893
-                            $val[$valK] = $this->convertToMM($valV, 0);
894
-                    }
895
-                    $this->_duplicateBorder($val);
896
-                    if ($val[0]) $this->value['border']['t']['width'] = $val[0];
897
-                    if ($val[1]) $this->value['border']['r']['width'] = $val[1];
898
-                    if ($val[2]) $this->value['border']['b']['width'] = $val[2];
899
-                    if ($val[3]) $this->value['border']['l']['width'] = $val[3];
900
-                    break;
901
-
902
-                case 'border-top-width':
903
-                    $val = $this->convertToMM($val, 0);
904
-                    if ($val) $this->value['border']['t']['width'] = $val;
905
-                    break;
906
-
907
-                case 'border-right-width':
908
-                    $val = $this->convertToMM($val, 0);
909
-                    if ($val) $this->value['border']['r']['width'] = $val;
910
-                    break;
911
-
912
-                case 'border-bottom-width':
913
-                    $val = $this->convertToMM($val, 0);
914
-                    if ($val) $this->value['border']['b']['width'] = $val;
915
-                    break;
916
-
917
-                case 'border-left-width':
918
-                    $val = $this->convertToMM($val, 0);
919
-                    if ($val) $this->value['border']['l']['width'] = $val;
920
-                    break;
921
-
922
-                case 'border-collapse':
923
-                    if ($tagName == 'table') $this->value['border']['collapse'] = ($val == 'collapse');
924
-                    break;
925
-
926
-                case 'border-radius':
927
-                    $val = explode('/', $val);
928
-                    if (count($val) > 2) {
929
-                        break;
930
-                    }
931
-                    $valH = $this->convertToRadius(trim($val[0]));
932
-                    if (count($valH) < 1 || count($valH) > 4) {
933
-                        break;
934
-                    }
935
-                    if ( ! isset($valH[1])) $valH[1] = $valH[0];
936
-                    if ( ! isset($valH[2])) $valH = array($valH[0], $valH[0], $valH[1], $valH[1]);
937
-                    if ( ! isset($valH[3])) $valH[3] = $valH[1];
938
-                    if (isset($val[1])) {
939
-                        $valV = $this->convertToRadius(trim($val[1]));
940
-                        if (count($valV) < 1 || count($valV) > 4) {
941
-                            break;
942
-                        }
943
-                        if ( ! isset($valV[1])) $valV[1] = $valV[0];
944
-                        if ( ! isset($valV[2])) $valV = array($valV[0], $valV[0], $valV[1], $valV[1]);
945
-                        if ( ! isset($valV[3])) $valV[3] = $valV[1];
946
-                    } else {
947
-                        $valV = $valH;
948
-                    }
949
-                    $this->value['border']['radius'] = array(
950
-                                'tl' => array($valH[0], $valV[0]),
951
-                                'tr' => array($valH[1], $valV[1]),
952
-                                'br' => array($valH[2], $valV[2]),
953
-                                'bl' => array($valH[3], $valV[3])
954
-                            );
955
-                    break;
956
-
957
-                case 'border-top-left-radius':
958
-                    $val = $this->convertToRadius($val);
959
-                    if (count($val) < 1 || count($val) > 2) {
960
-                        break;
961
-                    }
962
-                    $this->value['border']['radius']['tl'] = array($val[0], isset($val[1]) ? $val[1] : $val[0]);
963
-                    break;
964
-
965
-                case 'border-top-right-radius':
966
-                    $val = $this->convertToRadius($val);
967
-                    if (count($val) < 1 || count($val) > 2) {
968
-                        break;
969
-                    }
970
-                    $this->value['border']['radius']['tr'] = array($val[0], isset($val[1]) ? $val[1] : $val[0]);
971
-                    break;
972
-
973
-                case 'border-bottom-right-radius':
974
-                    $val = $this->convertToRadius($val);
975
-                    if (count($val) < 1 || count($val) > 2) {
976
-                        break;
977
-                    }
978
-                    $this->value['border']['radius']['br'] = array($val[0], isset($val[1]) ? $val[1] : $val[0]);
979
-                    break;
980
-
981
-                case 'border-bottom-left-radius':
982
-                    $val = $this->convertToRadius($val);
983
-                    if (count($val) < 1 || count($val) > 2) {
984
-                        break;
985
-                    }
986
-                    $this->value['border']['radius']['bl'] = array($val[0], isset($val[1]) ? $val[1] : $val[0]);
987
-                    break;
988
-
989
-                case 'border-top':
990
-                    $this->value['border']['t'] = $this->readBorder($val);
991
-                    break;
992
-
993
-                case 'border-right':
994
-                    $this->value['border']['r'] = $this->readBorder($val);
995
-                    break;
996
-
997
-                case 'border-bottom':
998
-                    $this->value['border']['b'] = $this->readBorder($val);
999
-                    break;
1000
-
1001
-                case 'border-left':
1002
-                    $this->value['border']['l'] = $this->readBorder($val);
1003
-                    break;
1004
-
1005
-                case 'background-color':
1006
-                    $this->value['background']['color'] = $this->convertBackgroundColor($val);
1007
-                    break;
1008
-
1009
-                case 'background-image':
1010
-                    $this->value['background']['image'] = $this->convertBackgroundImage($val);
1011
-                    break;
1012
-
1013
-                case 'background-position':
1014
-                    $res = null;
1015
-                    $this->value['background']['position'] = $this->convertBackgroundPosition($val, $res);
1016
-                    break;
1017
-
1018
-                case 'background-repeat':
1019
-                    $this->value['background']['repeat'] = $this->convertBackgroundRepeat($val);
1020
-                    break;
1021
-
1022
-                case 'background':
1023
-                    $this->convertBackground($val, $this->value['background']);
1024
-                    break;
1025
-
1026
-                case 'position':
1027
-                    if ($val == 'absolute')       $this->value['position'] = 'absolute';
1028
-                    else if ($val == 'relative')  $this->value['position'] = 'relative';
1029
-                    else                        $this->value['position'] = null;
1030
-                    break;
1031
-
1032
-                case 'float':
1033
-                    if ($val == 'left')           $this->value['float'] = 'left';
1034
-                    else if ($val == 'right')     $this->value['float'] = 'right';
1035
-                    else                        $this->value['float'] = null;
1036
-                    break;
1037
-
1038
-                case 'display':
1039
-                    if ($val == 'inline')         $this->value['display'] = 'inline';
1040
-                    else if ($val == 'block')     $this->value['display'] = 'block';
1041
-                    else if ($val == 'none')      $this->value['display'] = 'none';
1042
-                    else                        $this->value['display'] = null;
1043
-                    break;
1044
-
1045
-                case 'top':
1046
-                case 'bottom':
1047
-                case 'left':
1048
-                case 'right':
1049
-                    $this->value[$nom] = $val;
1050
-                    break;
1051
-
1052
-                case 'list-style':
1053
-                case 'list-style-type':
1054
-                case 'list-style-image':
1055
-                    if ($nom == 'list-style') $nom = 'list-style-type';
1056
-                    $this->value[$nom] = $val;
1057
-                    break;
1058
-
1059
-                default:
1060
-                    break;
1061
-            }
1062
-        }
1063
-
1064
-        $return = true;
1065
-
1066
-        // only for P tag
1067
-        if ($this->value['margin']['t'] === null) $this->value['margin']['t'] = $this->value['font-size'];
1068
-        if ($this->value['margin']['b'] === null) $this->value['margin']['b'] = $this->value['font-size'];
1069
-
1070
-        // force the text align to left, if asked by html2pdf
1071
-        if ($this->_onlyLeft) $this->value['text-align'] = 'left';
1072
-
1073
-        // correction on the width (quick box)
1074
-        if ($noWidth && in_array($tagName, array('div', 'blockquote', 'fieldset')) && $this->value['position'] != 'absolute') {
1075
-            $this->value['width'] = $this->getLastWidth();
1076
-            $this->value['width'] -= $this->value['margin']['l'] + $this->value['margin']['r'];
1077
-        } else {
1078
-            if ($correctWidth) {
1079
-                if ( ! in_array($tagName, array('table', 'div', 'blockquote', 'fieldset', 'hr'))) {
1080
-                    $this->value['width'] -= $this->value['padding']['l'] + $this->value['padding']['r'];
1081
-                    $this->value['width'] -= $this->value['border']['l']['width'] + $this->value['border']['r']['width'];
1082
-                }
1083
-                if (in_array($tagName, array('th', 'td'))) {
1084
-                    $this->value['width'] -= $this->convertToMM(isset($param['cellspacing']) ? $param['cellspacing'] : '2px');
1085
-                    $return = false;
1086
-                }
1087
-                if ($this->value['width'] < 0) $this->value['width'] = 0;
1088
-            } else {
1089
-                if ($this->value['width']) {
1090
-                    if ($this->value['border']['l']['width']) $this->value['width'] += $this->value['border']['l']['width'];
1091
-                    if ($this->value['border']['r']['width']) $this->value['width'] += $this->value['border']['r']['width'];
1092
-                    if ($this->value['padding']['l'])         $this->value['width'] += $this->value['padding']['l'];
1093
-                    if ($this->value['padding']['r'])         $this->value['width'] += $this->value['padding']['r'];
1094
-                }
1095
-            }
1096
-        }
1097
-        if ($this->value['height']) {
1098
-            if ($this->value['border']['b']['width']) $this->value['height'] += $this->value['border']['b']['width'];
1099
-            if ($this->value['border']['t']['width']) $this->value['height'] += $this->value['border']['t']['width'];
1100
-            if ($this->value['padding']['b'])         $this->value['height'] += $this->value['padding']['b'];
1101
-            if ($this->value['padding']['t'])         $this->value['height'] += $this->value['padding']['t'];
1102
-        }
1103
-
1104
-        if ($this->value['top'] != null)      $this->value['top']     = $this->convertToMM($this->value['top'], $this->getLastHeight(true));
1105
-        if ($this->value['bottom'] != null)   $this->value['bottom']  = $this->convertToMM($this->value['bottom'], $this->getLastHeight(true));
1106
-        if ($this->value['left'] != null)     $this->value['left']    = $this->convertToMM($this->value['left'], $this->getLastWidth(true));
1107
-        if ($this->value['right'] != null)    $this->value['right']   = $this->convertToMM($this->value['right'], $this->getLastWidth(true));
1108
-
1109
-        if ($this->value['top'] && $this->value['bottom'] && $this->value['height'])    $this->value['bottom']  = null;
1110
-        if ($this->value['left'] && $this->value['right'] && $this->value['width'])     $this->value['right']   = null;
1111
-
1112
-        return $return;
1113
-    }
1114
-
1115
-     /**
1116
-     * get the height of the current line
1117
-     *
1118
-     * @access public
1119
-     * @return float $height in mm
1120
-     */
1121
-    public function getLineHeight()
1122
-    {
1123
-        $val = $this->value['line-height'];
1124
-        if ($val == 'normal') $val = '108%';
1125
-        return $this->convertToMM($val, $this->value['font-size']);
1126
-    }
1127
-
1128
-     /**
1129
-     * get the width of the parent
1130
-     *
1131
-     * @access public
1132
-     * @param  boolean $mode true => adding padding and border
1133
-     * @return float $width in mm
1134
-     */
1135
-    public function getLastWidth($mode = false)
1136
-    {
1137
-        for ($k = count($this->table) - 1; $k >= 0; $k--) {
1138
-            if ($this->table[$k]['width']) {
1139
-                $w = $this->table[$k]['width'];
1140
-                if ($mode) {
1141
-                    $w += $this->table[$k]['border']['l']['width'] + $this->table[$k]['padding']['l'] + 0.02;
1142
-                    $w += $this->table[$k]['border']['r']['width'] + $this->table[$k]['padding']['r'] + 0.02;
1143
-                }
1144
-                return $w;
1145
-            }
1146
-        }
1147
-        return $this->_pdf->getW() - $this->_pdf->getlMargin() - $this->_pdf->getrMargin();
1148
-    }
1149
-
1150
-     /**
1151
-     * get the height of the parent
1152
-     *
1153
-     * @access public
1154
-     * @param  boolean $mode true => adding padding and border
1155
-     * @return float $height in mm
1156
-     */
1157
-    public function getLastHeight($mode = false)
1158
-    {
1159
-        for ($k = count($this->table) - 1; $k >= 0; $k--) {
1160
-            if ($this->table[$k]['height']) {
1161
-                $h = $this->table[$k]['height'];
1162
-                if ($mode) {
1163
-                    $h += $this->table[$k]['border']['t']['width'] + $this->table[$k]['padding']['t'] + 0.02;
1164
-                    $h += $this->table[$k]['border']['b']['width'] + $this->table[$k]['padding']['b'] + 0.02;
1165
-                }
1166
-                return $h;
1167
-            }
1168
-        }
1169
-        return $this->_pdf->getH() - $this->_pdf->gettMargin() - $this->_pdf->getbMargin();
1170
-    }
1171
-
1172
-    /**
1173
-     * get the value of the float property
1174
-     *
1175
-     * @access public
1176
-     * @return $float left/right
1177
-     */
1178
-    public function getFloat()
1179
-    {
1180
-        if ($this->value['float'] == 'left')    return 'left';
1181
-        if ($this->value['float'] == 'right')   return 'right';
1182
-        return null;
1183
-    }
1184
-
1185
-    /**
1186
-     * get the last value for a specific key
1187
-     *
1188
-     * @access public
1189
-     * @param  string $key
1190
-     * @return mixed
1191
-     */
1192
-    public function getLastValue($key)
1193
-    {
1194
-        $nb = count($this->table);
1195
-        if ($nb > 0) {
1196
-            return $this->table[$nb - 1][$key];
1197
-        } else {
1198
-            return null;
1199
-        }
1200
-    }
1201
-
1202
-    /**
1203
-     * get the last absolute X
1204
-     *
1205
-     * @access protected
1206
-     * @return float $x
1207
-     */
1208
-    protected function _getLastAbsoluteX()
1209
-    {
1210
-        for ($k = count($this->table) - 1; $k >= 0; $k--) {
1211
-            if ($this->table[$k]['x'] && $this->table[$k]['position']) return $this->table[$k]['x'];
1212
-        }
1213
-        return $this->_pdf->getlMargin();
1214
-    }
1215
-
1216
-    /**
1217
-     * get the last absolute Y
1218
-     *
1219
-     * @access protected
1220
-     * @return float $y
1221
-     */
1222
-    protected function _getLastAbsoluteY()
1223
-    {
1224
-        for ($k = count($this->table) - 1; $k >= 0; $k--) {
1225
-            if ($this->table[$k]['y'] && $this->table[$k]['position']) return $this->table[$k]['y'];
1226
-        }
1227
-        return $this->_pdf->gettMargin();
1228
-    }
1229
-
1230
-    /**
1231
-     * get the CSS properties of the current tag
1232
-     *
1233
-     * @access protected
1234
-     * @return array $styles
1235
-     */
1236
-    protected function _getFromCSS()
1237
-    {
1238
-        // styles to apply
1239
-        $styles = array();
1240
-
1241
-        // list of the selectors to get in the CSS files
1242
-        $getit  = array();
1243
-
1244
-        // get the list of the selectors of each tags
1245
-        $lst = array();
1246
-        $lst[] = $this->value['id_lst'];
1247
-        for ($i = count($this->table) - 1; $i >= 0; $i--) {
1248
-            $lst[] = $this->table[$i]['id_lst'];
1249
-        }
1250
-
1251
-        // foreach selectors in the CSS files, verify if it match with the list of selectors
1252
-        foreach ($this->cssKeys as $key => $num) {
1253
-            if ($this->_getReccursiveStyle($key, $lst)) {
1254
-                $getit[$key] = $num;
1255
-            }
1256
-        }
1257
-
1258
-        // if we have selectors
1259
-        if (count($getit)) {
1260
-            // get them, but in the definition order, because of priority
1261
-            asort($getit);
1262
-            foreach ($getit as $key => $val) {
1263
-            	$styles = array_merge($styles, $this->css[$key]);
1264
-            }
1265
-        }
1266
-
1267
-        return $styles;
1268
-    }
1269
-
1270
-    /**
1271
-     * identify if the selector $key match with the list of tag selectors
1272
-     *
1273
-     * @access protected
1274
-     * @param  string   $key CSS selector to analyse
1275
-     * @param  array    $lst list of the selectors of each tags
1276
-     * @param  string   $next next step of parsing the selector
1277
-     * @return boolean
1278
-     */
1279
-    protected function _getReccursiveStyle($key, $lst, $next = null)
1280
-    {
1281
-        // if next step
1282
-        if ($next !== null) {
1283
-            // we remove this step
1284
-            if ($next) {
1285
-            	$key = trim(substr($key, 0, -strlen($next)));
1286
-            }
1287
-            array_shift($lst);
1288
-
1289
-            // if no more step to identify => return false
1290
-            if ( ! count($lst)) {
1291
-                return false;
1292
-            }
1293
-        }
1294
-
1295
-        // for each selector of the current step
1296
-        foreach ($lst[0] as $name) {
1297
-            // if selector = key => ok
1298
-            if ($key == $name) {
1299
-                return true;
1300
-            }
1301
-
1302
-            // if the end of the key = the selector and the next step is ok => ok
1303
-            if (substr($key, -strlen(' '.$name)) == ' '.$name && $this->_getReccursiveStyle($key, $lst, $name)) {
1304
-                return true;
1305
-            }
1306
-        }
1307
-
1308
-        // if we are not in the first step, we analyse the sub steps (the pareng tag of the current tag)
1309
-        if ($next !== null && $this->_getReccursiveStyle($key, $lst, '')) {
1310
-            return true;
1311
-        }
1312
-
1313
-        // no corresponding found
1314
-        return false;
1315
-    }
1316
-
1317
-    /**
1318
-     * Analyse a border
1319
-     *
1320
-     * @access  public
1321
-     * @param   string $css css border properties
1322
-     * @return  array  border properties
1323
-     */
1324
-    public function readBorder($css)
1325
-    {
1326
-        // border none
1327
-        $none = array('type' => 'none', 'width' => 0, 'color' => array(0, 0, 0));
1328
-
1329
-        // default value
1330
-        $type  = 'solid';
1331
-        $width = $this->convertToMM('1pt');
1332
-        $color = array(0, 0, 0);
1333
-
1334
-        // clean up the values
1335
-        $css = explode(' ', $css);
1336
-        foreach ($css as $k => $v) {
1337
-            $v = trim($v);
1338
-            if ($v) {
1339
-            	$css[$k] = $v;
1340
-            } else {
1341
-            	unset($css[$k]);
1342
-            }
1343
-        }
1344
-        $css = array_values($css);
1345
-
1346
-        // read the values
1347
-        $res = null;
1348
-        foreach ($css as $value) {
1349
-
1350
-            // if no border => return none
1351
-            if ($value == 'none' || $value == 'hidden') {
1352
-                return $none;
1353
-            }
1354
-
1355
-            // try to convert the value as a distance
1356
-            $tmp = $this->convertToMM($value);
1357
-
1358
-            // if the convert is ok => it is a width
1359
-            if ($tmp !== null) {
1360
-                $width = $tmp;
1361
-            // else, it could be the type
1362
-            } else if (in_array($value, array('solid', 'dotted', 'dashed', 'double'))) {
1363
-                $type = $value;
1364
-            // else, it could be the color
1365
-            } else {
1366
-                $tmp = $this->convertToColor($value, $res);
1367
-                if ($res) $color = $tmp;
1368
-            }
1369
-        }
1370
-
1371
-        // if no witdh => return none
1372
-        if ( ! $width) return $none;
1373
-
1374
-        // return the border properties
1375
-        return array('type' => $type, 'width' => $width, 'color' => $color);
1376
-    }
1377
-
1378
-    /**
1379
-     * duplicate the borders if needed
1380
-     *
1381
-     * @access protected
1382
-     * @param  &array $val
1383
-     */
1384
-    protected function _duplicateBorder(&$val)
1385
-    {
1386
-        // 1 value => L => RTB
1387
-        if (count($val) == 1) {
1388
-            $val[1] = $val[0];
1389
-            $val[2] = $val[0];
1390
-            $val[3] = $val[0];
1391
-        // 2 values => L => R & T => B
1392
-        } else if (count($val) == 2) {
1393
-            $val[2] = $val[0];
1394
-            $val[3] = $val[1];
1395
-        // 3 values => T => B
1396
-        } else if (count($val) == 3) {
1397
-            $val[3] = $val[1];
1398
-        }
1399
-    }
1400
-
1401
-    /**
1402
-     * Analyse a background
1403
-     *
1404
-     * @access public
1405
-     * @param  string $css css background properties
1406
-     * @param  &array $value parsed values (by reference, because, ther is a legacy of the parent CSS properties)
1407
-     */
1408
-    public function convertBackground($css, &$value)
1409
-    {
1410
-        // is there a image ?
1411
-        $text = '/url\(([^)]*)\)/isU';
1412
-        if (preg_match($text, $css, $match)) {
1413
-            // get the image
1414
-            $value['image'] = $this->convertBackgroundImage($match[0]);
1415
-
1416
-            // remove if from the css properties
1417
-            $css = preg_replace($text, '', $css);
1418
-            $css = preg_replace('/[\s]+/', ' ', $css);
1419
-        }
1420
-
1421
-        // protect some spaces
1422
-        $css = preg_replace('/,[\s]+/', ',', $css);
1423
-
1424
-        // explode the values
1425
-        $css = explode(' ', $css);
1426
-
1427
-        // background position to parse
1428
-        $pos = '';
1429
-
1430
-        // foreach value
1431
-        foreach ($css as $val) {
1432
-            // try to parse the value as a color
1433
-            $ok = false;
1434
-            $color = $this->convertToColor($val, $ok);
1435
-
1436
-            // if ok => it is a color
1437
-            if ($ok) {
1438
-                $value['color'] = $color;
1439
-            // else if transparent => no coloàr
1440
-            } else if ($val == 'transparent') {
1441
-                $value['color'] = null;
1442
-            // else
1443
-            } else {
1444
-                // try to parse the value as a repeat
1445
-                $repeat = $this->convertBackgroundRepeat($val);
1446
-
1447
-                // if ok => it is repeat
1448
-                if ($repeat) {
1449
-                    $value['repeat'] = $repeat;
1450
-                // else => it could only be a position
1451
-                } else {
1452
-                    $pos .= ($pos ? ' ' : '').$val;
1453
-                }
1454
-            }
1455
-        }
1456
-
1457
-        // if we have a position to parse
1458
-        if ($pos) {
1459
-            // try to read it
1460
-            $pos = $this->convertBackgroundPosition($pos, $ok);
1461
-            if ($ok) {
1462
-            	$value['position'] = $pos;
1463
-            }
1464
-        }
1465
-    }
1466
-
1467
-    /**
1468
-     * parse a background color
1469
-     *
1470
-     * @access public
1471
-     * @param  string $css
1472
-     * @return string $value
1473
-     */
1474
-    public function convertBackgroundColor($css)
1475
-    {
1476
-        $res = null;
1477
-        if ($css == 'transparent') return null;
1478
-        else                     return $this->convertToColor($css, $res);
1479
-    }
1480
-
1481
-    /**
1482
-     * parse a background image
1483
-     *
1484
-     * @access public
1485
-     * @param  string $css
1486
-     * @return string $value
1487
-     */
1488
-    public function convertBackgroundImage($css)
1489
-    {
1490
-        if ($css == 'none')
1491
-            return null;
1492
-        else if (preg_match('/^url\(([^)]*)\)$/isU', $css, $match))
1493
-            return $match[1];
1494
-        else
1495
-            return null;
1496
-    }
1497
-
1498
-    /**
1499
-     * parse a background position
1500
-     *
1501
-     * @access public
1502
-     * @param  string $css
1503
-     * @param  &boolean $res flag if conver is ok or not
1504
-     * @return array ($x, $y)
1505
-     */
1506
-    public function convertBackgroundPosition($css, &$res)
1507
-    {
1508
-        // init the res
1509
-        $res = false;
1510
-
1511
-        // explode the value
1512
-        $css = explode(' ', $css);
1513
-
1514
-        // we must have 2 values. if 0 or >2 : error. if 1 => put center for 2
1515
-        if (count($css) < 2) {
1516
-            if ( ! $css[0]) return null;
1517
-            $css[1] = 'center';
1518
-        }
1519
-        if (count($css) > 2) return null;
1520
-
1521
-        // prepare the values
1522
-        $x = 0;
1523
-        $y = 0;
1524
-        $res = true;
1525
-
1526
-        // convert the first value
1527
-        if ($css[0] == 'left')        $x = '0%';
1528
-        else if ($css[0] == 'center') $x = '50%';
1529
-        else if ($css[0] == 'right')  $x = '100%';
1530
-        else if ($css[0] == 'top')    $y = '0%';
1531
-        else if ($css[0] == 'bottom') $y = '100%';
1532
-        else if (preg_match('/^[-]?[0-9\.]+%$/isU', $css[0])) $x = $css[0];
1533
-        else if ($this->convertToMM($css[0])) $x = $this->convertToMM($css[0]);
1534
-        else $res = false;
1535
-
1536
-        // convert the second value
1537
-        if ($css[1] == 'left')        $x = '0%';
1538
-        else if ($css[1] == 'right')  $x = '100%';
1539
-        else if ($css[1] == 'top')    $y = '0%';
1540
-        else if ($css[1] == 'center') $y = '50%';
1541
-        else if ($css[1] == 'bottom') $y = '100%';
1542
-        else if (preg_match('/^[-]?[0-9\.]+%$/isU', $css[1])) $y = $css[1];
1543
-        else if ($this->convertToMM($css[1])) $y = $this->convertToMM($css[1]);
1544
-        else $res = false;
1545
-
1546
-        // return the values
1547
-        return array($x, $y);
1548
-    }
1549
-
1550
-    /**
1551
-     * parse a background repeat
1552
-     *
1553
-     * @access public
1554
-     * @param  string $css
1555
-     * @return string $value
1556
-     */
1557
-    public function convertBackgroundRepeat($css)
1558
-    {
1559
-        switch ($css)
1560
-        {
1561
-            case 'repeat':
1562
-                return array(true, true);
1563
-            case 'repeat-x':
1564
-                return array(true, false);
1565
-            case 'repeat-y':
1566
-                return array(false, true);
1567
-            case 'no-repeat':
1568
-                return array(false, false);
1569
-        }
1570
-        return null;
1571
-    }
1572
-
1573
-     /**
1574
-     * convert a distance to mm
1575
-     *
1576
-     * @access public
1577
-     * @param  string $css distance to convert
1578
-     * @param  float  $old parent distance
1579
-     * @return float  $value
1580
-     */
1581
-    public function convertToMM($css, $old = 0.)
1582
-    {
1583
-        $css = trim($css);
1584
-        if (preg_match('/^[0-9\.\-]+$/isU', $css))        $css .= 'px';
1585
-        if (preg_match('/^[0-9\.\-]+px$/isU', $css))      $css = 25.4 / 96. * str_replace('px', '', $css);
1586
-        else if (preg_match('/^[0-9\.\-]+pt$/isU', $css)) $css = 25.4 / 72. * str_replace('pt', '', $css);
1587
-        else if (preg_match('/^[0-9\.\-]+in$/isU', $css)) $css = 25.4 * str_replace('in', '', $css);
1588
-        else if (preg_match('/^[0-9\.\-]+mm$/isU', $css)) $css = 1. * str_replace('mm', '', $css);
1589
-        else if (preg_match('/^[0-9\.\-]+%$/isU', $css))  $css = 1. * $old * str_replace('%', '', $css) / 100.;
1590
-        else                                              $css = null;
1591
-
1592
-        return $css;
1593
-    }
1594
-
1595
-    /**
1596
-     * convert a css radius
1597
-     *
1598
-     * @access public
1599
-     * @param  string $css
1600
-     * @return float  $value
1601
-     */
1602
-    public function convertToRadius($css)
1603
-    {
1604
-        // explode the value
1605
-        $css = explode(' ', $css);
1606
-
1607
-        foreach ($css as $k => $v) {
1608
-            $v = trim($v);
1609
-            if ($v) {
1610
-                $v = $this->convertToMM($v, 0);
1611
-                if ($v !== null) {
1612
-                    $css[$k] = $v;
1613
-                } else {
1614
-                    unset($css[$k]);
1615
-                }
1616
-            } else {
1617
-                unset($css[$k]);
1618
-            }
1619
-        }
1620
-
1621
-        return array_values($css);
1622
-    }
1623
-
1624
-    /**
1625
-     * convert a css color
1626
-     *
1627
-     * @access public
1628
-     * @param  string $css
1629
-     * @param  &boolean $res
1630
-     * @return array (r,g, b)
1631
-     */
1632
-    public function convertToColor($css, &$res)
1633
-    {
1634
-        // prepare the value
1635
-        $css = trim($css);
1636
-        $res = true;
1637
-
1638
-        // if transparent => return null
1639
-        if (strtolower($css) == 'transparent') return array(null, null, null);
1640
-
1641
-        // HTML color
1642
-        if (isset($this->_htmlColor[strtolower($css)])) {
1643
-            $css = $this->_htmlColor[strtolower($css)];
1644
-            $r = floatVal(hexdec(substr($css, 0, 2)));
1645
-            $v = floatVal(hexdec(substr($css, 2, 2)));
1646
-            $b = floatVal(hexdec(substr($css, 4, 2)));
1647
-            return array($r, $v, $b);
1648
-        }
1649
-
1650
-        // like #FFFFFF
1651
-        if (preg_match('/^#[0-9A-Fa-f]{6}$/isU', $css)) {
1652
-            $r = floatVal(hexdec(substr($css, 1, 2)));
1653
-            $v = floatVal(hexdec(substr($css, 3, 2)));
1654
-            $b = floatVal(hexdec(substr($css, 5, 2)));
1655
-            return array($r, $v, $b);
1656
-        }
1657
-
1658
-        // like #FFF
1659
-        if (preg_match('/^#[0-9A-F]{3}$/isU', $css)) {
1660
-            $r = floatVal(hexdec(substr($css, 1, 1).substr($css, 1, 1)));
1661
-            $v = floatVal(hexdec(substr($css, 2, 1).substr($css, 2, 1)));
1662
-            $b = floatVal(hexdec(substr($css, 3, 1).substr($css, 3, 1)));
1663
-            return array($r, $v, $b);
1664
-        }
1665
-
1666
-        // like rgb(100, 100, 100)
1667
-        if (preg_match('/rgb\([\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*\)/isU', $css, $match)) {
1668
-            $r = $this->_convertSubColor($match[1]);
1669
-            $v = $this->_convertSubColor($match[2]);
1670
-            $b = $this->_convertSubColor($match[3]);
1671
-            return array($r * 255., $v * 255., $b * 255.);
1672
-        }
1673
-
1674
-        // like cmyk(100, 100, 100, 100)
1675
-        if (preg_match('/cmyk\([\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*\)/isU', $css, $match)) {
1676
-            $c = $this->_convertSubColor($match[1]);
1677
-            $m = $this->_convertSubColor($match[2]);
1678
-            $y = $this->_convertSubColor($match[3]);
1679
-            $k = $this->_convertSubColor($match[4]);
1680
-            return array($c * 100., $m * 100., $y * 100., $k * 100.);
1681
-        }
1682
-
1683
-        $res = false;
1684
-        return array(0., 0., 0.);
1685
-    }
1686
-
1687
-    /**
1688
-     * color value to convert
1689
-     *
1690
-     * @access protected
1691
-     * @param  string $c
1692
-     * @return float $c 0.->1.
1693
-     */
1694
-    protected function _convertSubColor($c)
1695
-    {
1696
-        if (substr($c, -1) == '%') {
1697
-            $c = floatVal(substr($c, 0, -1)) / 100.;
1698
-        } else {
1699
-            $c = floatVal($c);
1700
-            if ($c > 1) $c = $c / 255.;
1701
-        }
1702
-
1703
-        return $c;
1704
-    }
1705
-
1706
-    /**
1707
-     * read a css content
1708
-     *
1709
-     * @access protected
1710
-     * @param  string $code
1711
-     */
1712
-    protected function _analyseStyle(&$code)
1713
-    {
1714
-        // clean the spaces
1715
-        $code = preg_replace('/[\s]+/', ' ', $code);
1716
-
1717
-        // remove the comments
1718
-        $code = preg_replace('/\/\*.*?\*\//s', '', $code);
1719
-
1720
-        // split each CSS code "selector { value }"
1721
-        preg_match_all('/([^{}]+){([^}]*)}/isU', $code, $match);
1722
-
1723
-        // for each CSS code
1724
-        for ($k = 0; $k < count($match[0]); $k++) {
1725
-
1726
-            // selectors
1727
-            $names = strtolower(trim($match[1][$k]));
1728
-
1729
-            // css style
1730
-            $styles = trim($match[2][$k]);
1731
-
1732
-            // explode each value
1733
-            $styles = explode(';', $styles);
1734
-
1735
-            // parse each value
1736
-            $css = array();
1737
-            foreach ($styles as $style) {
1738
-                $tmp = explode(':', $style);
1739
-                if (count($tmp) > 1) {
1740
-                    $cod = $tmp[0]; unset($tmp[0]); $tmp = implode(':', $tmp);
1741
-                    $css[trim(strtolower($cod))] = trim($tmp);
1742
-                }
1743
-            }
1744
-
1745
-            // explode the names
1746
-            $names = explode(',', $names);
1747
-
1748
-            // save the values for each names
1749
-            foreach ($names as $name) {
1750
-                // clean the name
1751
-                $name = trim($name);
1752
-
1753
-                // if a selector with somethink lige :hover => continue
1754
-                if (strpos($name, ':') !== false) continue;
1755
-
1756
-                // save the value
1757
-                if ( ! isset($this->css[$name]))
1758
-                    $this->css[$name] = $css;
1759
-                else
1760
-                    $this->css[$name] = array_merge($this->css[$name], $css);
1761
-
1762
-            }
1763
-        }
1764
-
1765
-        // get he list of the keys
1766
-        $this->cssKeys = array_flip(array_keys($this->css));
1767
-    }
1768
-
1769
-    /**
1770
-     * Extract the css files from a html code
1771
-     *
1772
-     * @access public
1773
-     * @param  string   &$html
1774
-     * @param string $html
1775
-     */
1776
-    public function readStyle(&$html)
1777
-    {
1778
-        // the CSS content
1779
-        $style = ' ';
1780
-
1781
-        // extract the link tags, and remove them in the html code
1782
-        preg_match_all('/<link([^>]*)>/isU', $html, $match);
1783
-        $html = preg_replace('/<link[^>]*>/isU', '', $html);
1784
-        $html = preg_replace('/<\/link[^>]*>/isU', '', $html);
1785
-
1786
-        // analyse each link tag
1787
-        foreach ($match[1] as $code) {
1788
-            $tmp = array();
1789
-
1790
-            // read the attributes name=value
1791
-            $prop = '([a-zA-Z0-9_]+)=([^"\'\s>]+)';
1792
-            preg_match_all('/'.$prop.'/is', $code, $match);
1793
-            for ($k = 0; $k < count($match[0]); $k++) {
1794
-                $tmp[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
1795
-            }
1796
-
1797
-            // read the attributes name="value"
1798
-            $prop = '([a-zA-Z0-9_]+)=["]([^"]*)["]';
1799
-            preg_match_all('/'.$prop.'/is', $code, $match);
1800
-            for ($k = 0; $k < count($match[0]); $k++) {
1801
-                $tmp[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
1802
-            }
1803
-
1804
-            // read the attributes name='value'
1805
-            $prop = "([a-zA-Z0-9_]+)=[']([^']*)[']";
1806
-            preg_match_all('/'.$prop.'/is', $code, $match);
1807
-            for ($k = 0; $k < count($match[0]); $k++) {
1808
-                $tmp[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
1809
-            }
1810
-
1811
-            // if type text/css => we keep it
1812
-            if (isset($tmp['type']) && strtolower($tmp['type']) == 'text/css' && isset($tmp['href'])) {
1813
-
1814
-                // get the href
1815
-                $url = $tmp['href'];
1816
-
1817
-                // get the content of the css file
1818
-                $content = @file_get_contents($url);
1819
-
1820
-                // if "http://" in the url
1821
-                if (strpos($url, 'http://') !== false) {
1822
-
1823
-                    // get the domain "http://xxx/"
1824
-                    $url = str_replace('http://', '', $url);
1825
-                    $url = explode('/', $url);
1826
-                    $urlMain = 'http://'.$url[0].'/';
1827
-
1828
-                    // get the absolute url of the path
1829
-                    $urlSelf = $url; unset($urlSelf[count($urlSelf) - 1]); $urlSelf = 'http://'.implode('/', $urlSelf).'/';
1830
-
1831
-                    // adapt the url in the css content
1832
-                    $content = preg_replace('/url\(([^\\\\][^)]*)\)/isU', 'url('.$urlSelf.'$1)', $content);
1833
-                    $content = preg_replace('/url\((\\\\[^)]*)\)/isU', 'url('.$urlMain.'$1)', $content);
1834
-                } else {
14
+	/**
15
+	 * reference to the pdf object
16
+	 * @var TCPDF
17
+	 */
18
+	protected $_pdf         = null;
19
+
20
+	protected $_htmlColor   = array(); // list of the HTML colors
21
+	protected $_onlyLeft    = false; // flag if we are in a sub html => only "text-align:left" is used
22
+	protected $_defaultFont = null; // default font to use if the asked font does not exist
23
+
24
+	public    $value        = array(); // current values
25
+	public    $css          = array(); // css values
26
+	public    $cssKeys      = array(); // css key, for the execution order
27
+	public    $table        = array(); // level history
28
+
29
+	/**
30
+	 * Constructor
31
+	 *
32
+	 * @param  &HTML2PDF_myPdf reference to the PDF $object
33
+	 * @param HTML2PDF_myPdf $pdf
34
+	 * @access public
35
+	 */
36
+	public function __construct(&$pdf)
37
+	{
38
+		$this->_init();
39
+		$this->setPdfParent($pdf);
40
+	}
41
+
42
+	/**
43
+	 * Set the HTML2PDF parent object
44
+	 *
45
+	 * @param  &HTML2PDF reference to the HTML2PDF parent $object
46
+	 * @access public
47
+	 */
48
+	public function setPdfParent(&$pdf)
49
+	{
50
+		$this->_pdf = &$pdf;
51
+	}
52
+
53
+	/**
54
+	 * Inform that we want only "test-align:left" because we are in a sub HTML
55
+	 *
56
+	 * @access public
57
+	 */
58
+	public function setOnlyLeft()
59
+	{
60
+		$this->value['text-align'] = 'left';
61
+		$this->_onlyLeft = true;
62
+	}
63
+
64
+	/**
65
+	 * Get the vales of the parent, if exist
66
+	 *
67
+	 * @return array CSS values
68
+	 * @access public
69
+	 */
70
+	public function getOldValues()
71
+	{
72
+		return isset($this->table[count($this->table) - 1]) ? $this->table[count($this->table) - 1] : $this->value;
73
+	}
74
+
75
+	/**
76
+	 * define the Default Font to use, if the font does not exist, or if no font asked
77
+	 *
78
+	 * @param  string  default font-family. If null : Arial for no font asked, and error fot ont does not exist
79
+	 * @param string $default
80
+	 * @return string  old default font-family
81
+	 * @access public
82
+	 */
83
+	public function setDefaultFont($default = null)
84
+	{
85
+		$old = $this->_defaultFont;
86
+		$this->_defaultFont = $default;
87
+		if ($default) {
88
+			$this->value['font-family'] = $default;
89
+		}
90
+		return $old;
91
+	}
92
+
93
+	 /**
94
+	  * Init the object
95
+	  *
96
+	  * @access protected
97
+	  */
98
+	protected function _init()
99
+	{
100
+		// get the Web Colors from TCPDF
101
+		require(K_PATH_MAIN.'htmlcolors.php');
102
+		$this->_htmlColor = $webcolor;
103
+
104
+		// init the Style
105
+		$this->table = array();
106
+		$this->value = array();
107
+		$this->initStyle();
108
+
109
+		// Init the styles without legacy
110
+		$this->resetStyle();
111
+	}
112
+
113
+	/**
114
+	 * Init the CSS Style
115
+	 *
116
+	 * @access public
117
+	 */
118
+	public function initStyle()
119
+	{
120
+		$this->value['id_tag'] = 'body'; // tag name
121
+		$this->value['id_name']          = null; // tag - attribute name
122
+		$this->value['id_id']            = null; // tag - attribute id
123
+		$this->value['id_class']         = null; // tag - attribute class
124
+		$this->value['id_lst']           = array('*'); // tag - list of legacy
125
+		$this->value['mini-size']        = 1.; // specific size report for sup, sub
126
+		$this->value['mini-decal']       = 0; // specific position report for sup, sub
127
+		$this->value['font-family']      = 'Arial';
128
+		$this->value['font-bold']        = false;
129
+		$this->value['font-italic']      = false;
130
+		$this->value['font-underline']   = false;
131
+		$this->value['font-overline']    = false;
132
+		$this->value['font-linethrough'] = false;
133
+		$this->value['text-transform']   = 'none';
134
+		$this->value['font-size']        = $this->convertToMM('10pt');
135
+		$this->value['text-indent']      = 0;
136
+		$this->value['text-align']       = 'left';
137
+		$this->value['vertical-align']   = 'middle';
138
+		$this->value['line-height']      = 'normal';
139
+
140
+		$this->value['position']         = null;
141
+		$this->value['x']                = null;
142
+		$this->value['y']                = null;
143
+		$this->value['width']            = 0;
144
+		$this->value['height']           = 0;
145
+		$this->value['top']              = null;
146
+		$this->value['right']            = null;
147
+		$this->value['bottom']           = null;
148
+		$this->value['left']             = null;
149
+		$this->value['float']            = null;
150
+		$this->value['display']          = null;
151
+		$this->value['rotate']           = null;
152
+		$this->value['overflow']         = 'visible';
153
+
154
+		$this->value['color']            = array(0, 0, 0);
155
+		$this->value['background']       = array('color' => null, 'image' => null, 'position' => null, 'repeat' => null);
156
+		$this->value['border']           = array();
157
+		$this->value['padding']          = array();
158
+		$this->value['margin']           = array();
159
+		$this->value['margin-auto']      = false;
160
+
161
+		$this->value['list-style-type']  = '';
162
+		$this->value['list-style-image'] = '';
163
+
164
+		$this->value['xc'] = null;
165
+		$this->value['yc'] = null;
166
+	}
167
+
168
+	/**
169
+	 * Init the CSS Style without legacy
170
+	 *
171
+	 * @param  string  tag name
172
+	 * @access public
173
+	 */
174
+	public function resetStyle($tagName = '')
175
+	{
176
+		// prepare somme values
177
+		$border = $this->readBorder('solid 1px #000000');
178
+		$units = array(
179
+			'1px' => $this->convertToMM('1px'),
180
+			'5px' => $this->convertToMM('5px'),
181
+		);
182
+
183
+
184
+		// prepare the Collapse attribute
185
+		$collapse = isset($this->value['border']['collapse']) ? $this->value['border']['collapse'] : false;
186
+		if ( ! in_array($tagName, array('tr', 'td', 'th', 'thead', 'tbody', 'tfoot'))) $collapse = false;
187
+
188
+		// set the global css values
189
+		$this->value['position']   = null;
190
+		$this->value['x']          = null;
191
+		$this->value['y']          = null;
192
+		$this->value['width']      = 0;
193
+		$this->value['height']     = 0;
194
+		$this->value['top']        = null;
195
+		$this->value['right']      = null;
196
+		$this->value['bottom']     = null;
197
+		$this->value['left']       = null;
198
+		$this->value['float']      = null;
199
+		$this->value['display']    = null;
200
+		$this->value['rotate']     = null;
201
+		$this->value['overflow']   = 'visible';
202
+		$this->value['background'] = array('color' => null, 'image' => null, 'position' => null, 'repeat' => null);
203
+		$this->value['border']     = array(
204
+			't' => $this->readBorder('none'),
205
+			'r' => $this->readBorder('none'),
206
+			'b' => $this->readBorder('none'),
207
+			'l' => $this->readBorder('none'),
208
+			'radius' => array(
209
+				'tl' => array(0, 0),
210
+				'tr' => array(0, 0),
211
+				'br' => array(0, 0),
212
+				'bl' => array(0, 0)
213
+			),
214
+			'collapse' => $collapse,
215
+		);
216
+
217
+		// specific values for some tags
218
+		if ( ! in_array($tagName, array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) {
219
+			$this->value['margin'] = array('t'=>0, 'r'=>0, 'b'=>0, 'l'=>0);
220
+		}
221
+
222
+		if (in_array($tagName, array('input', 'select', 'textarea'))) {
223
+			$this->value['border']['t'] = null;
224
+			$this->value['border']['r'] = null;
225
+			$this->value['border']['b'] = null;
226
+			$this->value['border']['l'] = null;
227
+		}
228
+
229
+		if ($tagName == 'p') {
230
+			$this->value['margin']['t'] = null;
231
+			$this->value['margin']['b'] = null;
232
+		}
233
+		if ($tagName == 'blockquote') {
234
+			$this->value['margin']['t'] = 3;
235
+			$this->value['margin']['r'] = 3;
236
+			$this->value['margin']['b'] = 3;
237
+			$this->value['margin']['l'] = 6;
238
+		}
239
+		$this->value['margin-auto'] = false;
240
+
241
+		if (in_array($tagName, array('blockquote', 'div', 'fieldset'))) {
242
+			$this->value['vertical-align'] = 'top';
243
+		}
244
+
245
+		if (in_array($tagName, array('fieldset', 'legend'))) {
246
+			$this->value['border'] = array(
247
+				't' => $border,
248
+				'r' => $border,
249
+				'b' => $border,
250
+				'l' => $border,
251
+				'radius' => array(
252
+					'tl' => array($units['5px'], $units['5px']),
253
+					'tr' => array($units['5px'], $units['5px']),
254
+					'br' => array($units['5px'], $units['5px']),
255
+					'bl' => array($units['5px'], $units['5px'])
256
+				),
257
+				'collapse' => false,
258
+			);
259
+		}
260
+
261
+		if (in_array($tagName, array('ul', 'li'))) {
262
+			$this->value['list-style-type']  = '';
263
+			$this->value['list-style-image'] = '';
264
+		}
265
+
266
+		if ( ! in_array($tagName, array('tr', 'td'))) {
267
+			$this->value['padding'] = array(
268
+				't' => 0,
269
+				'r' => 0,
270
+				'b' => 0,
271
+				'l' => 0
272
+			);
273
+		} else {
274
+			$this->value['padding'] = array(
275
+				't' => $units['1px'],
276
+				'r' => $units['1px'],
277
+				'b' => $units['1px'],
278
+				'l' => $units['1px']
279
+			);
280
+		}
281
+
282
+		if ($tagName == 'hr') {
283
+			$this->value['border'] = array(
284
+				't' => $border,
285
+				'r' => $border,
286
+				'b' => $border,
287
+				'l' => $border,
288
+				'radius' => array(
289
+					'tl' => array(0, 0),
290
+					'tr' => array(0, 0),
291
+					'br' => array(0, 0),
292
+					'bl' => array(0, 0)
293
+				),
294
+				'collapse' => false,
295
+			);
296
+			$this->convertBackground('#FFFFFF', $this->value['background']);
297
+		}
298
+
299
+		$this->value['xc'] = null;
300
+		$this->value['yc'] = null;
301
+	}
302
+
303
+	/**
304
+	 * Init the PDF Font
305
+	 *
306
+	 * @access public
307
+	 */
308
+	public function fontSet()
309
+	{
310
+		$family = strtolower($this->value['font-family']);
311
+
312
+		$b = ($this->value['font-bold'] ? 'B' : '');
313
+		$i = ($this->value['font-italic'] ? 'I' : '');
314
+		$u = ($this->value['font-underline'] ? 'U' : '');
315
+		$d = ($this->value['font-linethrough'] ? 'D' : '');
316
+		$o = ($this->value['font-overline'] ? 'O' : '');
317
+
318
+		// font style
319
+		$style = $b.$i;
320
+
321
+		if ($this->_defaultFont) {
322
+			if ($family == 'arial')
323
+				$family = 'helvetica';
324
+			elseif ($family == 'symbol' || $family == 'zapfdingbats')
325
+				$style = '';
326
+
327
+			$fontkey = $family.$style;
328
+			if ( ! $this->_pdf->isLoadedFont($fontkey))
329
+				$family = $this->_defaultFont;
330
+		}
331
+
332
+		if ($family == 'arial')
333
+			$family = 'helvetica';
334
+		elseif ($family == 'symbol' || $family == 'zapfdingbats')
335
+			$style = '';
336
+
337
+		// complete style
338
+		$style .= $u.$d.$o;
339
+
340
+		// size : mm => pt
341
+		$size = $this->value['font-size'];
342
+		$size = 72 * $size / 25.4;
343
+
344
+		// apply the font
345
+		$this->_pdf->SetFont($family, $style, $this->value['mini-size'] * $size);
346
+		$this->_pdf->setTextColorArray($this->value['color']);
347
+		if ($this->value['background']['color']) {
348
+					$this->_pdf->setFillColorArray($this->value['background']['color']);
349
+		} else {
350
+					$this->_pdf->setFillColor(255);
351
+		}
352
+	}
353
+
354
+	 /**
355
+	  * add a level in the CSS history
356
+	  *
357
+	  * @access public
358
+	  */
359
+	public function save()
360
+	{
361
+		array_push($this->table, $this->value);
362
+	}
363
+
364
+	 /**
365
+	  * remove a level in the CSS history
366
+	  *
367
+	  * @access public
368
+	  */
369
+	public function load()
370
+	{
371
+		if (count($this->table)) {
372
+			$this->value = array_pop($this->table);
373
+		}
374
+	}
375
+
376
+	 /**
377
+	  * restore the Y positiony (used after a span)
378
+	  *
379
+	  * @access public
380
+	  */
381
+	public function restorePosition()
382
+	{
383
+		if ($this->value['y'] == $this->_pdf->getY()) $this->_pdf->setY($this->value['yc'], false);
384
+	}
385
+
386
+	 /**
387
+	  * set the New position for the current Tag
388
+	  *
389
+	  * @access public
390
+	  */
391
+	public function setPosition()
392
+	{
393
+		// get the current position
394
+		$currentX = $this->_pdf->getX();
395
+		$currentY = $this->_pdf->getY();
396
+
397
+		// save it
398
+		$this->value['xc'] = $currentX;
399
+		$this->value['yc'] = $currentY;
400
+
401
+		if ($this->value['position'] == 'relative' || $this->value['position'] == 'absolute') {
402
+			if ($this->value['right'] !== null) {
403
+				$x = $this->getLastWidth(true) - $this->value['right'] - $this->value['width'];
404
+				if ($this->value['margin']['r']) $x -= $this->value['margin']['r'];
405
+			} else {
406
+				$x = $this->value['left'];
407
+				if ($this->value['margin']['l']) $x += $this->value['margin']['l'];
408
+			}
409
+
410
+			if ($this->value['bottom'] !== null) {
411
+				$y = $this->getLastHeight(true) - $this->value['bottom'] - $this->value['height'];
412
+				if ($this->value['margin']['b']) $y -= $this->value['margin']['b'];
413
+			} else {
414
+				$y = $this->value['top'];
415
+				if ($this->value['margin']['t']) $y += $this->value['margin']['t'];
416
+			}
417
+
418
+			if ($this->value['position'] == 'relative') {
419
+				$this->value['x'] = $currentX + $x;
420
+				$this->value['y'] = $currentY + $y;
421
+			} else {
422
+				$this->value['x'] = $this->_getLastAbsoluteX() + $x;
423
+				$this->value['y'] = $this->_getLastAbsoluteY() + $y;
424
+			}
425
+		} else {
426
+			$this->value['x'] = $currentX;
427
+			$this->value['y'] = $currentY;
428
+			if ($this->value['margin']['l']) $this->value['x'] += $this->value['margin']['l'];
429
+			if ($this->value['margin']['t']) $this->value['y'] += $this->value['margin']['t'];
430
+		}
431
+
432
+		// save the new position
433
+		$this->_pdf->setXY($this->value['x'], $this->value['y']);
434
+	}
435
+
436
+	 /**
437
+	  * Analise the CSS style to convert it into Form style
438
+	  *
439
+	  * @access public
440
+	  * @param  array    styles
441
+	  */
442
+	public function getFormStyle()
443
+	{
444
+		$prop = array();
445
+
446
+		$prop['alignment'] = $this->value['text-align'];
447
+
448
+		if (isset($this->value['background']['color']) && is_array($this->value['background']['color'])) {
449
+			$prop['fillColor'] = $this->value['background']['color'];
450
+		}
451
+
452
+		if (isset($this->value['border']['t']['color'])) {
453
+			$prop['strokeColor'] = $this->value['border']['t']['color'];
454
+		}
455
+
456
+		if (isset($this->value['border']['t']['width'])) {
457
+			$prop['lineWidth'] = $this->value['border']['t']['width'];
458
+		}
459
+
460
+		if (isset($this->value['border']['t']['type'])) {
461
+			$prop['borderStyle'] = $this->value['border']['t']['type'];
462
+		}
463
+
464
+		if ( ! empty($this->value['color'])) {
465
+			$prop['textColor'] = $this->value['color'];
466
+		}
467
+
468
+		if ( ! empty($this->value['font-size'])) {
469
+			$prop['textSize'] = $this->value['font-size'];
470
+		}
471
+
472
+		return $prop;
473
+	}
474
+
475
+	 /**
476
+	  * Analise the CSS style to convert it into SVG style
477
+	  *
478
+	  * @access public
479
+	  * @param  string   tag name
480
+	  * @param  array    styles
481
+	  * @param string $tagName
482
+	  */
483
+	public function getSvgStyle($tagName, &$param)
484
+	{
485
+		// prepare
486
+		$tagName = strtolower($tagName);
487
+		$id   = isset($param['id']) ? strtolower(trim($param['id'])) : null; if ( ! $id)   $id   = null;
488
+		$name = isset($param['name']) ? strtolower(trim($param['name'])) : null; if ( ! $name) $name = null;
489
+
490
+		// read the class attribute
491
+		$class = array();
492
+		$tmp = isset($param['class']) ? strtolower(trim($param['class'])) : '';
493
+		$tmp = explode(' ', $tmp);
494
+		foreach ($tmp as $k => $v) {
495
+			$v = trim($v);
496
+			if ($v) {
497
+				$class[] = $v;
498
+			}
499
+		}
500
+
501
+		// identify the tag, and the direct styles
502
+		$this->value['id_tag'] = $tagName;
503
+		$this->value['id_name']   = $name;
504
+		$this->value['id_id']     = $id;
505
+		$this->value['id_class']  = $class;
506
+		$this->value['id_lst']    = array();
507
+		$this->value['id_lst'][] = '*';
508
+		$this->value['id_lst'][] = $tagName;
509
+		if ( ! isset($this->value['svg'])) {
510
+			$this->value['svg'] = array(
511
+				'stroke'         => null,
512
+				'stroke-width'   => $this->convertToMM('1pt'),
513
+				'fill'           => null,
514
+				'fill-opacity'   => null,
515
+			);
516
+		}
517
+
518
+		if (count($class)) {
519
+			foreach ($class as $v) {
520
+				$this->value['id_lst'][] = '*.'.$v;
521
+				$this->value['id_lst'][] = '.'.$v;
522
+				$this->value['id_lst'][] = $tagName.'.'.$v;
523
+			}
524
+		}
525
+		if ($id) {
526
+			$this->value['id_lst'][] = '*#'.$id;
527
+			$this->value['id_lst'][] = '#'.$id;
528
+			$this->value['id_lst'][] = $tagName.'#'.$id;
529
+		}
530
+
531
+		// CSS style
532
+		$styles = $this->_getFromCSS();
533
+
534
+		// adding the style from the tag
535
+		$styles = array_merge($styles, $param['style']);
536
+
537
+		if (isset($styles['stroke']))        $this->value['svg']['stroke']       = $this->convertToColor($styles['stroke'], $res);
538
+		if (isset($styles['stroke-width']))  $this->value['svg']['stroke-width'] = $this->convertToMM($styles['stroke-width']);
539
+		if (isset($styles['fill']))          $this->value['svg']['fill']         = $this->convertToColor($styles['fill'], $res);
540
+		if (isset($styles['fill-opacity']))  $this->value['svg']['fill-opacity'] = 1. * $styles['fill-opacity'];
541
+
542
+		return $this->value['svg'];
543
+	}
544
+
545
+	/**
546
+	 * analyse the css properties from the HTML parsing
547
+	 *
548
+	 * @access public
549
+	 * @param  string  $tagName
550
+	 * @param  array   $param
551
+	 * @param  array   $legacy
552
+	 */
553
+	public function analyse($tagName, &$param, $legacy = null)
554
+	{
555
+		// prepare the informations
556
+		$tagName = strtolower($tagName);
557
+		$id   = isset($param['id']) ? strtolower(trim($param['id'])) : null; if ( ! $id)   $id   = null;
558
+		$name = isset($param['name']) ? strtolower(trim($param['name'])) : null; if ( ! $name) $name = null;
559
+
560
+		// get the class names to use
561
+		$class = array();
562
+		$tmp = isset($param['class']) ? strtolower(trim($param['class'])) : '';
563
+		$tmp = explode(' ', $tmp);
564
+		foreach ($tmp as $k => $v) {
565
+			$v = trim($v);
566
+			if ($v) {
567
+				$class[] = $v;
568
+			}
569
+		}
570
+
571
+		// prepare the values, and the list of css tags to identify
572
+		$this->value['id_tag']   = $tagName;
573
+		$this->value['id_name']  = $name;
574
+		$this->value['id_id']    = $id;
575
+		$this->value['id_class'] = $class;
576
+		$this->value['id_lst']   = array();
577
+		$this->value['id_lst'][] = '*';
578
+		$this->value['id_lst'][] = $tagName;
579
+		if (count($class)) {
580
+			foreach ($class as $v) {
581
+				$this->value['id_lst'][] = '*.'.$v;
582
+				$this->value['id_lst'][] = '.'.$v;
583
+				$this->value['id_lst'][] = $tagName.'.'.$v;
584
+			}
585
+		}
586
+		if ($id) {
587
+			$this->value['id_lst'][] = '*#'.$id;
588
+			$this->value['id_lst'][] = '#'.$id;
589
+			$this->value['id_lst'][] = $tagName.'#'.$id;
590
+		}
591
+
592
+		// get the css styles from class
593
+		$styles = $this->_getFromCSS();
594
+
595
+		// merge with the css styles from tag
596
+		$styles = array_merge($styles, $param['style']);
597
+		if (isset($param['allwidth']) && ! isset($styles['width'])) $styles['width'] = '100%';
598
+
599
+		// reset some styles, depending on the tag name
600
+		$this->resetStyle($tagName);
601
+
602
+		// add the legacy values
603
+		if ($legacy) {
604
+			foreach ($legacy as $legacyName => $legacyValue) {
605
+				if (is_array($legacyValue)) {
606
+					foreach ($legacyValue as $legacy2Name => $legacy2Value)
607
+						$this->value[$legacyName][$legacy2Name] = $legacy2Value;
608
+				} else {
609
+					$this->value[$legacyName] = $legacyValue;
610
+				}
611
+			}
612
+		}
613
+
614
+		// some flags
615
+		$correctWidth = false;
616
+		$noWidth = true;
617
+
618
+		// read all the css styles
619
+		foreach ($styles as $nom => $val) {
620
+			switch ($nom)
621
+			{
622
+				case 'font-family':
623
+					$val = explode(',', $val);
624
+					$val = trim($val[0]);
625
+					if ($val) {
626
+						$this->value['font-family'] = $val;
627
+					}
628
+					break;
629
+
630
+				case 'font-weight':
631
+					$this->value['font-bold'] = ($val == 'bold');
632
+					break;
633
+
634
+				case 'font-style':
635
+					$this->value['font-italic'] = ($val == 'italic');
636
+					break;
637
+
638
+				case 'text-decoration':
639
+					$val = explode(' ', $val);
640
+					$this->value['font-underline']   = (in_array('underline', $val));
641
+					$this->value['font-overline']    = (in_array('overline', $val));
642
+					$this->value['font-linethrough'] = (in_array('line-through', $val));
643
+					break;
644
+
645
+				case 'text-indent':
646
+					$this->value['text-indent'] = $this->convertToMM($val);
647
+					break;
648
+
649
+				case 'text-transform':
650
+					if ( ! in_array($val, array('none', 'capitalize', 'uppercase', 'lowercase'))) $val = 'none';
651
+					$this->value['text-transform'] = $val;
652
+					break;
653
+
654
+				case 'font-size':
655
+					$val = $this->convertToMM($val, $this->value['font-size']);
656
+					if ($val) $this->value['font-size'] = $val;
657
+					break;
658
+
659
+				case 'color':
660
+					$res = null;
661
+					$this->value['color'] = $this->convertToColor($val, $res);
662
+					if ($tagName == 'hr') {
663
+						$this->value['border']['l']['color'] = $this->value['color'];
664
+						$this->value['border']['t']['color'] = $this->value['color'];
665
+						$this->value['border']['r']['color'] = $this->value['color'];
666
+						$this->value['border']['b']['color'] = $this->value['color'];
667
+					}
668
+					break;
669
+
670
+				case 'text-align':
671
+					$val = strtolower($val);
672
+					if ( ! in_array($val, array('left', 'right', 'center', 'justify', 'li_right'))) $val = 'left';
673
+					$this->value['text-align'] = $val;
674
+					break;
675
+
676
+				case 'vertical-align':
677
+					$this->value['vertical-align'] = $val;
678
+					break;
679
+
680
+				case 'width':
681
+					$this->value['width'] = $this->convertToMM($val, $this->getLastWidth());
682
+					if ($this->value['width'] && substr($val, -1) == '%') $correctWidth = true;
683
+					$noWidth = false;
684
+					break;
685
+
686
+				case 'height':
687
+					$this->value['height'] = $this->convertToMM($val, $this->getLastHeight());
688
+					break;
689
+
690
+				case 'line-height':
691
+					if (preg_match('/^[0-9\.]+$/isU', $val)) $val = floor($val * 100).'%';
692
+					$this->value['line-height'] = $val;
693
+					break;
694
+
695
+				case 'rotate':
696
+					if ( ! in_array($val, array(0, -90, 90, 180, 270, -180, -270))) $val = null;
697
+					if ($val < 0) $val += 360;
698
+					$this->value['rotate'] = $val;
699
+					break;
700
+
701
+				case 'overflow':
702
+					if ( ! in_array($val, array('visible', 'hidden'))) $val = 'visible';
703
+					$this->value['overflow'] = $val;
704
+					break;
705
+
706
+				case 'padding':
707
+					$val = explode(' ', $val);
708
+					foreach ($val as $k => $v) {
709
+						$v = trim($v);
710
+						if ($v != '') {
711
+							$val[$k] = $v;
712
+						} else {
713
+							unset($val[$k]);
714
+						}
715
+					}
716
+					$val = array_values($val);
717
+					$this->_duplicateBorder($val);
718
+					$this->value['padding']['t'] = $this->convertToMM($val[0], 0);
719
+					$this->value['padding']['r'] = $this->convertToMM($val[1], 0);
720
+					$this->value['padding']['b'] = $this->convertToMM($val[2], 0);
721
+					$this->value['padding']['l'] = $this->convertToMM($val[3], 0);
722
+					break;
723
+
724
+				case 'padding-top':
725
+					$this->value['padding']['t'] = $this->convertToMM($val, 0);
726
+					break;
727
+
728
+				case 'padding-right':
729
+					$this->value['padding']['r'] = $this->convertToMM($val, 0);
730
+					break;
731
+
732
+				case 'padding-bottom':
733
+					$this->value['padding']['b'] = $this->convertToMM($val, 0);
734
+					break;
735
+
736
+				case 'padding-left':
737
+					$this->value['padding']['l'] = $this->convertToMM($val, 0);
738
+					break;
739
+
740
+				case 'margin':
741
+					if ($val == 'auto') {
742
+						$this->value['margin-auto'] = true;
743
+						break;
744
+					}
745
+					$val = explode(' ', $val);
746
+					foreach ($val as $k => $v) {
747
+						$v = trim($v);
748
+						if ($v != '') {
749
+							$val[$k] = $v;
750
+						} else {
751
+							unset($val[$k]);
752
+						}
753
+					}
754
+					$val = array_values($val);
755
+					$this->_duplicateBorder($val);
756
+					$this->value['margin']['t'] = $this->convertToMM($val[0], 0);
757
+					$this->value['margin']['r'] = $this->convertToMM($val[1], 0);
758
+					$this->value['margin']['b'] = $this->convertToMM($val[2], 0);
759
+					$this->value['margin']['l'] = $this->convertToMM($val[3], 0);
760
+					break;
761
+
762
+				case 'margin-top':
763
+					$this->value['margin']['t'] = $this->convertToMM($val, 0);
764
+					break;
765
+
766
+				case 'margin-right':
767
+					$this->value['margin']['r'] = $this->convertToMM($val, 0);
768
+					break;
769
+
770
+				case 'margin-bottom':
771
+					$this->value['margin']['b'] = $this->convertToMM($val, 0);
772
+					break;
773
+
774
+				case 'margin-left':
775
+					$this->value['margin']['l'] = $this->convertToMM($val, 0);
776
+					break;
777
+
778
+				case 'border':
779
+					$val = $this->readBorder($val);
780
+					$this->value['border']['t'] = $val;
781
+					$this->value['border']['r'] = $val;
782
+					$this->value['border']['b'] = $val;
783
+					$this->value['border']['l'] = $val;
784
+					break;
785
+
786
+				case 'border-style':
787
+					$val = explode(' ', $val);
788
+					foreach ($val as $valK => $valV) {
789
+						if ( ! in_array($valV, array('solid', 'dotted', 'dashed'))) {
790
+							$val[$valK] = null;
791
+						}
792
+					}
793
+					$this->_duplicateBorder($val);
794
+					if ($val[0]) {
795
+						$this->value['border']['t']['type'] = $val[0];
796
+					}
797
+					if ($val[1]) {
798
+						$this->value['border']['r']['type'] = $val[1];
799
+					}
800
+					if ($val[2]) {
801
+						$this->value['border']['b']['type'] = $val[2];
802
+					}
803
+					if ($val[3]) {
804
+						$this->value['border']['l']['type'] = $val[3];
805
+					}
806
+					break;
807
+
808
+				case 'border-top-style':
809
+					if (in_array($val, array('solid', 'dotted', 'dashed'))) {
810
+						$this->value['border']['t']['type'] = $val;
811
+					}
812
+					break;
813
+
814
+				case 'border-right-style':
815
+					if (in_array($val, array('solid', 'dotted', 'dashed'))) {
816
+						$this->value['border']['r']['type'] = $val;
817
+					}
818
+					break;
819
+
820
+				case 'border-bottom-style':
821
+					if (in_array($val, array('solid', 'dotted', 'dashed'))) {
822
+						$this->value['border']['b']['type'] = $val;
823
+					}
824
+					break;
825
+
826
+				case 'border-left-style':
827
+					if (in_array($val, array('solid', 'dotted', 'dashed'))) {
828
+											$this->value['border']['l']['type'] = $val;
829
+					}
830
+					break;
831
+
832
+				case 'border-color':
833
+					$res = false;
834
+					$val = preg_replace('/,[\s]+/', ',', $val);
835
+					$val = explode(' ', $val);
836
+					foreach ($val as $valK => $valV) {
837
+							$val[$valK] = $this->convertToColor($valV, $res);
838
+							if ( ! $res) {
839
+								$val[$valK] = null;
840
+							}
841
+					}
842
+					$this->_duplicateBorder($val);
843
+					if (is_array($val[0])) {
844
+						$this->value['border']['t']['color'] = $val[0];
845
+					}
846
+					if (is_array($val[1])) {
847
+						$this->value['border']['r']['color'] = $val[1];
848
+					}
849
+					if (is_array($val[2])) {
850
+						$this->value['border']['b']['color'] = $val[2];
851
+					}
852
+					if (is_array($val[3])) {
853
+						$this->value['border']['l']['color'] = $val[3];
854
+					}
855
+
856
+					break;
857
+
858
+				case 'border-top-color':
859
+					$res = false;
860
+					$val = $this->convertToColor($val, $res);
861
+					if ($res) {
862
+						$this->value['border']['t']['color'] = $val;
863
+					}
864
+					break;
865
+
866
+				case 'border-right-color':
867
+					$res = false;
868
+					$val = $this->convertToColor($val, $res);
869
+					if ($res) {
870
+						$this->value['border']['r']['color'] = $val;
871
+					}
872
+					break;
873
+
874
+				case 'border-bottom-color':
875
+					$res = false;
876
+					$val = $this->convertToColor($val, $res);
877
+					if ($res) {
878
+						$this->value['border']['b']['color'] = $val;
879
+					}
880
+					break;
881
+
882
+				case 'border-left-color':
883
+					$res = false;
884
+					$val = $this->convertToColor($val, $res);
885
+					if ($res) {
886
+						$this->value['border']['l']['color'] = $val;
887
+					}
888
+					break;
889
+
890
+				case 'border-width':
891
+					$val = explode(' ', $val);
892
+					foreach ($val as $valK => $valV) {
893
+							$val[$valK] = $this->convertToMM($valV, 0);
894
+					}
895
+					$this->_duplicateBorder($val);
896
+					if ($val[0]) $this->value['border']['t']['width'] = $val[0];
897
+					if ($val[1]) $this->value['border']['r']['width'] = $val[1];
898
+					if ($val[2]) $this->value['border']['b']['width'] = $val[2];
899
+					if ($val[3]) $this->value['border']['l']['width'] = $val[3];
900
+					break;
901
+
902
+				case 'border-top-width':
903
+					$val = $this->convertToMM($val, 0);
904
+					if ($val) $this->value['border']['t']['width'] = $val;
905
+					break;
906
+
907
+				case 'border-right-width':
908
+					$val = $this->convertToMM($val, 0);
909
+					if ($val) $this->value['border']['r']['width'] = $val;
910
+					break;
911
+
912
+				case 'border-bottom-width':
913
+					$val = $this->convertToMM($val, 0);
914
+					if ($val) $this->value['border']['b']['width'] = $val;
915
+					break;
916
+
917
+				case 'border-left-width':
918
+					$val = $this->convertToMM($val, 0);
919
+					if ($val) $this->value['border']['l']['width'] = $val;
920
+					break;
921
+
922
+				case 'border-collapse':
923
+					if ($tagName == 'table') $this->value['border']['collapse'] = ($val == 'collapse');
924
+					break;
925
+
926
+				case 'border-radius':
927
+					$val = explode('/', $val);
928
+					if (count($val) > 2) {
929
+						break;
930
+					}
931
+					$valH = $this->convertToRadius(trim($val[0]));
932
+					if (count($valH) < 1 || count($valH) > 4) {
933
+						break;
934
+					}
935
+					if ( ! isset($valH[1])) $valH[1] = $valH[0];
936
+					if ( ! isset($valH[2])) $valH = array($valH[0], $valH[0], $valH[1], $valH[1]);
937
+					if ( ! isset($valH[3])) $valH[3] = $valH[1];
938
+					if (isset($val[1])) {
939
+						$valV = $this->convertToRadius(trim($val[1]));
940
+						if (count($valV) < 1 || count($valV) > 4) {
941
+							break;
942
+						}
943
+						if ( ! isset($valV[1])) $valV[1] = $valV[0];
944
+						if ( ! isset($valV[2])) $valV = array($valV[0], $valV[0], $valV[1], $valV[1]);
945
+						if ( ! isset($valV[3])) $valV[3] = $valV[1];
946
+					} else {
947
+						$valV = $valH;
948
+					}
949
+					$this->value['border']['radius'] = array(
950
+								'tl' => array($valH[0], $valV[0]),
951
+								'tr' => array($valH[1], $valV[1]),
952
+								'br' => array($valH[2], $valV[2]),
953
+								'bl' => array($valH[3], $valV[3])
954
+							);
955
+					break;
956
+
957
+				case 'border-top-left-radius':
958
+					$val = $this->convertToRadius($val);
959
+					if (count($val) < 1 || count($val) > 2) {
960
+						break;
961
+					}
962
+					$this->value['border']['radius']['tl'] = array($val[0], isset($val[1]) ? $val[1] : $val[0]);
963
+					break;
964
+
965
+				case 'border-top-right-radius':
966
+					$val = $this->convertToRadius($val);
967
+					if (count($val) < 1 || count($val) > 2) {
968
+						break;
969
+					}
970
+					$this->value['border']['radius']['tr'] = array($val[0], isset($val[1]) ? $val[1] : $val[0]);
971
+					break;
972
+
973
+				case 'border-bottom-right-radius':
974
+					$val = $this->convertToRadius($val);
975
+					if (count($val) < 1 || count($val) > 2) {
976
+						break;
977
+					}
978
+					$this->value['border']['radius']['br'] = array($val[0], isset($val[1]) ? $val[1] : $val[0]);
979
+					break;
980
+
981
+				case 'border-bottom-left-radius':
982
+					$val = $this->convertToRadius($val);
983
+					if (count($val) < 1 || count($val) > 2) {
984
+						break;
985
+					}
986
+					$this->value['border']['radius']['bl'] = array($val[0], isset($val[1]) ? $val[1] : $val[0]);
987
+					break;
988
+
989
+				case 'border-top':
990
+					$this->value['border']['t'] = $this->readBorder($val);
991
+					break;
992
+
993
+				case 'border-right':
994
+					$this->value['border']['r'] = $this->readBorder($val);
995
+					break;
996
+
997
+				case 'border-bottom':
998
+					$this->value['border']['b'] = $this->readBorder($val);
999
+					break;
1000
+
1001
+				case 'border-left':
1002
+					$this->value['border']['l'] = $this->readBorder($val);
1003
+					break;
1004
+
1005
+				case 'background-color':
1006
+					$this->value['background']['color'] = $this->convertBackgroundColor($val);
1007
+					break;
1008
+
1009
+				case 'background-image':
1010
+					$this->value['background']['image'] = $this->convertBackgroundImage($val);
1011
+					break;
1012
+
1013
+				case 'background-position':
1014
+					$res = null;
1015
+					$this->value['background']['position'] = $this->convertBackgroundPosition($val, $res);
1016
+					break;
1017
+
1018
+				case 'background-repeat':
1019
+					$this->value['background']['repeat'] = $this->convertBackgroundRepeat($val);
1020
+					break;
1021
+
1022
+				case 'background':
1023
+					$this->convertBackground($val, $this->value['background']);
1024
+					break;
1025
+
1026
+				case 'position':
1027
+					if ($val == 'absolute')       $this->value['position'] = 'absolute';
1028
+					else if ($val == 'relative')  $this->value['position'] = 'relative';
1029
+					else                        $this->value['position'] = null;
1030
+					break;
1031
+
1032
+				case 'float':
1033
+					if ($val == 'left')           $this->value['float'] = 'left';
1034
+					else if ($val == 'right')     $this->value['float'] = 'right';
1035
+					else                        $this->value['float'] = null;
1036
+					break;
1037
+
1038
+				case 'display':
1039
+					if ($val == 'inline')         $this->value['display'] = 'inline';
1040
+					else if ($val == 'block')     $this->value['display'] = 'block';
1041
+					else if ($val == 'none')      $this->value['display'] = 'none';
1042
+					else                        $this->value['display'] = null;
1043
+					break;
1044
+
1045
+				case 'top':
1046
+				case 'bottom':
1047
+				case 'left':
1048
+				case 'right':
1049
+					$this->value[$nom] = $val;
1050
+					break;
1051
+
1052
+				case 'list-style':
1053
+				case 'list-style-type':
1054
+				case 'list-style-image':
1055
+					if ($nom == 'list-style') $nom = 'list-style-type';
1056
+					$this->value[$nom] = $val;
1057
+					break;
1058
+
1059
+				default:
1060
+					break;
1061
+			}
1062
+		}
1063
+
1064
+		$return = true;
1065
+
1066
+		// only for P tag
1067
+		if ($this->value['margin']['t'] === null) $this->value['margin']['t'] = $this->value['font-size'];
1068
+		if ($this->value['margin']['b'] === null) $this->value['margin']['b'] = $this->value['font-size'];
1069
+
1070
+		// force the text align to left, if asked by html2pdf
1071
+		if ($this->_onlyLeft) $this->value['text-align'] = 'left';
1072
+
1073
+		// correction on the width (quick box)
1074
+		if ($noWidth && in_array($tagName, array('div', 'blockquote', 'fieldset')) && $this->value['position'] != 'absolute') {
1075
+			$this->value['width'] = $this->getLastWidth();
1076
+			$this->value['width'] -= $this->value['margin']['l'] + $this->value['margin']['r'];
1077
+		} else {
1078
+			if ($correctWidth) {
1079
+				if ( ! in_array($tagName, array('table', 'div', 'blockquote', 'fieldset', 'hr'))) {
1080
+					$this->value['width'] -= $this->value['padding']['l'] + $this->value['padding']['r'];
1081
+					$this->value['width'] -= $this->value['border']['l']['width'] + $this->value['border']['r']['width'];
1082
+				}
1083
+				if (in_array($tagName, array('th', 'td'))) {
1084
+					$this->value['width'] -= $this->convertToMM(isset($param['cellspacing']) ? $param['cellspacing'] : '2px');
1085
+					$return = false;
1086
+				}
1087
+				if ($this->value['width'] < 0) $this->value['width'] = 0;
1088
+			} else {
1089
+				if ($this->value['width']) {
1090
+					if ($this->value['border']['l']['width']) $this->value['width'] += $this->value['border']['l']['width'];
1091
+					if ($this->value['border']['r']['width']) $this->value['width'] += $this->value['border']['r']['width'];
1092
+					if ($this->value['padding']['l'])         $this->value['width'] += $this->value['padding']['l'];
1093
+					if ($this->value['padding']['r'])         $this->value['width'] += $this->value['padding']['r'];
1094
+				}
1095
+			}
1096
+		}
1097
+		if ($this->value['height']) {
1098
+			if ($this->value['border']['b']['width']) $this->value['height'] += $this->value['border']['b']['width'];
1099
+			if ($this->value['border']['t']['width']) $this->value['height'] += $this->value['border']['t']['width'];
1100
+			if ($this->value['padding']['b'])         $this->value['height'] += $this->value['padding']['b'];
1101
+			if ($this->value['padding']['t'])         $this->value['height'] += $this->value['padding']['t'];
1102
+		}
1103
+
1104
+		if ($this->value['top'] != null)      $this->value['top']     = $this->convertToMM($this->value['top'], $this->getLastHeight(true));
1105
+		if ($this->value['bottom'] != null)   $this->value['bottom']  = $this->convertToMM($this->value['bottom'], $this->getLastHeight(true));
1106
+		if ($this->value['left'] != null)     $this->value['left']    = $this->convertToMM($this->value['left'], $this->getLastWidth(true));
1107
+		if ($this->value['right'] != null)    $this->value['right']   = $this->convertToMM($this->value['right'], $this->getLastWidth(true));
1108
+
1109
+		if ($this->value['top'] && $this->value['bottom'] && $this->value['height'])    $this->value['bottom']  = null;
1110
+		if ($this->value['left'] && $this->value['right'] && $this->value['width'])     $this->value['right']   = null;
1111
+
1112
+		return $return;
1113
+	}
1114
+
1115
+	 /**
1116
+	  * get the height of the current line
1117
+	  *
1118
+	  * @access public
1119
+	  * @return float $height in mm
1120
+	  */
1121
+	public function getLineHeight()
1122
+	{
1123
+		$val = $this->value['line-height'];
1124
+		if ($val == 'normal') $val = '108%';
1125
+		return $this->convertToMM($val, $this->value['font-size']);
1126
+	}
1127
+
1128
+	 /**
1129
+	  * get the width of the parent
1130
+	  *
1131
+	  * @access public
1132
+	  * @param  boolean $mode true => adding padding and border
1133
+	  * @return float $width in mm
1134
+	  */
1135
+	public function getLastWidth($mode = false)
1136
+	{
1137
+		for ($k = count($this->table) - 1; $k >= 0; $k--) {
1138
+			if ($this->table[$k]['width']) {
1139
+				$w = $this->table[$k]['width'];
1140
+				if ($mode) {
1141
+					$w += $this->table[$k]['border']['l']['width'] + $this->table[$k]['padding']['l'] + 0.02;
1142
+					$w += $this->table[$k]['border']['r']['width'] + $this->table[$k]['padding']['r'] + 0.02;
1143
+				}
1144
+				return $w;
1145
+			}
1146
+		}
1147
+		return $this->_pdf->getW() - $this->_pdf->getlMargin() - $this->_pdf->getrMargin();
1148
+	}
1149
+
1150
+	 /**
1151
+	  * get the height of the parent
1152
+	  *
1153
+	  * @access public
1154
+	  * @param  boolean $mode true => adding padding and border
1155
+	  * @return float $height in mm
1156
+	  */
1157
+	public function getLastHeight($mode = false)
1158
+	{
1159
+		for ($k = count($this->table) - 1; $k >= 0; $k--) {
1160
+			if ($this->table[$k]['height']) {
1161
+				$h = $this->table[$k]['height'];
1162
+				if ($mode) {
1163
+					$h += $this->table[$k]['border']['t']['width'] + $this->table[$k]['padding']['t'] + 0.02;
1164
+					$h += $this->table[$k]['border']['b']['width'] + $this->table[$k]['padding']['b'] + 0.02;
1165
+				}
1166
+				return $h;
1167
+			}
1168
+		}
1169
+		return $this->_pdf->getH() - $this->_pdf->gettMargin() - $this->_pdf->getbMargin();
1170
+	}
1171
+
1172
+	/**
1173
+	 * get the value of the float property
1174
+	 *
1175
+	 * @access public
1176
+	 * @return $float left/right
1177
+	 */
1178
+	public function getFloat()
1179
+	{
1180
+		if ($this->value['float'] == 'left')    return 'left';
1181
+		if ($this->value['float'] == 'right')   return 'right';
1182
+		return null;
1183
+	}
1184
+
1185
+	/**
1186
+	 * get the last value for a specific key
1187
+	 *
1188
+	 * @access public
1189
+	 * @param  string $key
1190
+	 * @return mixed
1191
+	 */
1192
+	public function getLastValue($key)
1193
+	{
1194
+		$nb = count($this->table);
1195
+		if ($nb > 0) {
1196
+			return $this->table[$nb - 1][$key];
1197
+		} else {
1198
+			return null;
1199
+		}
1200
+	}
1201
+
1202
+	/**
1203
+	 * get the last absolute X
1204
+	 *
1205
+	 * @access protected
1206
+	 * @return float $x
1207
+	 */
1208
+	protected function _getLastAbsoluteX()
1209
+	{
1210
+		for ($k = count($this->table) - 1; $k >= 0; $k--) {
1211
+			if ($this->table[$k]['x'] && $this->table[$k]['position']) return $this->table[$k]['x'];
1212
+		}
1213
+		return $this->_pdf->getlMargin();
1214
+	}
1215
+
1216
+	/**
1217
+	 * get the last absolute Y
1218
+	 *
1219
+	 * @access protected
1220
+	 * @return float $y
1221
+	 */
1222
+	protected function _getLastAbsoluteY()
1223
+	{
1224
+		for ($k = count($this->table) - 1; $k >= 0; $k--) {
1225
+			if ($this->table[$k]['y'] && $this->table[$k]['position']) return $this->table[$k]['y'];
1226
+		}
1227
+		return $this->_pdf->gettMargin();
1228
+	}
1229
+
1230
+	/**
1231
+	 * get the CSS properties of the current tag
1232
+	 *
1233
+	 * @access protected
1234
+	 * @return array $styles
1235
+	 */
1236
+	protected function _getFromCSS()
1237
+	{
1238
+		// styles to apply
1239
+		$styles = array();
1240
+
1241
+		// list of the selectors to get in the CSS files
1242
+		$getit  = array();
1243
+
1244
+		// get the list of the selectors of each tags
1245
+		$lst = array();
1246
+		$lst[] = $this->value['id_lst'];
1247
+		for ($i = count($this->table) - 1; $i >= 0; $i--) {
1248
+			$lst[] = $this->table[$i]['id_lst'];
1249
+		}
1250
+
1251
+		// foreach selectors in the CSS files, verify if it match with the list of selectors
1252
+		foreach ($this->cssKeys as $key => $num) {
1253
+			if ($this->_getReccursiveStyle($key, $lst)) {
1254
+				$getit[$key] = $num;
1255
+			}
1256
+		}
1257
+
1258
+		// if we have selectors
1259
+		if (count($getit)) {
1260
+			// get them, but in the definition order, because of priority
1261
+			asort($getit);
1262
+			foreach ($getit as $key => $val) {
1263
+				$styles = array_merge($styles, $this->css[$key]);
1264
+			}
1265
+		}
1266
+
1267
+		return $styles;
1268
+	}
1269
+
1270
+	/**
1271
+	 * identify if the selector $key match with the list of tag selectors
1272
+	 *
1273
+	 * @access protected
1274
+	 * @param  string   $key CSS selector to analyse
1275
+	 * @param  array    $lst list of the selectors of each tags
1276
+	 * @param  string   $next next step of parsing the selector
1277
+	 * @return boolean
1278
+	 */
1279
+	protected function _getReccursiveStyle($key, $lst, $next = null)
1280
+	{
1281
+		// if next step
1282
+		if ($next !== null) {
1283
+			// we remove this step
1284
+			if ($next) {
1285
+				$key = trim(substr($key, 0, -strlen($next)));
1286
+			}
1287
+			array_shift($lst);
1288
+
1289
+			// if no more step to identify => return false
1290
+			if ( ! count($lst)) {
1291
+				return false;
1292
+			}
1293
+		}
1294
+
1295
+		// for each selector of the current step
1296
+		foreach ($lst[0] as $name) {
1297
+			// if selector = key => ok
1298
+			if ($key == $name) {
1299
+				return true;
1300
+			}
1301
+
1302
+			// if the end of the key = the selector and the next step is ok => ok
1303
+			if (substr($key, -strlen(' '.$name)) == ' '.$name && $this->_getReccursiveStyle($key, $lst, $name)) {
1304
+				return true;
1305
+			}
1306
+		}
1307
+
1308
+		// if we are not in the first step, we analyse the sub steps (the pareng tag of the current tag)
1309
+		if ($next !== null && $this->_getReccursiveStyle($key, $lst, '')) {
1310
+			return true;
1311
+		}
1312
+
1313
+		// no corresponding found
1314
+		return false;
1315
+	}
1316
+
1317
+	/**
1318
+	 * Analyse a border
1319
+	 *
1320
+	 * @access  public
1321
+	 * @param   string $css css border properties
1322
+	 * @return  array  border properties
1323
+	 */
1324
+	public function readBorder($css)
1325
+	{
1326
+		// border none
1327
+		$none = array('type' => 'none', 'width' => 0, 'color' => array(0, 0, 0));
1328
+
1329
+		// default value
1330
+		$type  = 'solid';
1331
+		$width = $this->convertToMM('1pt');
1332
+		$color = array(0, 0, 0);
1333
+
1334
+		// clean up the values
1335
+		$css = explode(' ', $css);
1336
+		foreach ($css as $k => $v) {
1337
+			$v = trim($v);
1338
+			if ($v) {
1339
+				$css[$k] = $v;
1340
+			} else {
1341
+				unset($css[$k]);
1342
+			}
1343
+		}
1344
+		$css = array_values($css);
1345
+
1346
+		// read the values
1347
+		$res = null;
1348
+		foreach ($css as $value) {
1349
+
1350
+			// if no border => return none
1351
+			if ($value == 'none' || $value == 'hidden') {
1352
+				return $none;
1353
+			}
1354
+
1355
+			// try to convert the value as a distance
1356
+			$tmp = $this->convertToMM($value);
1357
+
1358
+			// if the convert is ok => it is a width
1359
+			if ($tmp !== null) {
1360
+				$width = $tmp;
1361
+			// else, it could be the type
1362
+			} else if (in_array($value, array('solid', 'dotted', 'dashed', 'double'))) {
1363
+				$type = $value;
1364
+			// else, it could be the color
1365
+			} else {
1366
+				$tmp = $this->convertToColor($value, $res);
1367
+				if ($res) $color = $tmp;
1368
+			}
1369
+		}
1370
+
1371
+		// if no witdh => return none
1372
+		if ( ! $width) return $none;
1373
+
1374
+		// return the border properties
1375
+		return array('type' => $type, 'width' => $width, 'color' => $color);
1376
+	}
1377
+
1378
+	/**
1379
+	 * duplicate the borders if needed
1380
+	 *
1381
+	 * @access protected
1382
+	 * @param  &array $val
1383
+	 */
1384
+	protected function _duplicateBorder(&$val)
1385
+	{
1386
+		// 1 value => L => RTB
1387
+		if (count($val) == 1) {
1388
+			$val[1] = $val[0];
1389
+			$val[2] = $val[0];
1390
+			$val[3] = $val[0];
1391
+		// 2 values => L => R & T => B
1392
+		} else if (count($val) == 2) {
1393
+			$val[2] = $val[0];
1394
+			$val[3] = $val[1];
1395
+		// 3 values => T => B
1396
+		} else if (count($val) == 3) {
1397
+			$val[3] = $val[1];
1398
+		}
1399
+	}
1400
+
1401
+	/**
1402
+	 * Analyse a background
1403
+	 *
1404
+	 * @access public
1405
+	 * @param  string $css css background properties
1406
+	 * @param  &array $value parsed values (by reference, because, ther is a legacy of the parent CSS properties)
1407
+	 */
1408
+	public function convertBackground($css, &$value)
1409
+	{
1410
+		// is there a image ?
1411
+		$text = '/url\(([^)]*)\)/isU';
1412
+		if (preg_match($text, $css, $match)) {
1413
+			// get the image
1414
+			$value['image'] = $this->convertBackgroundImage($match[0]);
1415
+
1416
+			// remove if from the css properties
1417
+			$css = preg_replace($text, '', $css);
1418
+			$css = preg_replace('/[\s]+/', ' ', $css);
1419
+		}
1420
+
1421
+		// protect some spaces
1422
+		$css = preg_replace('/,[\s]+/', ',', $css);
1423
+
1424
+		// explode the values
1425
+		$css = explode(' ', $css);
1426
+
1427
+		// background position to parse
1428
+		$pos = '';
1429
+
1430
+		// foreach value
1431
+		foreach ($css as $val) {
1432
+			// try to parse the value as a color
1433
+			$ok = false;
1434
+			$color = $this->convertToColor($val, $ok);
1435
+
1436
+			// if ok => it is a color
1437
+			if ($ok) {
1438
+				$value['color'] = $color;
1439
+			// else if transparent => no coloàr
1440
+			} else if ($val == 'transparent') {
1441
+				$value['color'] = null;
1442
+			// else
1443
+			} else {
1444
+				// try to parse the value as a repeat
1445
+				$repeat = $this->convertBackgroundRepeat($val);
1446
+
1447
+				// if ok => it is repeat
1448
+				if ($repeat) {
1449
+					$value['repeat'] = $repeat;
1450
+				// else => it could only be a position
1451
+				} else {
1452
+					$pos .= ($pos ? ' ' : '').$val;
1453
+				}
1454
+			}
1455
+		}
1456
+
1457
+		// if we have a position to parse
1458
+		if ($pos) {
1459
+			// try to read it
1460
+			$pos = $this->convertBackgroundPosition($pos, $ok);
1461
+			if ($ok) {
1462
+				$value['position'] = $pos;
1463
+			}
1464
+		}
1465
+	}
1466
+
1467
+	/**
1468
+	 * parse a background color
1469
+	 *
1470
+	 * @access public
1471
+	 * @param  string $css
1472
+	 * @return string $value
1473
+	 */
1474
+	public function convertBackgroundColor($css)
1475
+	{
1476
+		$res = null;
1477
+		if ($css == 'transparent') return null;
1478
+		else                     return $this->convertToColor($css, $res);
1479
+	}
1480
+
1481
+	/**
1482
+	 * parse a background image
1483
+	 *
1484
+	 * @access public
1485
+	 * @param  string $css
1486
+	 * @return string $value
1487
+	 */
1488
+	public function convertBackgroundImage($css)
1489
+	{
1490
+		if ($css == 'none')
1491
+			return null;
1492
+		else if (preg_match('/^url\(([^)]*)\)$/isU', $css, $match))
1493
+			return $match[1];
1494
+		else
1495
+			return null;
1496
+	}
1497
+
1498
+	/**
1499
+	 * parse a background position
1500
+	 *
1501
+	 * @access public
1502
+	 * @param  string $css
1503
+	 * @param  &boolean $res flag if conver is ok or not
1504
+	 * @return array ($x, $y)
1505
+	 */
1506
+	public function convertBackgroundPosition($css, &$res)
1507
+	{
1508
+		// init the res
1509
+		$res = false;
1510
+
1511
+		// explode the value
1512
+		$css = explode(' ', $css);
1513
+
1514
+		// we must have 2 values. if 0 or >2 : error. if 1 => put center for 2
1515
+		if (count($css) < 2) {
1516
+			if ( ! $css[0]) return null;
1517
+			$css[1] = 'center';
1518
+		}
1519
+		if (count($css) > 2) return null;
1520
+
1521
+		// prepare the values
1522
+		$x = 0;
1523
+		$y = 0;
1524
+		$res = true;
1525
+
1526
+		// convert the first value
1527
+		if ($css[0] == 'left')        $x = '0%';
1528
+		else if ($css[0] == 'center') $x = '50%';
1529
+		else if ($css[0] == 'right')  $x = '100%';
1530
+		else if ($css[0] == 'top')    $y = '0%';
1531
+		else if ($css[0] == 'bottom') $y = '100%';
1532
+		else if (preg_match('/^[-]?[0-9\.]+%$/isU', $css[0])) $x = $css[0];
1533
+		else if ($this->convertToMM($css[0])) $x = $this->convertToMM($css[0]);
1534
+		else $res = false;
1535
+
1536
+		// convert the second value
1537
+		if ($css[1] == 'left')        $x = '0%';
1538
+		else if ($css[1] == 'right')  $x = '100%';
1539
+		else if ($css[1] == 'top')    $y = '0%';
1540
+		else if ($css[1] == 'center') $y = '50%';
1541
+		else if ($css[1] == 'bottom') $y = '100%';
1542
+		else if (preg_match('/^[-]?[0-9\.]+%$/isU', $css[1])) $y = $css[1];
1543
+		else if ($this->convertToMM($css[1])) $y = $this->convertToMM($css[1]);
1544
+		else $res = false;
1545
+
1546
+		// return the values
1547
+		return array($x, $y);
1548
+	}
1549
+
1550
+	/**
1551
+	 * parse a background repeat
1552
+	 *
1553
+	 * @access public
1554
+	 * @param  string $css
1555
+	 * @return string $value
1556
+	 */
1557
+	public function convertBackgroundRepeat($css)
1558
+	{
1559
+		switch ($css)
1560
+		{
1561
+			case 'repeat':
1562
+				return array(true, true);
1563
+			case 'repeat-x':
1564
+				return array(true, false);
1565
+			case 'repeat-y':
1566
+				return array(false, true);
1567
+			case 'no-repeat':
1568
+				return array(false, false);
1569
+		}
1570
+		return null;
1571
+	}
1572
+
1573
+	 /**
1574
+	  * convert a distance to mm
1575
+	  *
1576
+	  * @access public
1577
+	  * @param  string $css distance to convert
1578
+	  * @param  float  $old parent distance
1579
+	  * @return float  $value
1580
+	  */
1581
+	public function convertToMM($css, $old = 0.)
1582
+	{
1583
+		$css = trim($css);
1584
+		if (preg_match('/^[0-9\.\-]+$/isU', $css))        $css .= 'px';
1585
+		if (preg_match('/^[0-9\.\-]+px$/isU', $css))      $css = 25.4 / 96. * str_replace('px', '', $css);
1586
+		else if (preg_match('/^[0-9\.\-]+pt$/isU', $css)) $css = 25.4 / 72. * str_replace('pt', '', $css);
1587
+		else if (preg_match('/^[0-9\.\-]+in$/isU', $css)) $css = 25.4 * str_replace('in', '', $css);
1588
+		else if (preg_match('/^[0-9\.\-]+mm$/isU', $css)) $css = 1. * str_replace('mm', '', $css);
1589
+		else if (preg_match('/^[0-9\.\-]+%$/isU', $css))  $css = 1. * $old * str_replace('%', '', $css) / 100.;
1590
+		else                                              $css = null;
1591
+
1592
+		return $css;
1593
+	}
1594
+
1595
+	/**
1596
+	 * convert a css radius
1597
+	 *
1598
+	 * @access public
1599
+	 * @param  string $css
1600
+	 * @return float  $value
1601
+	 */
1602
+	public function convertToRadius($css)
1603
+	{
1604
+		// explode the value
1605
+		$css = explode(' ', $css);
1606
+
1607
+		foreach ($css as $k => $v) {
1608
+			$v = trim($v);
1609
+			if ($v) {
1610
+				$v = $this->convertToMM($v, 0);
1611
+				if ($v !== null) {
1612
+					$css[$k] = $v;
1613
+				} else {
1614
+					unset($css[$k]);
1615
+				}
1616
+			} else {
1617
+				unset($css[$k]);
1618
+			}
1619
+		}
1620
+
1621
+		return array_values($css);
1622
+	}
1623
+
1624
+	/**
1625
+	 * convert a css color
1626
+	 *
1627
+	 * @access public
1628
+	 * @param  string $css
1629
+	 * @param  &boolean $res
1630
+	 * @return array (r,g, b)
1631
+	 */
1632
+	public function convertToColor($css, &$res)
1633
+	{
1634
+		// prepare the value
1635
+		$css = trim($css);
1636
+		$res = true;
1637
+
1638
+		// if transparent => return null
1639
+		if (strtolower($css) == 'transparent') return array(null, null, null);
1640
+
1641
+		// HTML color
1642
+		if (isset($this->_htmlColor[strtolower($css)])) {
1643
+			$css = $this->_htmlColor[strtolower($css)];
1644
+			$r = floatVal(hexdec(substr($css, 0, 2)));
1645
+			$v = floatVal(hexdec(substr($css, 2, 2)));
1646
+			$b = floatVal(hexdec(substr($css, 4, 2)));
1647
+			return array($r, $v, $b);
1648
+		}
1649
+
1650
+		// like #FFFFFF
1651
+		if (preg_match('/^#[0-9A-Fa-f]{6}$/isU', $css)) {
1652
+			$r = floatVal(hexdec(substr($css, 1, 2)));
1653
+			$v = floatVal(hexdec(substr($css, 3, 2)));
1654
+			$b = floatVal(hexdec(substr($css, 5, 2)));
1655
+			return array($r, $v, $b);
1656
+		}
1657
+
1658
+		// like #FFF
1659
+		if (preg_match('/^#[0-9A-F]{3}$/isU', $css)) {
1660
+			$r = floatVal(hexdec(substr($css, 1, 1).substr($css, 1, 1)));
1661
+			$v = floatVal(hexdec(substr($css, 2, 1).substr($css, 2, 1)));
1662
+			$b = floatVal(hexdec(substr($css, 3, 1).substr($css, 3, 1)));
1663
+			return array($r, $v, $b);
1664
+		}
1665
+
1666
+		// like rgb(100, 100, 100)
1667
+		if (preg_match('/rgb\([\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*\)/isU', $css, $match)) {
1668
+			$r = $this->_convertSubColor($match[1]);
1669
+			$v = $this->_convertSubColor($match[2]);
1670
+			$b = $this->_convertSubColor($match[3]);
1671
+			return array($r * 255., $v * 255., $b * 255.);
1672
+		}
1673
+
1674
+		// like cmyk(100, 100, 100, 100)
1675
+		if (preg_match('/cmyk\([\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*\)/isU', $css, $match)) {
1676
+			$c = $this->_convertSubColor($match[1]);
1677
+			$m = $this->_convertSubColor($match[2]);
1678
+			$y = $this->_convertSubColor($match[3]);
1679
+			$k = $this->_convertSubColor($match[4]);
1680
+			return array($c * 100., $m * 100., $y * 100., $k * 100.);
1681
+		}
1682
+
1683
+		$res = false;
1684
+		return array(0., 0., 0.);
1685
+	}
1686
+
1687
+	/**
1688
+	 * color value to convert
1689
+	 *
1690
+	 * @access protected
1691
+	 * @param  string $c
1692
+	 * @return float $c 0.->1.
1693
+	 */
1694
+	protected function _convertSubColor($c)
1695
+	{
1696
+		if (substr($c, -1) == '%') {
1697
+			$c = floatVal(substr($c, 0, -1)) / 100.;
1698
+		} else {
1699
+			$c = floatVal($c);
1700
+			if ($c > 1) $c = $c / 255.;
1701
+		}
1702
+
1703
+		return $c;
1704
+	}
1705
+
1706
+	/**
1707
+	 * read a css content
1708
+	 *
1709
+	 * @access protected
1710
+	 * @param  string $code
1711
+	 */
1712
+	protected function _analyseStyle(&$code)
1713
+	{
1714
+		// clean the spaces
1715
+		$code = preg_replace('/[\s]+/', ' ', $code);
1716
+
1717
+		// remove the comments
1718
+		$code = preg_replace('/\/\*.*?\*\//s', '', $code);
1719
+
1720
+		// split each CSS code "selector { value }"
1721
+		preg_match_all('/([^{}]+){([^}]*)}/isU', $code, $match);
1722
+
1723
+		// for each CSS code
1724
+		for ($k = 0; $k < count($match[0]); $k++) {
1725
+
1726
+			// selectors
1727
+			$names = strtolower(trim($match[1][$k]));
1728
+
1729
+			// css style
1730
+			$styles = trim($match[2][$k]);
1731
+
1732
+			// explode each value
1733
+			$styles = explode(';', $styles);
1734
+
1735
+			// parse each value
1736
+			$css = array();
1737
+			foreach ($styles as $style) {
1738
+				$tmp = explode(':', $style);
1739
+				if (count($tmp) > 1) {
1740
+					$cod = $tmp[0]; unset($tmp[0]); $tmp = implode(':', $tmp);
1741
+					$css[trim(strtolower($cod))] = trim($tmp);
1742
+				}
1743
+			}
1744
+
1745
+			// explode the names
1746
+			$names = explode(',', $names);
1747
+
1748
+			// save the values for each names
1749
+			foreach ($names as $name) {
1750
+				// clean the name
1751
+				$name = trim($name);
1752
+
1753
+				// if a selector with somethink lige :hover => continue
1754
+				if (strpos($name, ':') !== false) continue;
1755
+
1756
+				// save the value
1757
+				if ( ! isset($this->css[$name]))
1758
+					$this->css[$name] = $css;
1759
+				else
1760
+					$this->css[$name] = array_merge($this->css[$name], $css);
1761
+
1762
+			}
1763
+		}
1764
+
1765
+		// get he list of the keys
1766
+		$this->cssKeys = array_flip(array_keys($this->css));
1767
+	}
1768
+
1769
+	/**
1770
+	 * Extract the css files from a html code
1771
+	 *
1772
+	 * @access public
1773
+	 * @param  string   &$html
1774
+	 * @param string $html
1775
+	 */
1776
+	public function readStyle(&$html)
1777
+	{
1778
+		// the CSS content
1779
+		$style = ' ';
1780
+
1781
+		// extract the link tags, and remove them in the html code
1782
+		preg_match_all('/<link([^>]*)>/isU', $html, $match);
1783
+		$html = preg_replace('/<link[^>]*>/isU', '', $html);
1784
+		$html = preg_replace('/<\/link[^>]*>/isU', '', $html);
1785
+
1786
+		// analyse each link tag
1787
+		foreach ($match[1] as $code) {
1788
+			$tmp = array();
1789
+
1790
+			// read the attributes name=value
1791
+			$prop = '([a-zA-Z0-9_]+)=([^"\'\s>]+)';
1792
+			preg_match_all('/'.$prop.'/is', $code, $match);
1793
+			for ($k = 0; $k < count($match[0]); $k++) {
1794
+				$tmp[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
1795
+			}
1796
+
1797
+			// read the attributes name="value"
1798
+			$prop = '([a-zA-Z0-9_]+)=["]([^"]*)["]';
1799
+			preg_match_all('/'.$prop.'/is', $code, $match);
1800
+			for ($k = 0; $k < count($match[0]); $k++) {
1801
+				$tmp[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
1802
+			}
1803
+
1804
+			// read the attributes name='value'
1805
+			$prop = "([a-zA-Z0-9_]+)=[']([^']*)[']";
1806
+			preg_match_all('/'.$prop.'/is', $code, $match);
1807
+			for ($k = 0; $k < count($match[0]); $k++) {
1808
+				$tmp[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
1809
+			}
1810
+
1811
+			// if type text/css => we keep it
1812
+			if (isset($tmp['type']) && strtolower($tmp['type']) == 'text/css' && isset($tmp['href'])) {
1813
+
1814
+				// get the href
1815
+				$url = $tmp['href'];
1816
+
1817
+				// get the content of the css file
1818
+				$content = @file_get_contents($url);
1819
+
1820
+				// if "http://" in the url
1821
+				if (strpos($url, 'http://') !== false) {
1822
+
1823
+					// get the domain "http://xxx/"
1824
+					$url = str_replace('http://', '', $url);
1825
+					$url = explode('/', $url);
1826
+					$urlMain = 'http://'.$url[0].'/';
1827
+
1828
+					// get the absolute url of the path
1829
+					$urlSelf = $url; unset($urlSelf[count($urlSelf) - 1]); $urlSelf = 'http://'.implode('/', $urlSelf).'/';
1830
+
1831
+					// adapt the url in the css content
1832
+					$content = preg_replace('/url\(([^\\\\][^)]*)\)/isU', 'url('.$urlSelf.'$1)', $content);
1833
+					$content = preg_replace('/url\((\\\\[^)]*)\)/isU', 'url('.$urlMain.'$1)', $content);
1834
+				} else {
1835 1835
 // @TODO correction on url in absolute on a local css content
1836
-                    // $content = preg_replace('/url\(([^)]*)\)/isU', 'url('.dirname($url).'/$1)', $content);
1837
-                }
1838
-
1839
-                // add to the CSS content
1840
-                $style .= $content."\n";
1841
-            }
1842
-        }
1843
-
1844
-        // extract the style tags des tags style, and remove them in the html code
1845
-        preg_match_all('/<style[^>]*>(.*)<\/style[^>]*>/isU', $html, $match);
1846
-        $html = preg_replace('/<style[^>]*>(.*)<\/style[^>]*>/isU', '', $html);
1847
-
1848
-        // analyse each style tags
1849
-        foreach ($match[1] as $code) {
1850
-            // add to the CSS content
1851
-            $code = str_replace('<!--', '', $code);
1852
-            $code = str_replace('-->', '', $code);
1853
-            $style .= $code."\n";
1854
-        }
1855
-
1856
-        //analyse the css content
1857
-        $this->_analyseStyle($style);
1858
-    }
1836
+					// $content = preg_replace('/url\(([^)]*)\)/isU', 'url('.dirname($url).'/$1)', $content);
1837
+				}
1838
+
1839
+				// add to the CSS content
1840
+				$style .= $content."\n";
1841
+			}
1842
+		}
1843
+
1844
+		// extract the style tags des tags style, and remove them in the html code
1845
+		preg_match_all('/<style[^>]*>(.*)<\/style[^>]*>/isU', $html, $match);
1846
+		$html = preg_replace('/<style[^>]*>(.*)<\/style[^>]*>/isU', '', $html);
1847
+
1848
+		// analyse each style tags
1849
+		foreach ($match[1] as $code) {
1850
+			// add to the CSS content
1851
+			$code = str_replace('<!--', '', $code);
1852
+			$code = str_replace('-->', '', $code);
1853
+			$style .= $code."\n";
1854
+		}
1855
+
1856
+		//analyse the css content
1857
+		$this->_analyseStyle($style);
1858
+	}
1859 1859
 }
1860 1860
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -484,7 +484,7 @@  discard block
 block discarded – undo
484 484
     {
485 485
         // prepare
486 486
         $tagName = strtolower($tagName);
487
-        $id   = isset($param['id']) ? strtolower(trim($param['id'])) : null; if ( ! $id)   $id   = null;
487
+        $id   = isset($param['id']) ? strtolower(trim($param['id'])) : null; if ( ! $id)   $id = null;
488 488
         $name = isset($param['name']) ? strtolower(trim($param['name'])) : null; if ( ! $name) $name = null;
489 489
 
490 490
         // read the class attribute
@@ -554,7 +554,7 @@  discard block
 block discarded – undo
554 554
     {
555 555
         // prepare the informations
556 556
         $tagName = strtolower($tagName);
557
-        $id   = isset($param['id']) ? strtolower(trim($param['id'])) : null; if ( ! $id)   $id   = null;
557
+        $id   = isset($param['id']) ? strtolower(trim($param['id'])) : null; if ( ! $id)   $id = null;
558 558
         $name = isset($param['name']) ? strtolower(trim($param['name'])) : null; if ( ! $name) $name = null;
559 559
 
560 560
         // get the class names to use
Please login to merge, or discard this patch.
Braces   +319 added lines, -128 removed lines patch added patch discarded remove patch
@@ -183,7 +183,9 @@  discard block
 block discarded – undo
183 183
 
184 184
         // prepare the Collapse attribute
185 185
         $collapse = isset($this->value['border']['collapse']) ? $this->value['border']['collapse'] : false;
186
-        if ( ! in_array($tagName, array('tr', 'td', 'th', 'thead', 'tbody', 'tfoot'))) $collapse = false;
186
+        if ( ! in_array($tagName, array('tr', 'td', 'th', 'thead', 'tbody', 'tfoot'))) {
187
+        	$collapse = false;
188
+        }
187 189
 
188 190
         // set the global css values
189 191
         $this->value['position']   = null;
@@ -319,20 +321,23 @@  discard block
 block discarded – undo
319 321
         $style = $b.$i;
320 322
 
321 323
         if ($this->_defaultFont) {
322
-            if ($family == 'arial')
323
-                $family = 'helvetica';
324
-            elseif ($family == 'symbol' || $family == 'zapfdingbats')
325
-                $style = '';
324
+            if ($family == 'arial') {
325
+                            $family = 'helvetica';
326
+            } elseif ($family == 'symbol' || $family == 'zapfdingbats') {
327
+                            $style = '';
328
+            }
326 329
 
327 330
             $fontkey = $family.$style;
328
-            if ( ! $this->_pdf->isLoadedFont($fontkey))
329
-                $family = $this->_defaultFont;
331
+            if ( ! $this->_pdf->isLoadedFont($fontkey)) {
332
+                            $family = $this->_defaultFont;
333
+            }
330 334
         }
331 335
 
332
-        if ($family == 'arial')
333
-            $family = 'helvetica';
334
-        elseif ($family == 'symbol' || $family == 'zapfdingbats')
335
-            $style = '';
336
+        if ($family == 'arial') {
337
+                    $family = 'helvetica';
338
+        } elseif ($family == 'symbol' || $family == 'zapfdingbats') {
339
+                    $style = '';
340
+        }
336 341
 
337 342
         // complete style
338 343
         $style .= $u.$d.$o;
@@ -380,7 +385,9 @@  discard block
 block discarded – undo
380 385
      */
381 386
     public function restorePosition()
382 387
     {
383
-        if ($this->value['y'] == $this->_pdf->getY()) $this->_pdf->setY($this->value['yc'], false);
388
+        if ($this->value['y'] == $this->_pdf->getY()) {
389
+        	$this->_pdf->setY($this->value['yc'], false);
390
+        }
384 391
     }
385 392
 
386 393
      /**
@@ -401,18 +408,26 @@  discard block
 block discarded – undo
401 408
         if ($this->value['position'] == 'relative' || $this->value['position'] == 'absolute') {
402 409
             if ($this->value['right'] !== null) {
403 410
                 $x = $this->getLastWidth(true) - $this->value['right'] - $this->value['width'];
404
-                if ($this->value['margin']['r']) $x -= $this->value['margin']['r'];
411
+                if ($this->value['margin']['r']) {
412
+                	$x -= $this->value['margin']['r'];
413
+                }
405 414
             } else {
406 415
                 $x = $this->value['left'];
407
-                if ($this->value['margin']['l']) $x += $this->value['margin']['l'];
416
+                if ($this->value['margin']['l']) {
417
+                	$x += $this->value['margin']['l'];
418
+                }
408 419
             }
409 420
 
410 421
             if ($this->value['bottom'] !== null) {
411 422
                 $y = $this->getLastHeight(true) - $this->value['bottom'] - $this->value['height'];
412
-                if ($this->value['margin']['b']) $y -= $this->value['margin']['b'];
423
+                if ($this->value['margin']['b']) {
424
+                	$y -= $this->value['margin']['b'];
425
+                }
413 426
             } else {
414 427
                 $y = $this->value['top'];
415
-                if ($this->value['margin']['t']) $y += $this->value['margin']['t'];
428
+                if ($this->value['margin']['t']) {
429
+                	$y += $this->value['margin']['t'];
430
+                }
416 431
             }
417 432
 
418 433
             if ($this->value['position'] == 'relative') {
@@ -425,8 +440,12 @@  discard block
 block discarded – undo
425 440
         } else {
426 441
             $this->value['x'] = $currentX;
427 442
             $this->value['y'] = $currentY;
428
-            if ($this->value['margin']['l']) $this->value['x'] += $this->value['margin']['l'];
429
-            if ($this->value['margin']['t']) $this->value['y'] += $this->value['margin']['t'];
443
+            if ($this->value['margin']['l']) {
444
+            	$this->value['x'] += $this->value['margin']['l'];
445
+            }
446
+            if ($this->value['margin']['t']) {
447
+            	$this->value['y'] += $this->value['margin']['t'];
448
+            }
430 449
         }
431 450
 
432 451
         // save the new position
@@ -484,8 +503,12 @@  discard block
 block discarded – undo
484 503
     {
485 504
         // prepare
486 505
         $tagName = strtolower($tagName);
487
-        $id   = isset($param['id']) ? strtolower(trim($param['id'])) : null; if ( ! $id)   $id   = null;
488
-        $name = isset($param['name']) ? strtolower(trim($param['name'])) : null; if ( ! $name) $name = null;
506
+        $id   = isset($param['id']) ? strtolower(trim($param['id'])) : null; if ( ! $id) {
507
+        	$id   = null;
508
+        }
509
+        $name = isset($param['name']) ? strtolower(trim($param['name'])) : null; if ( ! $name) {
510
+        	$name = null;
511
+        }
489 512
 
490 513
         // read the class attribute
491 514
         $class = array();
@@ -534,10 +557,18 @@  discard block
 block discarded – undo
534 557
         // adding the style from the tag
535 558
         $styles = array_merge($styles, $param['style']);
536 559
 
537
-        if (isset($styles['stroke']))        $this->value['svg']['stroke']       = $this->convertToColor($styles['stroke'], $res);
538
-        if (isset($styles['stroke-width']))  $this->value['svg']['stroke-width'] = $this->convertToMM($styles['stroke-width']);
539
-        if (isset($styles['fill']))          $this->value['svg']['fill']         = $this->convertToColor($styles['fill'], $res);
540
-        if (isset($styles['fill-opacity']))  $this->value['svg']['fill-opacity'] = 1. * $styles['fill-opacity'];
560
+        if (isset($styles['stroke'])) {
561
+        	$this->value['svg']['stroke']       = $this->convertToColor($styles['stroke'], $res);
562
+        }
563
+        if (isset($styles['stroke-width'])) {
564
+        	$this->value['svg']['stroke-width'] = $this->convertToMM($styles['stroke-width']);
565
+        }
566
+        if (isset($styles['fill'])) {
567
+        	$this->value['svg']['fill']         = $this->convertToColor($styles['fill'], $res);
568
+        }
569
+        if (isset($styles['fill-opacity'])) {
570
+        	$this->value['svg']['fill-opacity'] = 1. * $styles['fill-opacity'];
571
+        }
541 572
 
542 573
         return $this->value['svg'];
543 574
     }
@@ -554,8 +585,12 @@  discard block
 block discarded – undo
554 585
     {
555 586
         // prepare the informations
556 587
         $tagName = strtolower($tagName);
557
-        $id   = isset($param['id']) ? strtolower(trim($param['id'])) : null; if ( ! $id)   $id   = null;
558
-        $name = isset($param['name']) ? strtolower(trim($param['name'])) : null; if ( ! $name) $name = null;
588
+        $id   = isset($param['id']) ? strtolower(trim($param['id'])) : null; if ( ! $id) {
589
+        	$id   = null;
590
+        }
591
+        $name = isset($param['name']) ? strtolower(trim($param['name'])) : null; if ( ! $name) {
592
+        	$name = null;
593
+        }
559 594
 
560 595
         // get the class names to use
561 596
         $class = array();
@@ -594,7 +629,9 @@  discard block
 block discarded – undo
594 629
 
595 630
         // merge with the css styles from tag
596 631
         $styles = array_merge($styles, $param['style']);
597
-        if (isset($param['allwidth']) && ! isset($styles['width'])) $styles['width'] = '100%';
632
+        if (isset($param['allwidth']) && ! isset($styles['width'])) {
633
+        	$styles['width'] = '100%';
634
+        }
598 635
 
599 636
         // reset some styles, depending on the tag name
600 637
         $this->resetStyle($tagName);
@@ -603,8 +640,9 @@  discard block
 block discarded – undo
603 640
         if ($legacy) {
604 641
             foreach ($legacy as $legacyName => $legacyValue) {
605 642
                 if (is_array($legacyValue)) {
606
-                    foreach ($legacyValue as $legacy2Name => $legacy2Value)
607
-                        $this->value[$legacyName][$legacy2Name] = $legacy2Value;
643
+                    foreach ($legacyValue as $legacy2Name => $legacy2Value) {
644
+                                            $this->value[$legacyName][$legacy2Name] = $legacy2Value;
645
+                    }
608 646
                 } else {
609 647
                     $this->value[$legacyName] = $legacyValue;
610 648
                 }
@@ -647,13 +685,17 @@  discard block
 block discarded – undo
647 685
                     break;
648 686
 
649 687
                 case 'text-transform':
650
-                    if ( ! in_array($val, array('none', 'capitalize', 'uppercase', 'lowercase'))) $val = 'none';
688
+                    if ( ! in_array($val, array('none', 'capitalize', 'uppercase', 'lowercase'))) {
689
+                    	$val = 'none';
690
+                    }
651 691
                     $this->value['text-transform'] = $val;
652 692
                     break;
653 693
 
654 694
                 case 'font-size':
655 695
                     $val = $this->convertToMM($val, $this->value['font-size']);
656
-                    if ($val) $this->value['font-size'] = $val;
696
+                    if ($val) {
697
+                    	$this->value['font-size'] = $val;
698
+                    }
657 699
                     break;
658 700
 
659 701
                 case 'color':
@@ -669,7 +711,9 @@  discard block
 block discarded – undo
669 711
 
670 712
                 case 'text-align':
671 713
                     $val = strtolower($val);
672
-                    if ( ! in_array($val, array('left', 'right', 'center', 'justify', 'li_right'))) $val = 'left';
714
+                    if ( ! in_array($val, array('left', 'right', 'center', 'justify', 'li_right'))) {
715
+                    	$val = 'left';
716
+                    }
673 717
                     $this->value['text-align'] = $val;
674 718
                     break;
675 719
 
@@ -679,7 +723,9 @@  discard block
 block discarded – undo
679 723
 
680 724
                 case 'width':
681 725
                     $this->value['width'] = $this->convertToMM($val, $this->getLastWidth());
682
-                    if ($this->value['width'] && substr($val, -1) == '%') $correctWidth = true;
726
+                    if ($this->value['width'] && substr($val, -1) == '%') {
727
+                    	$correctWidth = true;
728
+                    }
683 729
                     $noWidth = false;
684 730
                     break;
685 731
 
@@ -688,18 +734,26 @@  discard block
 block discarded – undo
688 734
                     break;
689 735
 
690 736
                 case 'line-height':
691
-                    if (preg_match('/^[0-9\.]+$/isU', $val)) $val = floor($val * 100).'%';
737
+                    if (preg_match('/^[0-9\.]+$/isU', $val)) {
738
+                    	$val = floor($val * 100).'%';
739
+                    }
692 740
                     $this->value['line-height'] = $val;
693 741
                     break;
694 742
 
695 743
                 case 'rotate':
696
-                    if ( ! in_array($val, array(0, -90, 90, 180, 270, -180, -270))) $val = null;
697
-                    if ($val < 0) $val += 360;
744
+                    if ( ! in_array($val, array(0, -90, 90, 180, 270, -180, -270))) {
745
+                    	$val = null;
746
+                    }
747
+                    if ($val < 0) {
748
+                    	$val += 360;
749
+                    }
698 750
                     $this->value['rotate'] = $val;
699 751
                     break;
700 752
 
701 753
                 case 'overflow':
702
-                    if ( ! in_array($val, array('visible', 'hidden'))) $val = 'visible';
754
+                    if ( ! in_array($val, array('visible', 'hidden'))) {
755
+                    	$val = 'visible';
756
+                    }
703 757
                     $this->value['overflow'] = $val;
704 758
                     break;
705 759
 
@@ -893,34 +947,52 @@  discard block
 block discarded – undo
893 947
                             $val[$valK] = $this->convertToMM($valV, 0);
894 948
                     }
895 949
                     $this->_duplicateBorder($val);
896
-                    if ($val[0]) $this->value['border']['t']['width'] = $val[0];
897
-                    if ($val[1]) $this->value['border']['r']['width'] = $val[1];
898
-                    if ($val[2]) $this->value['border']['b']['width'] = $val[2];
899
-                    if ($val[3]) $this->value['border']['l']['width'] = $val[3];
950
+                    if ($val[0]) {
951
+                    	$this->value['border']['t']['width'] = $val[0];
952
+                    }
953
+                    if ($val[1]) {
954
+                    	$this->value['border']['r']['width'] = $val[1];
955
+                    }
956
+                    if ($val[2]) {
957
+                    	$this->value['border']['b']['width'] = $val[2];
958
+                    }
959
+                    if ($val[3]) {
960
+                    	$this->value['border']['l']['width'] = $val[3];
961
+                    }
900 962
                     break;
901 963
 
902 964
                 case 'border-top-width':
903 965
                     $val = $this->convertToMM($val, 0);
904
-                    if ($val) $this->value['border']['t']['width'] = $val;
966
+                    if ($val) {
967
+                    	$this->value['border']['t']['width'] = $val;
968
+                    }
905 969
                     break;
906 970
 
907 971
                 case 'border-right-width':
908 972
                     $val = $this->convertToMM($val, 0);
909
-                    if ($val) $this->value['border']['r']['width'] = $val;
973
+                    if ($val) {
974
+                    	$this->value['border']['r']['width'] = $val;
975
+                    }
910 976
                     break;
911 977
 
912 978
                 case 'border-bottom-width':
913 979
                     $val = $this->convertToMM($val, 0);
914
-                    if ($val) $this->value['border']['b']['width'] = $val;
980
+                    if ($val) {
981
+                    	$this->value['border']['b']['width'] = $val;
982
+                    }
915 983
                     break;
916 984
 
917 985
                 case 'border-left-width':
918 986
                     $val = $this->convertToMM($val, 0);
919
-                    if ($val) $this->value['border']['l']['width'] = $val;
987
+                    if ($val) {
988
+                    	$this->value['border']['l']['width'] = $val;
989
+                    }
920 990
                     break;
921 991
 
922 992
                 case 'border-collapse':
923
-                    if ($tagName == 'table') $this->value['border']['collapse'] = ($val == 'collapse');
993
+                    if ($tagName == 'table') {
994
+                    	$this->value['border']['collapse'] = ($val == 'collapse');
995
+                    }
924 996
                     break;
925 997
 
926 998
                 case 'border-radius':
@@ -932,17 +1004,29 @@  discard block
 block discarded – undo
932 1004
                     if (count($valH) < 1 || count($valH) > 4) {
933 1005
                         break;
934 1006
                     }
935
-                    if ( ! isset($valH[1])) $valH[1] = $valH[0];
936
-                    if ( ! isset($valH[2])) $valH = array($valH[0], $valH[0], $valH[1], $valH[1]);
937
-                    if ( ! isset($valH[3])) $valH[3] = $valH[1];
1007
+                    if ( ! isset($valH[1])) {
1008
+                    	$valH[1] = $valH[0];
1009
+                    }
1010
+                    if ( ! isset($valH[2])) {
1011
+                    	$valH = array($valH[0], $valH[0], $valH[1], $valH[1]);
1012
+                    }
1013
+                    if ( ! isset($valH[3])) {
1014
+                    	$valH[3] = $valH[1];
1015
+                    }
938 1016
                     if (isset($val[1])) {
939 1017
                         $valV = $this->convertToRadius(trim($val[1]));
940 1018
                         if (count($valV) < 1 || count($valV) > 4) {
941 1019
                             break;
942 1020
                         }
943
-                        if ( ! isset($valV[1])) $valV[1] = $valV[0];
944
-                        if ( ! isset($valV[2])) $valV = array($valV[0], $valV[0], $valV[1], $valV[1]);
945
-                        if ( ! isset($valV[3])) $valV[3] = $valV[1];
1021
+                        if ( ! isset($valV[1])) {
1022
+                        	$valV[1] = $valV[0];
1023
+                        }
1024
+                        if ( ! isset($valV[2])) {
1025
+                        	$valV = array($valV[0], $valV[0], $valV[1], $valV[1]);
1026
+                        }
1027
+                        if ( ! isset($valV[3])) {
1028
+                        	$valV[3] = $valV[1];
1029
+                        }
946 1030
                     } else {
947 1031
                         $valV = $valH;
948 1032
                     }
@@ -1024,22 +1108,35 @@  discard block
 block discarded – undo
1024 1108
                     break;
1025 1109
 
1026 1110
                 case 'position':
1027
-                    if ($val == 'absolute')       $this->value['position'] = 'absolute';
1028
-                    else if ($val == 'relative')  $this->value['position'] = 'relative';
1029
-                    else                        $this->value['position'] = null;
1111
+                    if ($val == 'absolute') {
1112
+                    	$this->value['position'] = 'absolute';
1113
+                    } else if ($val == 'relative') {
1114
+                    	$this->value['position'] = 'relative';
1115
+                    } else {
1116
+                    	$this->value['position'] = null;
1117
+                    }
1030 1118
                     break;
1031 1119
 
1032 1120
                 case 'float':
1033
-                    if ($val == 'left')           $this->value['float'] = 'left';
1034
-                    else if ($val == 'right')     $this->value['float'] = 'right';
1035
-                    else                        $this->value['float'] = null;
1121
+                    if ($val == 'left') {
1122
+                    	$this->value['float'] = 'left';
1123
+                    } else if ($val == 'right') {
1124
+                    	$this->value['float'] = 'right';
1125
+                    } else {
1126
+                    	$this->value['float'] = null;
1127
+                    }
1036 1128
                     break;
1037 1129
 
1038 1130
                 case 'display':
1039
-                    if ($val == 'inline')         $this->value['display'] = 'inline';
1040
-                    else if ($val == 'block')     $this->value['display'] = 'block';
1041
-                    else if ($val == 'none')      $this->value['display'] = 'none';
1042
-                    else                        $this->value['display'] = null;
1131
+                    if ($val == 'inline') {
1132
+                    	$this->value['display'] = 'inline';
1133
+                    } else if ($val == 'block') {
1134
+                    	$this->value['display'] = 'block';
1135
+                    } else if ($val == 'none') {
1136
+                    	$this->value['display'] = 'none';
1137
+                    } else {
1138
+                    	$this->value['display'] = null;
1139
+                    }
1043 1140
                     break;
1044 1141
 
1045 1142
                 case 'top':
@@ -1052,7 +1149,9 @@  discard block
 block discarded – undo
1052 1149
                 case 'list-style':
1053 1150
                 case 'list-style-type':
1054 1151
                 case 'list-style-image':
1055
-                    if ($nom == 'list-style') $nom = 'list-style-type';
1152
+                    if ($nom == 'list-style') {
1153
+                    	$nom = 'list-style-type';
1154
+                    }
1056 1155
                     $this->value[$nom] = $val;
1057 1156
                     break;
1058 1157
 
@@ -1064,11 +1163,17 @@  discard block
 block discarded – undo
1064 1163
         $return = true;
1065 1164
 
1066 1165
         // only for P tag
1067
-        if ($this->value['margin']['t'] === null) $this->value['margin']['t'] = $this->value['font-size'];
1068
-        if ($this->value['margin']['b'] === null) $this->value['margin']['b'] = $this->value['font-size'];
1166
+        if ($this->value['margin']['t'] === null) {
1167
+        	$this->value['margin']['t'] = $this->value['font-size'];
1168
+        }
1169
+        if ($this->value['margin']['b'] === null) {
1170
+        	$this->value['margin']['b'] = $this->value['font-size'];
1171
+        }
1069 1172
 
1070 1173
         // force the text align to left, if asked by html2pdf
1071
-        if ($this->_onlyLeft) $this->value['text-align'] = 'left';
1174
+        if ($this->_onlyLeft) {
1175
+        	$this->value['text-align'] = 'left';
1176
+        }
1072 1177
 
1073 1178
         // correction on the width (quick box)
1074 1179
         if ($noWidth && in_array($tagName, array('div', 'blockquote', 'fieldset')) && $this->value['position'] != 'absolute') {
@@ -1084,30 +1189,60 @@  discard block
 block discarded – undo
1084 1189
                     $this->value['width'] -= $this->convertToMM(isset($param['cellspacing']) ? $param['cellspacing'] : '2px');
1085 1190
                     $return = false;
1086 1191
                 }
1087
-                if ($this->value['width'] < 0) $this->value['width'] = 0;
1192
+                if ($this->value['width'] < 0) {
1193
+                	$this->value['width'] = 0;
1194
+                }
1088 1195
             } else {
1089 1196
                 if ($this->value['width']) {
1090
-                    if ($this->value['border']['l']['width']) $this->value['width'] += $this->value['border']['l']['width'];
1091
-                    if ($this->value['border']['r']['width']) $this->value['width'] += $this->value['border']['r']['width'];
1092
-                    if ($this->value['padding']['l'])         $this->value['width'] += $this->value['padding']['l'];
1093
-                    if ($this->value['padding']['r'])         $this->value['width'] += $this->value['padding']['r'];
1197
+                    if ($this->value['border']['l']['width']) {
1198
+                    	$this->value['width'] += $this->value['border']['l']['width'];
1199
+                    }
1200
+                    if ($this->value['border']['r']['width']) {
1201
+                    	$this->value['width'] += $this->value['border']['r']['width'];
1202
+                    }
1203
+                    if ($this->value['padding']['l']) {
1204
+                    	$this->value['width'] += $this->value['padding']['l'];
1205
+                    }
1206
+                    if ($this->value['padding']['r']) {
1207
+                    	$this->value['width'] += $this->value['padding']['r'];
1208
+                    }
1094 1209
                 }
1095 1210
             }
1096 1211
         }
1097 1212
         if ($this->value['height']) {
1098
-            if ($this->value['border']['b']['width']) $this->value['height'] += $this->value['border']['b']['width'];
1099
-            if ($this->value['border']['t']['width']) $this->value['height'] += $this->value['border']['t']['width'];
1100
-            if ($this->value['padding']['b'])         $this->value['height'] += $this->value['padding']['b'];
1101
-            if ($this->value['padding']['t'])         $this->value['height'] += $this->value['padding']['t'];
1213
+            if ($this->value['border']['b']['width']) {
1214
+            	$this->value['height'] += $this->value['border']['b']['width'];
1215
+            }
1216
+            if ($this->value['border']['t']['width']) {
1217
+            	$this->value['height'] += $this->value['border']['t']['width'];
1218
+            }
1219
+            if ($this->value['padding']['b']) {
1220
+            	$this->value['height'] += $this->value['padding']['b'];
1221
+            }
1222
+            if ($this->value['padding']['t']) {
1223
+            	$this->value['height'] += $this->value['padding']['t'];
1224
+            }
1102 1225
         }
1103 1226
 
1104
-        if ($this->value['top'] != null)      $this->value['top']     = $this->convertToMM($this->value['top'], $this->getLastHeight(true));
1105
-        if ($this->value['bottom'] != null)   $this->value['bottom']  = $this->convertToMM($this->value['bottom'], $this->getLastHeight(true));
1106
-        if ($this->value['left'] != null)     $this->value['left']    = $this->convertToMM($this->value['left'], $this->getLastWidth(true));
1107
-        if ($this->value['right'] != null)    $this->value['right']   = $this->convertToMM($this->value['right'], $this->getLastWidth(true));
1227
+        if ($this->value['top'] != null) {
1228
+        	$this->value['top']     = $this->convertToMM($this->value['top'], $this->getLastHeight(true));
1229
+        }
1230
+        if ($this->value['bottom'] != null) {
1231
+        	$this->value['bottom']  = $this->convertToMM($this->value['bottom'], $this->getLastHeight(true));
1232
+        }
1233
+        if ($this->value['left'] != null) {
1234
+        	$this->value['left']    = $this->convertToMM($this->value['left'], $this->getLastWidth(true));
1235
+        }
1236
+        if ($this->value['right'] != null) {
1237
+        	$this->value['right']   = $this->convertToMM($this->value['right'], $this->getLastWidth(true));
1238
+        }
1108 1239
 
1109
-        if ($this->value['top'] && $this->value['bottom'] && $this->value['height'])    $this->value['bottom']  = null;
1110
-        if ($this->value['left'] && $this->value['right'] && $this->value['width'])     $this->value['right']   = null;
1240
+        if ($this->value['top'] && $this->value['bottom'] && $this->value['height']) {
1241
+        	$this->value['bottom']  = null;
1242
+        }
1243
+        if ($this->value['left'] && $this->value['right'] && $this->value['width']) {
1244
+        	$this->value['right']   = null;
1245
+        }
1111 1246
 
1112 1247
         return $return;
1113 1248
     }
@@ -1121,7 +1256,9 @@  discard block
 block discarded – undo
1121 1256
     public function getLineHeight()
1122 1257
     {
1123 1258
         $val = $this->value['line-height'];
1124
-        if ($val == 'normal') $val = '108%';
1259
+        if ($val == 'normal') {
1260
+        	$val = '108%';
1261
+        }
1125 1262
         return $this->convertToMM($val, $this->value['font-size']);
1126 1263
     }
1127 1264
 
@@ -1177,8 +1314,12 @@  discard block
 block discarded – undo
1177 1314
      */
1178 1315
     public function getFloat()
1179 1316
     {
1180
-        if ($this->value['float'] == 'left')    return 'left';
1181
-        if ($this->value['float'] == 'right')   return 'right';
1317
+        if ($this->value['float'] == 'left') {
1318
+        	return 'left';
1319
+        }
1320
+        if ($this->value['float'] == 'right') {
1321
+        	return 'right';
1322
+        }
1182 1323
         return null;
1183 1324
     }
1184 1325
 
@@ -1208,7 +1349,9 @@  discard block
 block discarded – undo
1208 1349
     protected function _getLastAbsoluteX()
1209 1350
     {
1210 1351
         for ($k = count($this->table) - 1; $k >= 0; $k--) {
1211
-            if ($this->table[$k]['x'] && $this->table[$k]['position']) return $this->table[$k]['x'];
1352
+            if ($this->table[$k]['x'] && $this->table[$k]['position']) {
1353
+            	return $this->table[$k]['x'];
1354
+            }
1212 1355
         }
1213 1356
         return $this->_pdf->getlMargin();
1214 1357
     }
@@ -1222,7 +1365,9 @@  discard block
 block discarded – undo
1222 1365
     protected function _getLastAbsoluteY()
1223 1366
     {
1224 1367
         for ($k = count($this->table) - 1; $k >= 0; $k--) {
1225
-            if ($this->table[$k]['y'] && $this->table[$k]['position']) return $this->table[$k]['y'];
1368
+            if ($this->table[$k]['y'] && $this->table[$k]['position']) {
1369
+            	return $this->table[$k]['y'];
1370
+            }
1226 1371
         }
1227 1372
         return $this->_pdf->gettMargin();
1228 1373
     }
@@ -1364,12 +1509,16 @@  discard block
 block discarded – undo
1364 1509
             // else, it could be the color
1365 1510
             } else {
1366 1511
                 $tmp = $this->convertToColor($value, $res);
1367
-                if ($res) $color = $tmp;
1512
+                if ($res) {
1513
+                	$color = $tmp;
1514
+                }
1368 1515
             }
1369 1516
         }
1370 1517
 
1371 1518
         // if no witdh => return none
1372
-        if ( ! $width) return $none;
1519
+        if ( ! $width) {
1520
+        	return $none;
1521
+        }
1373 1522
 
1374 1523
         // return the border properties
1375 1524
         return array('type' => $type, 'width' => $width, 'color' => $color);
@@ -1474,8 +1623,11 @@  discard block
 block discarded – undo
1474 1623
     public function convertBackgroundColor($css)
1475 1624
     {
1476 1625
         $res = null;
1477
-        if ($css == 'transparent') return null;
1478
-        else                     return $this->convertToColor($css, $res);
1626
+        if ($css == 'transparent') {
1627
+        	return null;
1628
+        } else {
1629
+        	return $this->convertToColor($css, $res);
1630
+        }
1479 1631
     }
1480 1632
 
1481 1633
     /**
@@ -1487,12 +1639,13 @@  discard block
 block discarded – undo
1487 1639
      */
1488 1640
     public function convertBackgroundImage($css)
1489 1641
     {
1490
-        if ($css == 'none')
1491
-            return null;
1492
-        else if (preg_match('/^url\(([^)]*)\)$/isU', $css, $match))
1493
-            return $match[1];
1494
-        else
1495
-            return null;
1642
+        if ($css == 'none') {
1643
+                    return null;
1644
+        } else if (preg_match('/^url\(([^)]*)\)$/isU', $css, $match)) {
1645
+                    return $match[1];
1646
+        } else {
1647
+                    return null;
1648
+        }
1496 1649
     }
1497 1650
 
1498 1651
     /**
@@ -1513,10 +1666,14 @@  discard block
 block discarded – undo
1513 1666
 
1514 1667
         // we must have 2 values. if 0 or >2 : error. if 1 => put center for 2
1515 1668
         if (count($css) < 2) {
1516
-            if ( ! $css[0]) return null;
1669
+            if ( ! $css[0]) {
1670
+            	return null;
1671
+            }
1517 1672
             $css[1] = 'center';
1518 1673
         }
1519
-        if (count($css) > 2) return null;
1674
+        if (count($css) > 2) {
1675
+        	return null;
1676
+        }
1520 1677
 
1521 1678
         // prepare the values
1522 1679
         $x = 0;
@@ -1524,24 +1681,42 @@  discard block
 block discarded – undo
1524 1681
         $res = true;
1525 1682
 
1526 1683
         // convert the first value
1527
-        if ($css[0] == 'left')        $x = '0%';
1528
-        else if ($css[0] == 'center') $x = '50%';
1529
-        else if ($css[0] == 'right')  $x = '100%';
1530
-        else if ($css[0] == 'top')    $y = '0%';
1531
-        else if ($css[0] == 'bottom') $y = '100%';
1532
-        else if (preg_match('/^[-]?[0-9\.]+%$/isU', $css[0])) $x = $css[0];
1533
-        else if ($this->convertToMM($css[0])) $x = $this->convertToMM($css[0]);
1534
-        else $res = false;
1684
+        if ($css[0] == 'left') {
1685
+        	$x = '0%';
1686
+        } else if ($css[0] == 'center') {
1687
+        	$x = '50%';
1688
+        } else if ($css[0] == 'right') {
1689
+        	$x = '100%';
1690
+        } else if ($css[0] == 'top') {
1691
+        	$y = '0%';
1692
+        } else if ($css[0] == 'bottom') {
1693
+        	$y = '100%';
1694
+        } else if (preg_match('/^[-]?[0-9\.]+%$/isU', $css[0])) {
1695
+        	$x = $css[0];
1696
+        } else if ($this->convertToMM($css[0])) {
1697
+        	$x = $this->convertToMM($css[0]);
1698
+        } else {
1699
+        	$res = false;
1700
+        }
1535 1701
 
1536 1702
         // convert the second value
1537
-        if ($css[1] == 'left')        $x = '0%';
1538
-        else if ($css[1] == 'right')  $x = '100%';
1539
-        else if ($css[1] == 'top')    $y = '0%';
1540
-        else if ($css[1] == 'center') $y = '50%';
1541
-        else if ($css[1] == 'bottom') $y = '100%';
1542
-        else if (preg_match('/^[-]?[0-9\.]+%$/isU', $css[1])) $y = $css[1];
1543
-        else if ($this->convertToMM($css[1])) $y = $this->convertToMM($css[1]);
1544
-        else $res = false;
1703
+        if ($css[1] == 'left') {
1704
+        	$x = '0%';
1705
+        } else if ($css[1] == 'right') {
1706
+        	$x = '100%';
1707
+        } else if ($css[1] == 'top') {
1708
+        	$y = '0%';
1709
+        } else if ($css[1] == 'center') {
1710
+        	$y = '50%';
1711
+        } else if ($css[1] == 'bottom') {
1712
+        	$y = '100%';
1713
+        } else if (preg_match('/^[-]?[0-9\.]+%$/isU', $css[1])) {
1714
+        	$y = $css[1];
1715
+        } else if ($this->convertToMM($css[1])) {
1716
+        	$y = $this->convertToMM($css[1]);
1717
+        } else {
1718
+        	$res = false;
1719
+        }
1545 1720
 
1546 1721
         // return the values
1547 1722
         return array($x, $y);
@@ -1581,13 +1756,22 @@  discard block
 block discarded – undo
1581 1756
     public function convertToMM($css, $old = 0.)
1582 1757
     {
1583 1758
         $css = trim($css);
1584
-        if (preg_match('/^[0-9\.\-]+$/isU', $css))        $css .= 'px';
1585
-        if (preg_match('/^[0-9\.\-]+px$/isU', $css))      $css = 25.4 / 96. * str_replace('px', '', $css);
1586
-        else if (preg_match('/^[0-9\.\-]+pt$/isU', $css)) $css = 25.4 / 72. * str_replace('pt', '', $css);
1587
-        else if (preg_match('/^[0-9\.\-]+in$/isU', $css)) $css = 25.4 * str_replace('in', '', $css);
1588
-        else if (preg_match('/^[0-9\.\-]+mm$/isU', $css)) $css = 1. * str_replace('mm', '', $css);
1589
-        else if (preg_match('/^[0-9\.\-]+%$/isU', $css))  $css = 1. * $old * str_replace('%', '', $css) / 100.;
1590
-        else                                              $css = null;
1759
+        if (preg_match('/^[0-9\.\-]+$/isU', $css)) {
1760
+        	$css .= 'px';
1761
+        }
1762
+        if (preg_match('/^[0-9\.\-]+px$/isU', $css)) {
1763
+        	$css = 25.4 / 96. * str_replace('px', '', $css);
1764
+        } else if (preg_match('/^[0-9\.\-]+pt$/isU', $css)) {
1765
+        	$css = 25.4 / 72. * str_replace('pt', '', $css);
1766
+        } else if (preg_match('/^[0-9\.\-]+in$/isU', $css)) {
1767
+        	$css = 25.4 * str_replace('in', '', $css);
1768
+        } else if (preg_match('/^[0-9\.\-]+mm$/isU', $css)) {
1769
+        	$css = 1. * str_replace('mm', '', $css);
1770
+        } else if (preg_match('/^[0-9\.\-]+%$/isU', $css)) {
1771
+        	$css = 1. * $old * str_replace('%', '', $css) / 100.;
1772
+        } else {
1773
+        	$css = null;
1774
+        }
1591 1775
 
1592 1776
         return $css;
1593 1777
     }
@@ -1636,7 +1820,9 @@  discard block
 block discarded – undo
1636 1820
         $res = true;
1637 1821
 
1638 1822
         // if transparent => return null
1639
-        if (strtolower($css) == 'transparent') return array(null, null, null);
1823
+        if (strtolower($css) == 'transparent') {
1824
+        	return array(null, null, null);
1825
+        }
1640 1826
 
1641 1827
         // HTML color
1642 1828
         if (isset($this->_htmlColor[strtolower($css)])) {
@@ -1697,7 +1883,9 @@  discard block
 block discarded – undo
1697 1883
             $c = floatVal(substr($c, 0, -1)) / 100.;
1698 1884
         } else {
1699 1885
             $c = floatVal($c);
1700
-            if ($c > 1) $c = $c / 255.;
1886
+            if ($c > 1) {
1887
+            	$c = $c / 255.;
1888
+            }
1701 1889
         }
1702 1890
 
1703 1891
         return $c;
@@ -1751,13 +1939,16 @@  discard block
 block discarded – undo
1751 1939
                 $name = trim($name);
1752 1940
 
1753 1941
                 // if a selector with somethink lige :hover => continue
1754
-                if (strpos($name, ':') !== false) continue;
1942
+                if (strpos($name, ':') !== false) {
1943
+                	continue;
1944
+                }
1755 1945
 
1756 1946
                 // save the value
1757
-                if ( ! isset($this->css[$name]))
1758
-                    $this->css[$name] = $css;
1759
-                else
1760
-                    $this->css[$name] = array_merge($this->css[$name], $css);
1947
+                if ( ! isset($this->css[$name])) {
1948
+                                    $this->css[$name] = $css;
1949
+                } else {
1950
+                                    $this->css[$name] = array_merge($this->css[$name], $css);
1951
+                }
1761 1952
 
1762 1953
             }
1763 1954
         }
Please login to merge, or discard this patch.
astpp/application/libraries/html2pdf/_class/parsingHtml.class.php 3 patches
Doc Comments   +1 added lines patch added patch discarded remove patch
@@ -50,6 +50,7 @@
 block discarded – undo
50 50
      * Define the HTML code to parse
51 51
      *
52 52
      * @param   string HTML code
53
+     * @param string $html
53 54
      * @access  public
54 55
      */
55 56
     public function setHTML($html)
Please login to merge, or discard this patch.
Indentation   +518 added lines, -518 removed lines patch added patch discarded remove patch
@@ -11,524 +11,524 @@
 block discarded – undo
11 11
 
12 12
 class HTML2PDF_parsingHtml
13 13
 {
14
-    protected    $_html     = ''; // HTML code to parse
15
-    protected    $_num      = 0; // table number
16
-    protected    $_level    = 0; // table level
17
-    protected    $_encoding = ''; // encoding
18
-    public       $code      = array(); // parsed HTML codfe
19
-
20
-    const HTML_TAB = '        ';
21
-
22
-    /**
23
-     * main constructor
24
-     *
25
-     * @param   string encoding
26
-     * @access  public
27
-     */
28
-    public function __construct($encoding = 'UTF-8')
29
-    {
30
-        $this->_num   = 0;
31
-        $this->_level = array($this->_num);
32
-        $this->_html  = '';
33
-        $this->code = array();
34
-        $this->setEncoding($encoding);
35
-    }
36
-
37
-    /**
38
-     * change the encoding
39
-     *
40
-     * @param   string encoding
41
-     * @param string $encoding
42
-     * @access  public
43
-     */
44
-    public function setEncoding($encoding)
45
-    {
46
-        $this->_encoding = $encoding;
47
-    }
48
-
49
-    /**
50
-     * Define the HTML code to parse
51
-     *
52
-     * @param   string HTML code
53
-     * @access  public
54
-     */
55
-    public function setHTML($html)
56
-    {
57
-        // remove the HTML in comment
58
-        $html = preg_replace('/<!--(.*)-->/isU', '', $html);
59
-
60
-        // save the HTML code
61
-        $this->_html = $html;
62
-    }
63
-
64
-    /**
65
-     * parse the HTML code
66
-     *
67
-     * @access public
68
-     */
69
-    public function parse()
70
-    {
71
-        $parents = array();
72
-
73
-        // flag : are we in a <pre> Tag ?
74
-        $tagPreIn = false;
75
-
76
-        // action to use for each line of the content of a <pre> Tag
77
-        $tagPreBr = array(
78
-                    'name' => 'br',
79
-                    'close' => false,
80
-                    'param' => array(
81
-                        'style' => array(),
82
-                        'num'    => 0
83
-                    )
84
-                );
85
-
86
-        // tag that can be not closed
87
-        $tagsNotClosed = array(
88
-            'br', 'hr', 'img', 'col',
89
-            'input', 'link', 'option',
90
-            'circle', 'ellipse', 'path', 'rect', 'line', 'polygon', 'polyline'
91
-        );
92
-
93
-        // search the HTML tags
94
-        $tmp = array();
95
-        $this->_searchCode($tmp);
96
-
97
-        // all the actions to do
98
-        $actions = array();
99
-
100
-        // foreach part of the HTML code
101
-        foreach ($tmp as $part) {
102
-            // if it is a tag code
103
-            if ($part[0] == 'code') {
104
-                // analise the HTML code
105
-                $res = $this->_analiseCode($part[1]);
14
+	protected    $_html     = ''; // HTML code to parse
15
+	protected    $_num      = 0; // table number
16
+	protected    $_level    = 0; // table level
17
+	protected    $_encoding = ''; // encoding
18
+	public       $code      = array(); // parsed HTML codfe
19
+
20
+	const HTML_TAB = '        ';
21
+
22
+	/**
23
+	 * main constructor
24
+	 *
25
+	 * @param   string encoding
26
+	 * @access  public
27
+	 */
28
+	public function __construct($encoding = 'UTF-8')
29
+	{
30
+		$this->_num   = 0;
31
+		$this->_level = array($this->_num);
32
+		$this->_html  = '';
33
+		$this->code = array();
34
+		$this->setEncoding($encoding);
35
+	}
36
+
37
+	/**
38
+	 * change the encoding
39
+	 *
40
+	 * @param   string encoding
41
+	 * @param string $encoding
42
+	 * @access  public
43
+	 */
44
+	public function setEncoding($encoding)
45
+	{
46
+		$this->_encoding = $encoding;
47
+	}
48
+
49
+	/**
50
+	 * Define the HTML code to parse
51
+	 *
52
+	 * @param   string HTML code
53
+	 * @access  public
54
+	 */
55
+	public function setHTML($html)
56
+	{
57
+		// remove the HTML in comment
58
+		$html = preg_replace('/<!--(.*)-->/isU', '', $html);
59
+
60
+		// save the HTML code
61
+		$this->_html = $html;
62
+	}
63
+
64
+	/**
65
+	 * parse the HTML code
66
+	 *
67
+	 * @access public
68
+	 */
69
+	public function parse()
70
+	{
71
+		$parents = array();
72
+
73
+		// flag : are we in a <pre> Tag ?
74
+		$tagPreIn = false;
75
+
76
+		// action to use for each line of the content of a <pre> Tag
77
+		$tagPreBr = array(
78
+					'name' => 'br',
79
+					'close' => false,
80
+					'param' => array(
81
+						'style' => array(),
82
+						'num'    => 0
83
+					)
84
+				);
85
+
86
+		// tag that can be not closed
87
+		$tagsNotClosed = array(
88
+			'br', 'hr', 'img', 'col',
89
+			'input', 'link', 'option',
90
+			'circle', 'ellipse', 'path', 'rect', 'line', 'polygon', 'polyline'
91
+		);
92
+
93
+		// search the HTML tags
94
+		$tmp = array();
95
+		$this->_searchCode($tmp);
96
+
97
+		// all the actions to do
98
+		$actions = array();
99
+
100
+		// foreach part of the HTML code
101
+		foreach ($tmp as $part) {
102
+			// if it is a tag code
103
+			if ($part[0] == 'code') {
104
+				// analise the HTML code
105
+				$res = $this->_analiseCode($part[1]);
106 106
 
107 107
 //echo "<pre>"; print_r($tagsNotClosed); exit;                
108
-                // if it is a real HTML tag
109
-                if ($res) {
110
-                    // save the current posistion in the HTML code
111
-                    $res['html_pos'] = $part[2];
112
-
113
-                    // if the tag must be closed
114
-                    if ( ! in_array($res['name'], $tagsNotClosed)) {
115
-                        // if it is a closure tag
116
-                        if ($res['close']) {
117
-                            // HTML validation
118
-                            if (count($parents) < 1)
119
-                                throw new HTML2PDF_exception(3, $res['name'], $this->getHtmlErrorCode($res['html_pos']));
120
-                            else if ($parents[count($parents) - 1] != $res['name'])
121
-                                throw new HTML2PDF_exception(4, $parents, $this->getHtmlErrorCode($res['html_pos']));
122
-                            else
123
-                                unset($parents[count($parents) - 1]);
124
-                        } else {
125
-                            // if it is a autoclosed tag
126
-                            if ($res['autoclose']) {
127
-                                // save the opened tag
128
-                                $actions[] = $res;
129
-
130
-                                // prepare the closed tag
131
-                                $res['params'] = array();
132
-                                $res['close'] = true;
133
-                            }
134
-                            // else :add a child for validation
135
-                            else {
136
-                                                            $parents[count($parents)] = $res['name'];
137
-                            }
138
-                        }
139
-
140
-                        // if it is a <pre> tag (or <code> tag) not auclosed => update the flag
141
-                        if (($res['name'] == 'pre' || $res['name'] == 'code') && ! $res['autoclose']) {
142
-                            $tagPreIn = ! $res['close'];
143
-                        }
144
-                    }
145
-
146
-                    // save the actions to convert
147
-                    $actions[] = $res;
148
-                } else { // else (it is not a real HTML tag => we transform it in Texte
149
-                    $part[0] = 'txt';
150
-                }
151
-            }
152
-            // if it is text
153
-            if ($part[0] == 'txt') {
154
-                // if we are not in a <pre> tag
155
-                if ( ! $tagPreIn) {
156
-                    // save the action
157
-                    $actions[] = array(
158
-                        'name'    => 'write',
159
-                        'close'    => false,
160
-                        'param' => array('txt' => $this->_prepareTxt($part[1])),
161
-                    );
162
-                } else { // else (if we are in a <pre> tag)
163
-                    // prepare the text
164
-                    $part[1] = str_replace("\r", '', $part[1]);
165
-                    $part[1] = explode("\n", $part[1]);
166
-
167
-                    // foreach line of the text
168
-                    foreach ($part[1] as $k => $txt) {
169
-                        // transform the line
170
-                        $txt = str_replace("\t", self::HTML_TAB, $txt);
171
-                        $txt = str_replace(' ', '&nbsp;', $txt);
172
-
173
-                        // add a break line
174
-                        if ($k > 0) $actions[] = $tagPreBr;
175
-
176
-                        // save the action
177
-                        $actions[] = array(
178
-                            'name'    => 'write',
179
-                            'close'    => false,
180
-                            'param' => array('txt' => $this->_prepareTxt($txt, false)),
181
-                        );
182
-                    }
183
-                }
184
-            }
185
-        }
186
-
187
-        // for each indentified action, we have to clean up the begin and the end of the texte
188
-        // based on tags that surround it
189
-
190
-        // list of the tags to clean
191
-        $tagsToClean = array(
192
-            'page', 'page_header', 'page_footer', 'form',
193
-            'table', 'thead', 'tfoot', 'tr', 'td', 'th', 'br',
194
-            'div', 'hr', 'p', 'ul', 'ol', 'li',
195
-            'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
196
-            'bookmark', 'fieldset', 'legend',
197
-            'draw', 'circle', 'ellipse', 'path', 'rect', 'line', 'g', 'polygon', 'polyline',
198
-            'option'
199
-        );
200
-
201
-        // foreach action
202
-        $nb = count($actions);
203
-        for ($k = 0; $k < $nb; $k++) {
204
-            // if it is a Text
205
-            if ($actions[$k]['name'] == 'write') {
206
-                // if the tag before the text is a tag to clean => ltrim on the text
207
-                if ($k > 0 && in_array($actions[$k - 1]['name'], $tagsToClean))
208
-                    $actions[$k]['param']['txt'] = ltrim($actions[$k]['param']['txt']);
209
-
210
-                // if the tag after the text is a tag to clean => rtrim on the text
211
-                if ($k < $nb - 1 && in_array($actions[$k + 1]['name'], $tagsToClean))
212
-                    $actions[$k]['param']['txt'] = rtrim($actions[$k]['param']['txt']);
213
-
214
-                // if the text is empty => remove the action
215
-                if ( ! strlen($actions[$k]['param']['txt']))
216
-                    unset($actions[$k]);
217
-            }
218
-        }
219
-
220
-        // if we are not on the level 0 => HTML validator ERROR
221
-        if (count($parents)) throw new HTML2PDF_exception(5, $parents);
222
-
223
-        // save the actions to do
224
-        $this->code = array_values($actions);
225
-    }
226
-
227
-    /**
228
-     * prepare the text
229
-     *
230
-     * @param   string texte
231
-     * @param   boolean true => replace multiple space+\t+\r+\n by a single space
232
-     * @return  string texte
233
-     * @access  protected
234
-     */
235
-    protected function _prepareTxt($txt, $spaces = true)
236
-    {
237
-        if ($spaces) {
238
-        	$txt = preg_replace('/\s+/is', ' ', $txt);
239
-        }
240
-        $txt = str_replace('&euro;', '€', $txt);
241
-        $txt = html_entity_decode($txt, ENT_QUOTES, $this->_encoding);
242
-        return $txt;
243
-    }
244
-
245
-    /**
246
-     * parse the HTML code
247
-     *
248
-     * @param    &array    array's result
249
-     * @return   null
250
-     */
251
-    protected function _searchCode(&$tmp)
252
-    {
253
-        // initialise the array
254
-        $tmp = array();
255
-
256
-        // regexp to separate the tags from the texts
257
-        $reg = '/(<[^>]+>)|([^<]+)+/isU';
258
-
259
-        // last match found
260
-        $str = '';
261
-        $offset = 0;
262
-
263
-        // As it finds a match
264
-        while (preg_match($reg, $this->_html, $parse, PREG_OFFSET_CAPTURE, $offset)) {
265
-            // if it is a tag
266
-            if ($parse[1][0]) {
267
-                // save the previous text if it exists
268
-                if ($str !== '')    $tmp[] = array('txt', $str);
269
-
270
-                // save the tag, with the offset
271
-                $tmp[] = array('code', trim($parse[1][0]), $offset);
272
-
273
-                // init the current text
274
-                $str = '';
275
-            } else { // else (if it is a text)
276
-                // add the new text to the current text
277
-                $str .= $parse[2][0];
278
-            }
279
-
280
-            // Update offset to the end of the match
281
-            $offset = $parse[0][1] + strlen($parse[0][0]);
282
-            unset($parse);
283
-        }
284
-        // if a text is present in the end, we save it
285
-        if ($str != '') $tmp[] = array('txt', $str);
286
-        unset($str);
287
-    }
288
-
289
-    /**
290
-     * analise a HTML tag
291
-     *
292
-     * @param   string   HTML code to analise
293
-     * @return  array    corresponding action
294
-     */
295
-    protected function _analiseCode($code)
296
-    {
297
-        // name of the tag, opening, closure, autoclosure
298
-        $tag = '<([\/]{0,1})([_a-z0-9]+)([\/>\s]+)';
299
-        if ( ! preg_match('/'.$tag.'/isU', $code, $match)) return null;
300
-        $close     = ($match[1] == '/' ? true : false);
301
-        $autoclose = preg_match('/\/>$/isU', $code);
302
-        $name      = strtolower($match[2]);
303
-
304
-        // required parameters (depends on the tag name)
305
-        $param = array();
306
-        $param['style'] = '';
307
-        if ($name == 'img') {
308
-            $param['alt'] = '';
309
-            $param['src'] = '';
310
-        }
311
-        if ($name == 'a') {
312
-            $param['href'] = '';
313
-        }
314
-
315
-        // read the parameters : nom=valeur
316
-        $prop = '([a-zA-Z0-9_]+)=([^"\'\s>]+)';
317
-        preg_match_all('/'.$prop.'/is', $code, $match);
318
-        for ($k = 0; $k < count($match[0]); $k++)
319
-            $param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
320
-
321
-        // read the parameters : nom="valeur"
322
-        $prop = '([a-zA-Z0-9_]+)=["]([^"]*)["]';
323
-        preg_match_all('/'.$prop.'/is', $code, $match);
324
-        for ($k = 0; $k < count($match[0]); $k++)
325
-            $param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
326
-
327
-        // read the parameters : nom='valeur'
328
-        $prop = "([a-zA-Z0-9_]+)=[']([^']*)[']";
329
-        preg_match_all('/'.$prop.'/is', $code, $match);
330
-        for ($k = 0; $k < count($match[0]); $k++)
331
-            $param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
332
-
333
-        // compliance of each parameter
334
-        $color  = "#000000";
335
-        $border = null;
336
-        foreach ($param as $key => $val) {
337
-            $key = strtolower($key);
338
-            switch ($key)
339
-            {
340
-                case 'width':
341
-                    unset($param[$key]);
342
-                    $param['style'] .= 'width: '.$val.'px; ';
343
-                    break;
344
-
345
-                case 'align':
346
-                    if ($name === 'img') {
347
-                        unset($param[$key]);
348
-                        $param['style'] .= 'float: '.$val.'; ';
349
-                    } elseif ($name !== 'table') {
350
-                        unset($param[$key]);
351
-                        $param['style'] .= 'text-align: '.$val.'; ';
352
-                    }
353
-                    break;
354
-
355
-                case 'valign':
356
-                    unset($param[$key]);
357
-                    $param['style'] .= 'vertical-align: '.$val.'; ';
358
-                    break;
359
-
360
-                case 'height':
361
-                    unset($param[$key]);
362
-                    $param['style'] .= 'height: '.$val.'px; ';
363
-                    break;
364
-
365
-                case 'bgcolor':
366
-                    unset($param[$key]);
367
-                    $param['style'] .= 'background: '.$val.'; ';
368
-                    break;
369
-
370
-                case 'bordercolor':
371
-                    unset($param[$key]);
372
-                    $color = $val;
373
-                    break;
374
-
375
-                case 'border':
376
-                    unset($param[$key]);
377
-                    if (preg_match('/^[0-9]+$/isU', $val)) $val = $val.'px';
378
-                    $border = $val;
379
-                    break;
380
-
381
-                case 'cellpadding':
382
-                case 'cellspacing':
383
-                    if (preg_match('/^([0-9]+)$/isU', $val)) $param[$key] = $val.'px';
384
-                    break;
385
-
386
-                case 'colspan':
387
-                case 'rowspan':
388
-                    $val = preg_replace('/[^0-9]/isU', '', $val);
389
-                    if ( ! $val) $val = 1;
390
-                    $param[$key] = $val;
391
-                    break;
392
-            }
393
-        }
394
-
395
-        // compliance of the border
396
-        if ($border !== null) {
397
-            if ($border)    $border = 'border: solid '.$border.' '.$color;
398
-            else            $border = 'border: none';
399
-
400
-            $param['style'] .= $border.'; ';
401
-            $param['border'] = $border;
402
-        }
403
-
404
-        // reading styles: decomposition and standardization
405
-        $styles = explode(';', $param['style']);
406
-        $param['style'] = array();
407
-        foreach ($styles as $style) {
408
-            $tmp = explode(':', $style);
409
-            if (count($tmp) > 1) {
410
-                $cod = $tmp[0];
411
-                unset($tmp[0]);
412
-                $tmp = implode(':', $tmp);
413
-                $param['style'][trim(strtolower($cod))] = preg_replace('/[\s]+/isU', ' ', trim($tmp));
414
-            }
415
-        }
416
-
417
-        // determining the level of table opening, with an added level
418
-        if (in_array($name, array('ul', 'ol', 'table')) && ! $close) {
419
-            $this->_num++;
420
-            $this->_level[count($this->_level)] = $this->_num;
421
-        }
422
-
423
-        // get the level of the table containing the element
424
-        if ( ! isset($param['num'])) {
425
-            $param['num'] = $this->_level[count($this->_level) - 1];
426
-        }
427
-
428
-        // for closures table: remove a level
429
-        if (in_array($name, array('ul', 'ol', 'table')) && $close) {
430
-            unset($this->_level[count($this->_level) - 1]);
431
-        }
432
-
433
-        // prepare the parameters
434
-        if (isset($param['value'])) {
435
-        	$param['value']  = $this->_prepareTxt($param['value']);
436
-        }
437
-        if (isset($param['alt'])) {
438
-        	$param['alt']    = $this->_prepareTxt($param['alt']);
439
-        }
440
-        if (isset($param['title'])) {
441
-        	$param['title']  = $this->_prepareTxt($param['title']);
442
-        }
443
-        if (isset($param['class'])) {
444
-        	$param['class']  = $this->_prepareTxt($param['class']);
445
-        }
446
-
447
-        // return the new action to do
448
-        return array('name' => $name, 'close' => $close ? 1 : 0, 'autoclose' => $autoclose, 'param' => $param);
449
-    }
450
-
451
-    /**
452
-     * get a full level of HTML, between an opening and closing corresponding
453
-     *
454
-     * @param   integer key
455
-     * @param integer $k
456
-     * @return  array   actions
457
-     */
458
-    public function getLevel($k)
459
-    {
460
-        // if the code does not exist => return empty
461
-        if ( ! isset($this->code[$k])) return array();
462
-
463
-        // the tag to detect
464
-        $detect = $this->code[$k]['name'];
465
-
466
-        // if it is a text => return
467
-        if ($detect == 'write') {
468
-            return array($this->code[$k]);
469
-        }
470
-
471
-        //
472
-        $level = 0; // depth level
473
-        $end = false; // end of the search
474
-        $code = array(); // extract code
475
-
476
-        // while it's not ended
477
-        while ( ! $end) {
478
-            // current action
479
-            $row = $this->code[$k];
480
-
481
-            // if 'write' => we add the text
482
-            if ($row['name'] == 'write') {
483
-                $code[] = $row;
484
-            } else { // else, it is a html tag
485
-                $not = false; // flag for not taking into account the current tag
486
-
487
-                // if it is the searched tag
488
-                if ($row['name'] == $detect) {
489
-                    // if we are just at the root level => dont take it
490
-                    if ($level == 0) {
491
-                        $not = true;
492
-                    }
493
-
494
-                    // update the level
495
-                    $level += ($row['close'] ? -1 : 1);
496
-
497
-                    // if we are now at the root level => it is the end, and dont take it
498
-                    if ($level == 0) {
499
-                        $not = true;
500
-                        $end = true;
501
-                    }
502
-                }
503
-
504
-                // if we can takin into account the current tag => save it
505
-                if ( ! $not) {
506
-                    if (isset($row['style']['text-align'])) unset($row['style']['text-align']);
507
-                    $code[] = $row;
508
-                }
509
-            }
510
-
511
-            // it continues as long as there has code to analise
512
-            if (isset($this->code[$k + 1]))
513
-                $k++;
514
-            else
515
-                $end = true;
516
-        }
517
-
518
-        // return the extract
519
-        return $code;
520
-    }
521
-
522
-    /**
523
-     * return a part of the HTML code, for error message
524
-     *
525
-     * @param   integer position
526
-     * @param   integer take before
527
-     * @param   integer take after
528
-     * @return  string  part of the html code
529
-     */
530
-    public function getHtmlErrorCode($pos, $before = 30, $after = 40)
531
-    {
532
-        return substr($this->_html, $pos - $before, $before + $after);
533
-    }
108
+				// if it is a real HTML tag
109
+				if ($res) {
110
+					// save the current posistion in the HTML code
111
+					$res['html_pos'] = $part[2];
112
+
113
+					// if the tag must be closed
114
+					if ( ! in_array($res['name'], $tagsNotClosed)) {
115
+						// if it is a closure tag
116
+						if ($res['close']) {
117
+							// HTML validation
118
+							if (count($parents) < 1)
119
+								throw new HTML2PDF_exception(3, $res['name'], $this->getHtmlErrorCode($res['html_pos']));
120
+							else if ($parents[count($parents) - 1] != $res['name'])
121
+								throw new HTML2PDF_exception(4, $parents, $this->getHtmlErrorCode($res['html_pos']));
122
+							else
123
+								unset($parents[count($parents) - 1]);
124
+						} else {
125
+							// if it is a autoclosed tag
126
+							if ($res['autoclose']) {
127
+								// save the opened tag
128
+								$actions[] = $res;
129
+
130
+								// prepare the closed tag
131
+								$res['params'] = array();
132
+								$res['close'] = true;
133
+							}
134
+							// else :add a child for validation
135
+							else {
136
+															$parents[count($parents)] = $res['name'];
137
+							}
138
+						}
139
+
140
+						// if it is a <pre> tag (or <code> tag) not auclosed => update the flag
141
+						if (($res['name'] == 'pre' || $res['name'] == 'code') && ! $res['autoclose']) {
142
+							$tagPreIn = ! $res['close'];
143
+						}
144
+					}
145
+
146
+					// save the actions to convert
147
+					$actions[] = $res;
148
+				} else { // else (it is not a real HTML tag => we transform it in Texte
149
+					$part[0] = 'txt';
150
+				}
151
+			}
152
+			// if it is text
153
+			if ($part[0] == 'txt') {
154
+				// if we are not in a <pre> tag
155
+				if ( ! $tagPreIn) {
156
+					// save the action
157
+					$actions[] = array(
158
+						'name'    => 'write',
159
+						'close'    => false,
160
+						'param' => array('txt' => $this->_prepareTxt($part[1])),
161
+					);
162
+				} else { // else (if we are in a <pre> tag)
163
+					// prepare the text
164
+					$part[1] = str_replace("\r", '', $part[1]);
165
+					$part[1] = explode("\n", $part[1]);
166
+
167
+					// foreach line of the text
168
+					foreach ($part[1] as $k => $txt) {
169
+						// transform the line
170
+						$txt = str_replace("\t", self::HTML_TAB, $txt);
171
+						$txt = str_replace(' ', '&nbsp;', $txt);
172
+
173
+						// add a break line
174
+						if ($k > 0) $actions[] = $tagPreBr;
175
+
176
+						// save the action
177
+						$actions[] = array(
178
+							'name'    => 'write',
179
+							'close'    => false,
180
+							'param' => array('txt' => $this->_prepareTxt($txt, false)),
181
+						);
182
+					}
183
+				}
184
+			}
185
+		}
186
+
187
+		// for each indentified action, we have to clean up the begin and the end of the texte
188
+		// based on tags that surround it
189
+
190
+		// list of the tags to clean
191
+		$tagsToClean = array(
192
+			'page', 'page_header', 'page_footer', 'form',
193
+			'table', 'thead', 'tfoot', 'tr', 'td', 'th', 'br',
194
+			'div', 'hr', 'p', 'ul', 'ol', 'li',
195
+			'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
196
+			'bookmark', 'fieldset', 'legend',
197
+			'draw', 'circle', 'ellipse', 'path', 'rect', 'line', 'g', 'polygon', 'polyline',
198
+			'option'
199
+		);
200
+
201
+		// foreach action
202
+		$nb = count($actions);
203
+		for ($k = 0; $k < $nb; $k++) {
204
+			// if it is a Text
205
+			if ($actions[$k]['name'] == 'write') {
206
+				// if the tag before the text is a tag to clean => ltrim on the text
207
+				if ($k > 0 && in_array($actions[$k - 1]['name'], $tagsToClean))
208
+					$actions[$k]['param']['txt'] = ltrim($actions[$k]['param']['txt']);
209
+
210
+				// if the tag after the text is a tag to clean => rtrim on the text
211
+				if ($k < $nb - 1 && in_array($actions[$k + 1]['name'], $tagsToClean))
212
+					$actions[$k]['param']['txt'] = rtrim($actions[$k]['param']['txt']);
213
+
214
+				// if the text is empty => remove the action
215
+				if ( ! strlen($actions[$k]['param']['txt']))
216
+					unset($actions[$k]);
217
+			}
218
+		}
219
+
220
+		// if we are not on the level 0 => HTML validator ERROR
221
+		if (count($parents)) throw new HTML2PDF_exception(5, $parents);
222
+
223
+		// save the actions to do
224
+		$this->code = array_values($actions);
225
+	}
226
+
227
+	/**
228
+	 * prepare the text
229
+	 *
230
+	 * @param   string texte
231
+	 * @param   boolean true => replace multiple space+\t+\r+\n by a single space
232
+	 * @return  string texte
233
+	 * @access  protected
234
+	 */
235
+	protected function _prepareTxt($txt, $spaces = true)
236
+	{
237
+		if ($spaces) {
238
+			$txt = preg_replace('/\s+/is', ' ', $txt);
239
+		}
240
+		$txt = str_replace('&euro;', '€', $txt);
241
+		$txt = html_entity_decode($txt, ENT_QUOTES, $this->_encoding);
242
+		return $txt;
243
+	}
244
+
245
+	/**
246
+	 * parse the HTML code
247
+	 *
248
+	 * @param    &array    array's result
249
+	 * @return   null
250
+	 */
251
+	protected function _searchCode(&$tmp)
252
+	{
253
+		// initialise the array
254
+		$tmp = array();
255
+
256
+		// regexp to separate the tags from the texts
257
+		$reg = '/(<[^>]+>)|([^<]+)+/isU';
258
+
259
+		// last match found
260
+		$str = '';
261
+		$offset = 0;
262
+
263
+		// As it finds a match
264
+		while (preg_match($reg, $this->_html, $parse, PREG_OFFSET_CAPTURE, $offset)) {
265
+			// if it is a tag
266
+			if ($parse[1][0]) {
267
+				// save the previous text if it exists
268
+				if ($str !== '')    $tmp[] = array('txt', $str);
269
+
270
+				// save the tag, with the offset
271
+				$tmp[] = array('code', trim($parse[1][0]), $offset);
272
+
273
+				// init the current text
274
+				$str = '';
275
+			} else { // else (if it is a text)
276
+				// add the new text to the current text
277
+				$str .= $parse[2][0];
278
+			}
279
+
280
+			// Update offset to the end of the match
281
+			$offset = $parse[0][1] + strlen($parse[0][0]);
282
+			unset($parse);
283
+		}
284
+		// if a text is present in the end, we save it
285
+		if ($str != '') $tmp[] = array('txt', $str);
286
+		unset($str);
287
+	}
288
+
289
+	/**
290
+	 * analise a HTML tag
291
+	 *
292
+	 * @param   string   HTML code to analise
293
+	 * @return  array    corresponding action
294
+	 */
295
+	protected function _analiseCode($code)
296
+	{
297
+		// name of the tag, opening, closure, autoclosure
298
+		$tag = '<([\/]{0,1})([_a-z0-9]+)([\/>\s]+)';
299
+		if ( ! preg_match('/'.$tag.'/isU', $code, $match)) return null;
300
+		$close     = ($match[1] == '/' ? true : false);
301
+		$autoclose = preg_match('/\/>$/isU', $code);
302
+		$name      = strtolower($match[2]);
303
+
304
+		// required parameters (depends on the tag name)
305
+		$param = array();
306
+		$param['style'] = '';
307
+		if ($name == 'img') {
308
+			$param['alt'] = '';
309
+			$param['src'] = '';
310
+		}
311
+		if ($name == 'a') {
312
+			$param['href'] = '';
313
+		}
314
+
315
+		// read the parameters : nom=valeur
316
+		$prop = '([a-zA-Z0-9_]+)=([^"\'\s>]+)';
317
+		preg_match_all('/'.$prop.'/is', $code, $match);
318
+		for ($k = 0; $k < count($match[0]); $k++)
319
+			$param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
320
+
321
+		// read the parameters : nom="valeur"
322
+		$prop = '([a-zA-Z0-9_]+)=["]([^"]*)["]';
323
+		preg_match_all('/'.$prop.'/is', $code, $match);
324
+		for ($k = 0; $k < count($match[0]); $k++)
325
+			$param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
326
+
327
+		// read the parameters : nom='valeur'
328
+		$prop = "([a-zA-Z0-9_]+)=[']([^']*)[']";
329
+		preg_match_all('/'.$prop.'/is', $code, $match);
330
+		for ($k = 0; $k < count($match[0]); $k++)
331
+			$param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
332
+
333
+		// compliance of each parameter
334
+		$color  = "#000000";
335
+		$border = null;
336
+		foreach ($param as $key => $val) {
337
+			$key = strtolower($key);
338
+			switch ($key)
339
+			{
340
+				case 'width':
341
+					unset($param[$key]);
342
+					$param['style'] .= 'width: '.$val.'px; ';
343
+					break;
344
+
345
+				case 'align':
346
+					if ($name === 'img') {
347
+						unset($param[$key]);
348
+						$param['style'] .= 'float: '.$val.'; ';
349
+					} elseif ($name !== 'table') {
350
+						unset($param[$key]);
351
+						$param['style'] .= 'text-align: '.$val.'; ';
352
+					}
353
+					break;
354
+
355
+				case 'valign':
356
+					unset($param[$key]);
357
+					$param['style'] .= 'vertical-align: '.$val.'; ';
358
+					break;
359
+
360
+				case 'height':
361
+					unset($param[$key]);
362
+					$param['style'] .= 'height: '.$val.'px; ';
363
+					break;
364
+
365
+				case 'bgcolor':
366
+					unset($param[$key]);
367
+					$param['style'] .= 'background: '.$val.'; ';
368
+					break;
369
+
370
+				case 'bordercolor':
371
+					unset($param[$key]);
372
+					$color = $val;
373
+					break;
374
+
375
+				case 'border':
376
+					unset($param[$key]);
377
+					if (preg_match('/^[0-9]+$/isU', $val)) $val = $val.'px';
378
+					$border = $val;
379
+					break;
380
+
381
+				case 'cellpadding':
382
+				case 'cellspacing':
383
+					if (preg_match('/^([0-9]+)$/isU', $val)) $param[$key] = $val.'px';
384
+					break;
385
+
386
+				case 'colspan':
387
+				case 'rowspan':
388
+					$val = preg_replace('/[^0-9]/isU', '', $val);
389
+					if ( ! $val) $val = 1;
390
+					$param[$key] = $val;
391
+					break;
392
+			}
393
+		}
394
+
395
+		// compliance of the border
396
+		if ($border !== null) {
397
+			if ($border)    $border = 'border: solid '.$border.' '.$color;
398
+			else            $border = 'border: none';
399
+
400
+			$param['style'] .= $border.'; ';
401
+			$param['border'] = $border;
402
+		}
403
+
404
+		// reading styles: decomposition and standardization
405
+		$styles = explode(';', $param['style']);
406
+		$param['style'] = array();
407
+		foreach ($styles as $style) {
408
+			$tmp = explode(':', $style);
409
+			if (count($tmp) > 1) {
410
+				$cod = $tmp[0];
411
+				unset($tmp[0]);
412
+				$tmp = implode(':', $tmp);
413
+				$param['style'][trim(strtolower($cod))] = preg_replace('/[\s]+/isU', ' ', trim($tmp));
414
+			}
415
+		}
416
+
417
+		// determining the level of table opening, with an added level
418
+		if (in_array($name, array('ul', 'ol', 'table')) && ! $close) {
419
+			$this->_num++;
420
+			$this->_level[count($this->_level)] = $this->_num;
421
+		}
422
+
423
+		// get the level of the table containing the element
424
+		if ( ! isset($param['num'])) {
425
+			$param['num'] = $this->_level[count($this->_level) - 1];
426
+		}
427
+
428
+		// for closures table: remove a level
429
+		if (in_array($name, array('ul', 'ol', 'table')) && $close) {
430
+			unset($this->_level[count($this->_level) - 1]);
431
+		}
432
+
433
+		// prepare the parameters
434
+		if (isset($param['value'])) {
435
+			$param['value']  = $this->_prepareTxt($param['value']);
436
+		}
437
+		if (isset($param['alt'])) {
438
+			$param['alt']    = $this->_prepareTxt($param['alt']);
439
+		}
440
+		if (isset($param['title'])) {
441
+			$param['title']  = $this->_prepareTxt($param['title']);
442
+		}
443
+		if (isset($param['class'])) {
444
+			$param['class']  = $this->_prepareTxt($param['class']);
445
+		}
446
+
447
+		// return the new action to do
448
+		return array('name' => $name, 'close' => $close ? 1 : 0, 'autoclose' => $autoclose, 'param' => $param);
449
+	}
450
+
451
+	/**
452
+	 * get a full level of HTML, between an opening and closing corresponding
453
+	 *
454
+	 * @param   integer key
455
+	 * @param integer $k
456
+	 * @return  array   actions
457
+	 */
458
+	public function getLevel($k)
459
+	{
460
+		// if the code does not exist => return empty
461
+		if ( ! isset($this->code[$k])) return array();
462
+
463
+		// the tag to detect
464
+		$detect = $this->code[$k]['name'];
465
+
466
+		// if it is a text => return
467
+		if ($detect == 'write') {
468
+			return array($this->code[$k]);
469
+		}
470
+
471
+		//
472
+		$level = 0; // depth level
473
+		$end = false; // end of the search
474
+		$code = array(); // extract code
475
+
476
+		// while it's not ended
477
+		while ( ! $end) {
478
+			// current action
479
+			$row = $this->code[$k];
480
+
481
+			// if 'write' => we add the text
482
+			if ($row['name'] == 'write') {
483
+				$code[] = $row;
484
+			} else { // else, it is a html tag
485
+				$not = false; // flag for not taking into account the current tag
486
+
487
+				// if it is the searched tag
488
+				if ($row['name'] == $detect) {
489
+					// if we are just at the root level => dont take it
490
+					if ($level == 0) {
491
+						$not = true;
492
+					}
493
+
494
+					// update the level
495
+					$level += ($row['close'] ? -1 : 1);
496
+
497
+					// if we are now at the root level => it is the end, and dont take it
498
+					if ($level == 0) {
499
+						$not = true;
500
+						$end = true;
501
+					}
502
+				}
503
+
504
+				// if we can takin into account the current tag => save it
505
+				if ( ! $not) {
506
+					if (isset($row['style']['text-align'])) unset($row['style']['text-align']);
507
+					$code[] = $row;
508
+				}
509
+			}
510
+
511
+			// it continues as long as there has code to analise
512
+			if (isset($this->code[$k + 1]))
513
+				$k++;
514
+			else
515
+				$end = true;
516
+		}
517
+
518
+		// return the extract
519
+		return $code;
520
+	}
521
+
522
+	/**
523
+	 * return a part of the HTML code, for error message
524
+	 *
525
+	 * @param   integer position
526
+	 * @param   integer take before
527
+	 * @param   integer take after
528
+	 * @return  string  part of the html code
529
+	 */
530
+	public function getHtmlErrorCode($pos, $before = 30, $after = 40)
531
+	{
532
+		return substr($this->_html, $pos - $before, $before + $after);
533
+	}
534 534
 }
Please login to merge, or discard this patch.
Braces   +65 added lines, -34 removed lines patch added patch discarded remove patch
@@ -115,12 +115,13 @@  discard block
 block discarded – undo
115 115
                         // if it is a closure tag
116 116
                         if ($res['close']) {
117 117
                             // HTML validation
118
-                            if (count($parents) < 1)
119
-                                throw new HTML2PDF_exception(3, $res['name'], $this->getHtmlErrorCode($res['html_pos']));
120
-                            else if ($parents[count($parents) - 1] != $res['name'])
121
-                                throw new HTML2PDF_exception(4, $parents, $this->getHtmlErrorCode($res['html_pos']));
122
-                            else
123
-                                unset($parents[count($parents) - 1]);
118
+                            if (count($parents) < 1) {
119
+                                                            throw new HTML2PDF_exception(3, $res['name'], $this->getHtmlErrorCode($res['html_pos']));
120
+                            } else if ($parents[count($parents) - 1] != $res['name']) {
121
+                                                            throw new HTML2PDF_exception(4, $parents, $this->getHtmlErrorCode($res['html_pos']));
122
+                            } else {
123
+                                                            unset($parents[count($parents) - 1]);
124
+                            }
124 125
                         } else {
125 126
                             // if it is a autoclosed tag
126 127
                             if ($res['autoclose']) {
@@ -171,7 +172,9 @@  discard block
 block discarded – undo
171 172
                         $txt = str_replace(' ', '&nbsp;', $txt);
172 173
 
173 174
                         // add a break line
174
-                        if ($k > 0) $actions[] = $tagPreBr;
175
+                        if ($k > 0) {
176
+                        	$actions[] = $tagPreBr;
177
+                        }
175 178
 
176 179
                         // save the action
177 180
                         $actions[] = array(
@@ -204,21 +207,26 @@  discard block
 block discarded – undo
204 207
             // if it is a Text
205 208
             if ($actions[$k]['name'] == 'write') {
206 209
                 // if the tag before the text is a tag to clean => ltrim on the text
207
-                if ($k > 0 && in_array($actions[$k - 1]['name'], $tagsToClean))
208
-                    $actions[$k]['param']['txt'] = ltrim($actions[$k]['param']['txt']);
210
+                if ($k > 0 && in_array($actions[$k - 1]['name'], $tagsToClean)) {
211
+                                    $actions[$k]['param']['txt'] = ltrim($actions[$k]['param']['txt']);
212
+                }
209 213
 
210 214
                 // if the tag after the text is a tag to clean => rtrim on the text
211
-                if ($k < $nb - 1 && in_array($actions[$k + 1]['name'], $tagsToClean))
212
-                    $actions[$k]['param']['txt'] = rtrim($actions[$k]['param']['txt']);
215
+                if ($k < $nb - 1 && in_array($actions[$k + 1]['name'], $tagsToClean)) {
216
+                                    $actions[$k]['param']['txt'] = rtrim($actions[$k]['param']['txt']);
217
+                }
213 218
 
214 219
                 // if the text is empty => remove the action
215
-                if ( ! strlen($actions[$k]['param']['txt']))
216
-                    unset($actions[$k]);
220
+                if ( ! strlen($actions[$k]['param']['txt'])) {
221
+                                    unset($actions[$k]);
222
+                }
217 223
             }
218 224
         }
219 225
 
220 226
         // if we are not on the level 0 => HTML validator ERROR
221
-        if (count($parents)) throw new HTML2PDF_exception(5, $parents);
227
+        if (count($parents)) {
228
+        	throw new HTML2PDF_exception(5, $parents);
229
+        }
222 230
 
223 231
         // save the actions to do
224 232
         $this->code = array_values($actions);
@@ -265,7 +273,9 @@  discard block
 block discarded – undo
265 273
             // if it is a tag
266 274
             if ($parse[1][0]) {
267 275
                 // save the previous text if it exists
268
-                if ($str !== '')    $tmp[] = array('txt', $str);
276
+                if ($str !== '') {
277
+                	$tmp[] = array('txt', $str);
278
+                }
269 279
 
270 280
                 // save the tag, with the offset
271 281
                 $tmp[] = array('code', trim($parse[1][0]), $offset);
@@ -282,7 +292,9 @@  discard block
 block discarded – undo
282 292
             unset($parse);
283 293
         }
284 294
         // if a text is present in the end, we save it
285
-        if ($str != '') $tmp[] = array('txt', $str);
295
+        if ($str != '') {
296
+        	$tmp[] = array('txt', $str);
297
+        }
286 298
         unset($str);
287 299
     }
288 300
 
@@ -296,7 +308,9 @@  discard block
 block discarded – undo
296 308
     {
297 309
         // name of the tag, opening, closure, autoclosure
298 310
         $tag = '<([\/]{0,1})([_a-z0-9]+)([\/>\s]+)';
299
-        if ( ! preg_match('/'.$tag.'/isU', $code, $match)) return null;
311
+        if ( ! preg_match('/'.$tag.'/isU', $code, $match)) {
312
+        	return null;
313
+        }
300 314
         $close     = ($match[1] == '/' ? true : false);
301 315
         $autoclose = preg_match('/\/>$/isU', $code);
302 316
         $name      = strtolower($match[2]);
@@ -315,20 +329,23 @@  discard block
 block discarded – undo
315 329
         // read the parameters : nom=valeur
316 330
         $prop = '([a-zA-Z0-9_]+)=([^"\'\s>]+)';
317 331
         preg_match_all('/'.$prop.'/is', $code, $match);
318
-        for ($k = 0; $k < count($match[0]); $k++)
319
-            $param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
332
+        for ($k = 0; $k < count($match[0]); $k++) {
333
+                    $param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
334
+        }
320 335
 
321 336
         // read the parameters : nom="valeur"
322 337
         $prop = '([a-zA-Z0-9_]+)=["]([^"]*)["]';
323 338
         preg_match_all('/'.$prop.'/is', $code, $match);
324
-        for ($k = 0; $k < count($match[0]); $k++)
325
-            $param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
339
+        for ($k = 0; $k < count($match[0]); $k++) {
340
+                    $param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
341
+        }
326 342
 
327 343
         // read the parameters : nom='valeur'
328 344
         $prop = "([a-zA-Z0-9_]+)=[']([^']*)[']";
329 345
         preg_match_all('/'.$prop.'/is', $code, $match);
330
-        for ($k = 0; $k < count($match[0]); $k++)
331
-            $param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
346
+        for ($k = 0; $k < count($match[0]); $k++) {
347
+                    $param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]);
348
+        }
332 349
 
333 350
         // compliance of each parameter
334 351
         $color  = "#000000";
@@ -374,19 +391,25 @@  discard block
 block discarded – undo
374 391
 
375 392
                 case 'border':
376 393
                     unset($param[$key]);
377
-                    if (preg_match('/^[0-9]+$/isU', $val)) $val = $val.'px';
394
+                    if (preg_match('/^[0-9]+$/isU', $val)) {
395
+                    	$val = $val.'px';
396
+                    }
378 397
                     $border = $val;
379 398
                     break;
380 399
 
381 400
                 case 'cellpadding':
382 401
                 case 'cellspacing':
383
-                    if (preg_match('/^([0-9]+)$/isU', $val)) $param[$key] = $val.'px';
402
+                    if (preg_match('/^([0-9]+)$/isU', $val)) {
403
+                    	$param[$key] = $val.'px';
404
+                    }
384 405
                     break;
385 406
 
386 407
                 case 'colspan':
387 408
                 case 'rowspan':
388 409
                     $val = preg_replace('/[^0-9]/isU', '', $val);
389
-                    if ( ! $val) $val = 1;
410
+                    if ( ! $val) {
411
+                    	$val = 1;
412
+                    }
390 413
                     $param[$key] = $val;
391 414
                     break;
392 415
             }
@@ -394,8 +417,11 @@  discard block
 block discarded – undo
394 417
 
395 418
         // compliance of the border
396 419
         if ($border !== null) {
397
-            if ($border)    $border = 'border: solid '.$border.' '.$color;
398
-            else            $border = 'border: none';
420
+            if ($border) {
421
+            	$border = 'border: solid '.$border.' '.$color;
422
+            } else {
423
+            	$border = 'border: none';
424
+            }
399 425
 
400 426
             $param['style'] .= $border.'; ';
401 427
             $param['border'] = $border;
@@ -458,7 +484,9 @@  discard block
 block discarded – undo
458 484
     public function getLevel($k)
459 485
     {
460 486
         // if the code does not exist => return empty
461
-        if ( ! isset($this->code[$k])) return array();
487
+        if ( ! isset($this->code[$k])) {
488
+        	return array();
489
+        }
462 490
 
463 491
         // the tag to detect
464 492
         $detect = $this->code[$k]['name'];
@@ -503,16 +531,19 @@  discard block
 block discarded – undo
503 531
 
504 532
                 // if we can takin into account the current tag => save it
505 533
                 if ( ! $not) {
506
-                    if (isset($row['style']['text-align'])) unset($row['style']['text-align']);
534
+                    if (isset($row['style']['text-align'])) {
535
+                    	unset($row['style']['text-align']);
536
+                    }
507 537
                     $code[] = $row;
508 538
                 }
509 539
             }
510 540
 
511 541
             // it continues as long as there has code to analise
512
-            if (isset($this->code[$k + 1]))
513
-                $k++;
514
-            else
515
-                $end = true;
542
+            if (isset($this->code[$k + 1])) {
543
+                            $k++;
544
+            } else {
545
+                            $end = true;
546
+            }
516 547
         }
517 548
 
518 549
         // return the extract
Please login to merge, or discard this patch.
astpp/application/libraries/html2pdf/_tcpdf_5.0.002/qrcode.php 3 patches
Doc Comments   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -1123,7 +1123,7 @@  discard block
 block discarded – undo
1123 1123
 		 * @param array $frame
1124 1124
 		 * @param int $maskNo
1125 1125
 		 * @param int $level
1126
-		 * @return array mask
1126
+		 * @return integer mask
1127 1127
 		 */
1128 1128
 		 protected function makeMask($width, $frame, $maskNo, $level) {
1129 1129
 			$masked = array_fill(0, $width, str_repeat("\0", $width));
@@ -1165,7 +1165,7 @@  discard block
 block discarded – undo
1165 1165
 		/**
1166 1166
 		 * evaluateSymbol
1167 1167
 		 * @param int $width
1168
-		 * @param array $frame
1168
+		 * @param integer $frame
1169 1169
 		 * @return int demerit
1170 1170
 		 */
1171 1171
 		 protected function evaluateSymbol($width, $frame) {
@@ -2035,7 +2035,7 @@  discard block
 block discarded – undo
2035 2035
 
2036 2036
 		/**
2037 2037
 		 * convertData
2038
-		 * @param array $items
2038
+		 * @param integer $items
2039 2039
 		 * @return array items
2040 2040
 		 */
2041 2041
 		 protected function convertData($items) {
@@ -2490,7 +2490,7 @@  discard block
 block discarded – undo
2490 2490
 
2491 2491
 		/**
2492 2492
 		 * Return BCH encoded format information pattern.
2493
-		 * @param array $mask
2493
+		 * @param integer $mask
2494 2494
 		 * @param int $level error correction level
2495 2495
 		 * @return BCH encoded format information pattern
2496 2496
 		 */
Please login to merge, or discard this patch.
Indentation   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -264,12 +264,12 @@
 block discarded – undo
264 264
 
265 265
 	// for compaibility with PHP4
266 266
 	if (!function_exists('str_split')) {
267
-    	/**
268
-    	 * Convert a string to an array (needed for PHP4 compatibility)
269
-    	 * @param string $string The input string.
270
-    	 * @param int $split_length Maximum length of the chunk.
271
-    	 * @return  string[] the optional split_length  parameter is specified, the returned array will be broken down into chunks with each being split_length  in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element.
272
-    	 */
267
+		/**
268
+		 * Convert a string to an array (needed for PHP4 compatibility)
269
+		 * @param string $string The input string.
270
+		 * @param int $split_length Maximum length of the chunk.
271
+		 * @return  string[] the optional split_length  parameter is specified, the returned array will be broken down into chunks with each being split_length  in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element.
272
+		 */
273 273
 		function str_split($string, $split_length=1) {
274 274
 			if ((strlen($string) > $split_length) OR (!$split_length)) {
275 275
 				do {
Please login to merge, or discard this patch.
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -180,12 +180,12 @@  discard block
 block discarded – undo
180 180
 	/**
181 181
 	 * Matrix index to get width from $capacity array.
182 182
 	 */
183
-	define('QRCAP_WIDTH',    0);
183
+	define('QRCAP_WIDTH', 0);
184 184
 
185 185
 	/**
186 186
 	 * Matrix index to get number of words from $capacity array.
187 187
 	 */
188
-	define('QRCAP_WORDS',    1);
188
+	define('QRCAP_WORDS', 1);
189 189
 
190 190
 	/**
191 191
 	 * Matrix index to get remainder from $capacity array.
@@ -195,7 +195,7 @@  discard block
 block discarded – undo
195 195
 	/**
196 196
 	 * Matrix index to get error correction level from $capacity array.
197 197
 	 */
198
-	define('QRCAP_EC',       3);
198
+	define('QRCAP_EC', 3);
199 199
 
200 200
 	// -----------------------------------------------------
201 201
 
@@ -204,7 +204,7 @@  discard block
 block discarded – undo
204 204
 	/**
205 205
 	 * Number of header bits for structured mode
206 206
 	 */
207
-	define('STRUCTURE_HEADER_BITS',  20);
207
+	define('STRUCTURE_HEADER_BITS', 20);
208 208
 
209 209
 	/**
210 210
 	 * Max number of symbols for structured mode
@@ -218,12 +218,12 @@  discard block
 block discarded – undo
218 218
 	/**
219 219
 	 * Down point base value for case 1 mask pattern (concatenation of same color in a line or a column)
220 220
 	 */
221
-	define('N1',  3);
221
+	define('N1', 3);
222 222
 
223 223
 	/**
224 224
 	 * Down point base value for case 2 mask pattern (module block of same color)
225 225
 	 */
226
-	define('N2',  3);
226
+	define('N2', 3);
227 227
 
228 228
 	/**
229 229
 	 * Down point base value for case 3 mask pattern (1:1:3:1:1(dark:bright:dark:bright:dark)pattern in a line or a column)
@@ -260,18 +260,18 @@  discard block
 block discarded – undo
260 260
 
261 261
 // #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
262 262
 
263
-if (!class_exists('QRcode', false)) {
263
+if ( ! class_exists('QRcode', false)) {
264 264
 
265 265
 	// for compaibility with PHP4
266
-	if (!function_exists('str_split')) {
266
+	if ( ! function_exists('str_split')) {
267 267
     	/**
268 268
     	 * Convert a string to an array (needed for PHP4 compatibility)
269 269
     	 * @param string $string The input string.
270 270
     	 * @param int $split_length Maximum length of the chunk.
271 271
     	 * @return  string[] the optional split_length  parameter is specified, the returned array will be broken down into chunks with each being split_length  in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element.
272 272
     	 */
273
-		function str_split($string, $split_length=1) {
274
-			if ((strlen($string) > $split_length) OR (!$split_length)) {
273
+		function str_split($string, $split_length = 1) {
274
+			if ((strlen($string) > $split_length) OR ( ! $split_length)) {
275 275
 				do {
276 276
 					$c = strlen($string);
277 277
 					$parts[] = substr($string, 0, $split_length);
Please login to merge, or discard this patch.
web_interface/astpp/system/database/DB_result.php 1 patch
Doc Comments   +1 added lines patch added patch discarded remove patch
@@ -64,6 +64,7 @@
 block discarded – undo
64 64
 	 * Custom query result.
65 65
 	 *
66 66
 	 * @param class_name A string that represents the type of object you want back
67
+	 * @param string $class_name
67 68
 	 * @return array of objects
68 69
 	 */
69 70
 	public function custom_result_object($class_name)
Please login to merge, or discard this patch.
web_interface/astpp/system/database/drivers/sqlsrv/sqlsrv_driver.php 3 patches
Doc Comments   +1 added lines patch added patch discarded remove patch
@@ -164,6 +164,7 @@
 block discarded – undo
164 164
 	 *
165 165
 	 * @access	private called by execute()
166 166
 	 * @param	string	an SQL query
167
+	 * @param string $sql
167 168
 	 * @return	string
168 169
 	 */
169 170
 	function _prep_query($sql)
Please login to merge, or discard this patch.
Indentation   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -295,15 +295,15 @@
 block discarded – undo
295 295
 	// --------------------------------------------------------------------
296 296
 
297 297
 	/**
298
-	* Parse major version
299
-	*
300
-	* Grabs the major version number from the
301
-	* database server version string passed in.
302
-	*
303
-	* @access private
304
-	* @param string $version
305
-	* @return string major version number
306
-	*/
298
+	 * Parse major version
299
+	 *
300
+	 * Grabs the major version number from the
301
+	 * database server version string passed in.
302
+	 *
303
+	 * @access private
304
+	 * @param string $version
305
+	 * @return string major version number
306
+	 */
307 307
 	function _parse_major_version($version)
308 308
 	{
309 309
 		preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $version, $ver_info);
Please login to merge, or discard this patch.
Braces   +6 added lines, -4 removed lines patch added patch discarded remove patch
@@ -338,13 +338,15 @@
 block discarded – undo
338 338
 	 */
339 339
 	function count_all($table = '')
340 340
 	{
341
-		if ($table == '')
342
-			return '0';
341
+		if ($table == '') {
342
+					return '0';
343
+		}
343 344
 	
344 345
 		$query = $this->query("SELECT COUNT(*) AS numrows FROM ".$this->dbprefix.$table);
345 346
 		
346
-		if ($query->num_rows() == 0)
347
-			return '0';
347
+		if ($query->num_rows() == 0) {
348
+					return '0';
349
+		}
348 350
 
349 351
 		$row = $query->row();
350 352
 		$this->_reset_select();
Please login to merge, or discard this patch.
web_interface/astpp/system/libraries/Encrypt.php 1 patch
Doc Comments   +5 added lines patch added patch discarded remove patch
@@ -293,6 +293,8 @@  discard block
 block discarded – undo
293 293
 	 * @access	private
294 294
 	 * @param	string
295 295
 	 * @param	string
296
+	 * @param string $string
297
+	 * @param string $key
296 298
 	 * @return	string
297 299
 	 */
298 300
 	function _xor_merge($string, $key)
@@ -365,6 +367,7 @@  discard block
 block discarded – undo
365 367
 	 * @param	string
366 368
 	 * @param	string
367 369
 	 * @param string $data
370
+	 * @param string $key
368 371
 	 * @return	string
369 372
 	 */
370 373
 	function _add_cipher_noise($data, $key)
@@ -396,6 +399,8 @@  discard block
 block discarded – undo
396 399
 	 *
397 400
 	 * @access	public
398 401
 	 * @param	type
402
+	 * @param string $data
403
+	 * @param string $key
399 404
 	 * @return	string
400 405
 	 */
401 406
 	function _remove_cipher_noise($data, $key)
Please login to merge, or discard this patch.
web_interface/astpp/system/libraries/Fpdf.php 3 patches
Doc Comments   +3 added lines patch added patch discarded remove patch
@@ -1010,6 +1010,9 @@
 block discarded – undo
1010 1010
 	return $this->x;
1011 1011
 }
1012 1012
 
1013
+/**
1014
+ * @param integer $x
1015
+ */
1013 1016
 function SetX($x)
1014 1017
 {
1015 1018
 	// Set x position
Please login to merge, or discard this patch.
Spacing   +106 added lines, -106 removed lines patch added patch discarded remove patch
@@ -77,14 +77,14 @@  discard block
 block discarded – undo
77 77
 *******************************************************************************/
78 78
 function FPDF($props = array())
79 79
 {
80
-	 if(count($props) == 3)
80
+	 if (count($props) == 3)
81 81
 	 {
82
-		 list($orientation,$unit,$format) = $props;
83
-		 $this->initialize($orientation,$unit,$format);
82
+		 list($orientation, $unit, $format) = $props;
83
+		 $this->initialize($orientation, $unit, $format);
84 84
 	 }	
85 85
 }
86 86
 
87
-function initialize($orientation='P',$unit='mm',$size='A4')
87
+function initialize($orientation = 'P', $unit = 'mm', $size = 'A4')
88 88
 {
89 89
 	// Some checks
90 90
 	$this->_dochecks();
@@ -182,12 +182,12 @@  discard block
 block discarded – undo
182 182
  * @param double $left
183 183
  * @param double $top
184 184
  */
185
-function SetMargins($left, $top, $right=null)
185
+function SetMargins($left, $top, $right = null)
186 186
 {
187 187
 	// Set left, top and right margins
188 188
 	$this->lMargin = $left;
189 189
 	$this->tMargin = $top;
190
-	if($right===null) {
190
+	if ($right === null) {
191 191
 			$right = $left;
192 192
 	}
193 193
 	$this->rMargin = $right;
@@ -216,25 +216,25 @@  discard block
 block discarded – undo
216 216
 /**
217 217
  * @param boolean $auto
218 218
  */
219
-function SetAutoPageBreak($auto, $margin=0)
219
+function SetAutoPageBreak($auto, $margin = 0)
220 220
 {
221 221
 	// Set auto page break mode and triggering margin
222 222
 	$this->AutoPageBreak = $auto;
223 223
 	$this->bMargin = $margin;
224
-	$this->PageBreakTrigger = $this->h-$margin;
224
+	$this->PageBreakTrigger = $this->h - $margin;
225 225
 }
226 226
 
227 227
 /**
228 228
  * @param string $zoom
229 229
  */
230
-function SetDisplayMode($zoom, $layout='default')
230
+function SetDisplayMode($zoom, $layout = 'default')
231 231
 {
232 232
 	// Set display mode in viewer
233
-	if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom))
233
+	if ($zoom == 'fullpage' || $zoom == 'fullwidth' || $zoom == 'real' || $zoom == 'default' || ! is_string($zoom))
234 234
 		$this->ZoomMode = $zoom;
235 235
 	else
236 236
 		$this->Error('Incorrect zoom display mode: '.$zoom);
237
-	if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default')
237
+	if ($layout == 'single' || $layout == 'continuous' || $layout == 'two' || $layout == 'default')
238 238
 		$this->LayoutMode = $layout;
239 239
 	else
240 240
 		$this->Error('Incorrect layout display mode: '.$layout);
@@ -412,14 +412,14 @@  discard block
 block discarded – undo
412 412
 	return $this->page;
413 413
 }
414 414
 
415
-function SetDrawColor($r, $g=null, $b=null)
415
+function SetDrawColor($r, $g = null, $b = null)
416 416
 {
417 417
 	// Set color for all stroking operations
418
-	if(($r==0 && $g==0 && $b==0) || $g===null)
419
-		$this->DrawColor = sprintf('%.3F G',$r/255);
418
+	if (($r == 0 && $g == 0 && $b == 0) || $g === null)
419
+		$this->DrawColor = sprintf('%.3F G', $r / 255);
420 420
 	else
421
-		$this->DrawColor = sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255);
422
-	if($this->page>0)
421
+		$this->DrawColor = sprintf('%.3F %.3F %.3F RG', $r / 255, $g / 255, $b / 255);
422
+	if ($this->page > 0)
423 423
 		$this->_out($this->DrawColor);
424 424
 }
425 425
 
@@ -428,26 +428,26 @@  discard block
 block discarded – undo
428 428
  * @param integer $g
429 429
  * @param integer $b
430 430
  */
431
-function SetFillColor($r, $g=null, $b=null)
431
+function SetFillColor($r, $g = null, $b = null)
432 432
 {
433 433
 	// Set color for all filling operations
434
-	if(($r==0 && $g==0 && $b==0) || $g===null)
435
-		$this->FillColor = sprintf('%.3F g',$r/255);
434
+	if (($r == 0 && $g == 0 && $b == 0) || $g === null)
435
+		$this->FillColor = sprintf('%.3F g', $r / 255);
436 436
 	else
437
-		$this->FillColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255);
438
-	$this->ColorFlag = ($this->FillColor!=$this->TextColor);
439
-	if($this->page>0)
437
+		$this->FillColor = sprintf('%.3F %.3F %.3F rg', $r / 255, $g / 255, $b / 255);
438
+	$this->ColorFlag = ($this->FillColor != $this->TextColor);
439
+	if ($this->page > 0)
440 440
 		$this->_out($this->FillColor);
441 441
 }
442 442
 
443
-function SetTextColor($r, $g=null, $b=null)
443
+function SetTextColor($r, $g = null, $b = null)
444 444
 {
445 445
 	// Set color for text
446
-	if(($r==0 && $g==0 && $b==0) || $g===null)
447
-		$this->TextColor = sprintf('%.3F g',$r/255);
446
+	if (($r == 0 && $g == 0 && $b == 0) || $g === null)
447
+		$this->TextColor = sprintf('%.3F g', $r / 255);
448 448
 	else
449
-		$this->TextColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255);
450
-	$this->ColorFlag = ($this->FillColor!=$this->TextColor);
449
+		$this->TextColor = sprintf('%.3F %.3F %.3F rg', $r / 255, $g / 255, $b / 255);
450
+	$this->ColorFlag = ($this->FillColor != $this->TextColor);
451 451
 }
452 452
 
453 453
 function GetStringWidth($s)
@@ -457,18 +457,18 @@  discard block
 block discarded – undo
457 457
 	$cw = &$this->CurrentFont['cw'];
458 458
 	$w = 0;
459 459
 	$l = strlen($s);
460
-	for($i=0;$i<$l;$i++) {
460
+	for ($i = 0; $i < $l; $i++) {
461 461
 			$w += $cw[$s[$i]];
462 462
 	}
463
-	return $w*$this->FontSize/1000;
463
+	return $w * $this->FontSize / 1000;
464 464
 }
465 465
 
466 466
 function SetLineWidth($width)
467 467
 {
468 468
 	// Set line width
469 469
 	$this->LineWidth = $width;
470
-	if($this->page>0) {
471
-			$this->_out(sprintf('%.2F w',$width*$this->k));
470
+	if ($this->page > 0) {
471
+			$this->_out(sprintf('%.2F w', $width * $this->k));
472 472
 	}
473 473
 	}
474 474
 
@@ -479,57 +479,57 @@  discard block
 block discarded – undo
479 479
 function Line($x1, $y1, $x2, $y2)
480 480
 {
481 481
 	// Draw a line
482
-	$this->_out(sprintf('%.2F %.2F m %.2F %.2F l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k));
482
+	$this->_out(sprintf('%.2F %.2F m %.2F %.2F l S', $x1 * $this->k, ($this->h - $y1) * $this->k, $x2 * $this->k, ($this->h - $y2) * $this->k));
483 483
 }
484 484
 
485
-function Rect($x, $y, $w, $h, $style='')
485
+function Rect($x, $y, $w, $h, $style = '')
486 486
 {
487 487
 	// Draw a rectangle
488
-	if($style=='F') {
488
+	if ($style == 'F') {
489 489
 			$op = 'f';
490
-	} elseif($style=='FD' || $style=='DF') {
490
+	} elseif ($style == 'FD' || $style == 'DF') {
491 491
 			$op = 'B';
492 492
 	} else {
493 493
 			$op = 'S';
494 494
 	}
495
-	$this->_out(sprintf('%.2F %.2F %.2F %.2F re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op));
495
+	$this->_out(sprintf('%.2F %.2F %.2F %.2F re %s', $x * $this->k, ($this->h - $y) * $this->k, $w * $this->k, -$h * $this->k, $op));
496 496
 }
497 497
 
498 498
 /**
499 499
  * @param string $family
500 500
  */
501
-function AddFont($family, $style='', $file='')
501
+function AddFont($family, $style = '', $file = '')
502 502
 {
503 503
 	// Add a TrueType, OpenType or Type1 font
504 504
 	$family = strtolower($family);
505
-	if($file=='') {
506
-			$file = str_replace(' ','',$family).strtolower($style).'.php';
505
+	if ($file == '') {
506
+			$file = str_replace(' ', '', $family).strtolower($style).'.php';
507 507
 	}
508 508
 	$style = strtoupper($style);
509
-	if($style=='IB') {
509
+	if ($style == 'IB') {
510 510
 			$style = 'BI';
511 511
 	}
512 512
 	$fontkey = $family.$style;
513
-	if(isset($this->fonts[$fontkey])) {
513
+	if (isset($this->fonts[$fontkey])) {
514 514
 			return;
515 515
 	}
516 516
 	$info = $this->_loadfont($file);
517
-	$info['i'] = count($this->fonts)+1;
518
-	if(!empty($info['diff']))
517
+	$info['i'] = count($this->fonts) + 1;
518
+	if ( ! empty($info['diff']))
519 519
 	{
520 520
 		// Search existing encodings
521
-		$n = array_search($info['diff'],$this->diffs);
522
-		if(!$n)
521
+		$n = array_search($info['diff'], $this->diffs);
522
+		if ( ! $n)
523 523
 		{
524
-			$n = count($this->diffs)+1;
524
+			$n = count($this->diffs) + 1;
525 525
 			$this->diffs[$n] = $info['diff'];
526 526
 		}
527 527
 		$info['diffn'] = $n;
528 528
 	}
529
-	if(!empty($info['file']))
529
+	if ( ! empty($info['file']))
530 530
 	{
531 531
 		// Embedded font
532
-		if($info['type']=='TrueType') {
532
+		if ($info['type'] == 'TrueType') {
533 533
 					$this->FontFiles[$info['file']] = array('length1'=>$info['originalsize']);
534 534
 		} else {
535 535
 					$this->FontFiles[$info['file']] = array('length1'=>$info['size1'], 'length2'=>$info['size2']);
@@ -541,48 +541,48 @@  discard block
 block discarded – undo
541 541
 /**
542 542
  * @param string $family
543 543
  */
544
-function SetFont($family, $style='', $size=0)
544
+function SetFont($family, $style = '', $size = 0)
545 545
 {
546 546
 	// Select a font; size given in points
547
-	if($family=='') {
547
+	if ($family == '') {
548 548
 			$family = $this->FontFamily;
549 549
 	} else {
550 550
 			$family = strtolower($family);
551 551
 	}
552 552
 	$style = strtoupper($style);
553
-	if(strpos($style,'U')!==false)
553
+	if (strpos($style, 'U') !== false)
554 554
 	{
555 555
 		$this->underline = true;
556
-		$style = str_replace('U','',$style);
556
+		$style = str_replace('U', '', $style);
557 557
 	} else {
558 558
 			$this->underline = false;
559 559
 	}
560
-	if($style=='IB') {
560
+	if ($style == 'IB') {
561 561
 			$style = 'BI';
562 562
 	}
563
-	if($size==0) {
563
+	if ($size == 0) {
564 564
 			$size = $this->FontSizePt;
565 565
 	}
566 566
 	// Test if font is already selected
567
-	if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size) {
567
+	if ($this->FontFamily == $family && $this->FontStyle == $style && $this->FontSizePt == $size) {
568 568
 			return;
569 569
 	}
570 570
 	// Test if font is already loaded
571 571
 	$fontkey = $family.$style;
572
-	if(!isset($this->fonts[$fontkey]))
572
+	if ( ! isset($this->fonts[$fontkey]))
573 573
 	{
574 574
 		// Test if one of the core fonts
575
-		if($family=='arial') {
575
+		if ($family == 'arial') {
576 576
 					$family = 'helvetica';
577 577
 		}
578
-		if(in_array($family,$this->CoreFonts))
578
+		if (in_array($family, $this->CoreFonts))
579 579
 		{
580
-			if($family=='symbol' || $family=='zapfdingbats') {
580
+			if ($family == 'symbol' || $family == 'zapfdingbats') {
581 581
 							$style = '';
582 582
 			}
583 583
 			$fontkey = $family.$style;
584
-			if(!isset($this->fonts[$fontkey])) {
585
-							$this->AddFont($family,$style);
584
+			if ( ! isset($this->fonts[$fontkey])) {
585
+							$this->AddFont($family, $style);
586 586
 			}
587 587
 		} else {
588 588
 					$this->Error('Undefined font: '.$family.' '.$style);
@@ -654,79 +654,79 @@  discard block
 block discarded – undo
654 654
 	return $this->AutoPageBreak;
655 655
 }
656 656
 
657
-function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
657
+function Cell($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '')
658 658
 {
659 659
 	// Output a cell
660 660
 	$k = $this->k;
661
-	if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak())
661
+	if ($this->y + $h > $this->PageBreakTrigger && ! $this->InHeader && ! $this->InFooter && $this->AcceptPageBreak())
662 662
 	{
663 663
 		// Automatic page break
664 664
 		$x = $this->x;
665 665
 		$ws = $this->ws;
666
-		if($ws>0)
666
+		if ($ws > 0)
667 667
 		{
668 668
 			$this->ws = 0;
669 669
 			$this->_out('0 Tw');
670 670
 		}
671
-		$this->AddPage($this->CurOrientation,$this->CurPageSize);
671
+		$this->AddPage($this->CurOrientation, $this->CurPageSize);
672 672
 		$this->x = $x;
673
-		if($ws>0)
673
+		if ($ws > 0)
674 674
 		{
675 675
 			$this->ws = $ws;
676
-			$this->_out(sprintf('%.3F Tw',$ws*$k));
676
+			$this->_out(sprintf('%.3F Tw', $ws * $k));
677 677
 		}
678 678
 	}
679
-	if($w==0)
680
-		$w = $this->w-$this->rMargin-$this->x;
679
+	if ($w == 0)
680
+		$w = $this->w - $this->rMargin - $this->x;
681 681
 	$s = '';
682
-	if($fill || $border==1)
682
+	if ($fill || $border == 1)
683 683
 	{
684
-		if($fill)
685
-			$op = ($border==1) ? 'B' : 'f';
684
+		if ($fill)
685
+			$op = ($border == 1) ? 'B' : 'f';
686 686
 		else
687 687
 			$op = 'S';
688
-		$s = sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op);
688
+		$s = sprintf('%.2F %.2F %.2F %.2F re %s ', $this->x * $k, ($this->h - $this->y) * $k, $w * $k, -$h * $k, $op);
689 689
 	}
690
-	if(is_string($border))
690
+	if (is_string($border))
691 691
 	{
692 692
 		$x = $this->x;
693 693
 		$y = $this->y;
694
-		if(strpos($border,'L')!==false)
695
-			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k);
696
-		if(strpos($border,'T')!==false)
697
-			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k);
698
-		if(strpos($border,'R')!==false)
699
-			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
700
-		if(strpos($border,'B')!==false)
701
-			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
694
+		if (strpos($border, 'L') !== false)
695
+			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ', $x * $k, ($this->h - $y) * $k, $x * $k, ($this->h - ($y + $h)) * $k);
696
+		if (strpos($border, 'T') !== false)
697
+			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ', $x * $k, ($this->h - $y) * $k, ($x + $w) * $k, ($this->h - $y) * $k);
698
+		if (strpos($border, 'R') !== false)
699
+			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ', ($x + $w) * $k, ($this->h - $y) * $k, ($x + $w) * $k, ($this->h - ($y + $h)) * $k);
700
+		if (strpos($border, 'B') !== false)
701
+			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ', $x * $k, ($this->h - ($y + $h)) * $k, ($x + $w) * $k, ($this->h - ($y + $h)) * $k);
702 702
 	}
703
-	if($txt!=='')
703
+	if ($txt !== '')
704 704
 	{
705
-		if($align=='R')
706
-			$dx = $w-$this->cMargin-$this->GetStringWidth($txt);
707
-		elseif($align=='C')
708
-			$dx = ($w-$this->GetStringWidth($txt))/2;
705
+		if ($align == 'R')
706
+			$dx = $w - $this->cMargin - $this->GetStringWidth($txt);
707
+		elseif ($align == 'C')
708
+			$dx = ($w - $this->GetStringWidth($txt)) / 2;
709 709
 		else
710 710
 			$dx = $this->cMargin;
711
-		if($this->ColorFlag)
711
+		if ($this->ColorFlag)
712 712
 			$s .= 'q '.$this->TextColor.' ';
713
-		$txt2 = str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt)));
714
-		$s .= sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2);
715
-		if($this->underline)
716
-			$s .= ' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt);
717
-		if($this->ColorFlag)
713
+		$txt2 = str_replace(')', '\\)', str_replace('(', '\\(', str_replace('\\', '\\\\', $txt)));
714
+		$s .= sprintf('BT %.2F %.2F Td (%s) Tj ET', ($this->x + $dx) * $k, ($this->h - ($this->y + .5 * $h + .3 * $this->FontSize)) * $k, $txt2);
715
+		if ($this->underline)
716
+			$s .= ' '.$this->_dounderline($this->x + $dx, $this->y + .5 * $h + .3 * $this->FontSize, $txt);
717
+		if ($this->ColorFlag)
718 718
 			$s .= ' Q';
719
-		if($link)
720
-			$this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link);
719
+		if ($link)
720
+			$this->Link($this->x + $dx, $this->y + .5 * $h - .5 * $this->FontSize, $this->GetStringWidth($txt), $this->FontSize, $link);
721 721
 	}
722
-	if($s)
722
+	if ($s)
723 723
 		$this->_out($s);
724 724
 	$this->lasth = $h;
725
-	if($ln>0)
725
+	if ($ln > 0)
726 726
 	{
727 727
 		// Go to next line
728 728
 		$this->y += $h;
729
-		if($ln==1)
729
+		if ($ln == 1)
730 730
 			$this->x = $this->lMargin;
731 731
 	}
732 732
 	else
@@ -737,21 +737,21 @@  discard block
 block discarded – undo
737 737
  * @param integer $w
738 738
  * @param integer $h
739 739
  */
740
-function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false)
740
+function MultiCell($w, $h, $txt, $border = 0, $align = 'J', $fill = false)
741 741
 {
742 742
 	// Output text with automatic or explicit line breaks
743 743
 	$cw = &$this->CurrentFont['cw'];
744
-	if($w==0)
745
-		$w = $this->w-$this->rMargin-$this->x;
746
-	$wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
747
-	$s = str_replace("\r",'',$txt);
744
+	if ($w == 0)
745
+		$w = $this->w - $this->rMargin - $this->x;
746
+	$wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
747
+	$s = str_replace("\r", '', $txt);
748 748
 	$nb = strlen($s);
749
-	if($nb>0 && $s[$nb-1]=="\n")
749
+	if ($nb > 0 && $s[$nb - 1] == "\n")
750 750
 		$nb--;
751 751
 	$b = 0;
752
-	if($border)
752
+	if ($border)
753 753
 	{
754
-		if($border==1)
754
+		if ($border == 1)
755 755
 		{
756 756
 			$border = 'LTRB';
757 757
 			$b = 'LRT';
Please login to merge, or discard this patch.
Braces   +518 added lines, -401 removed lines patch added patch discarded remove patch
@@ -116,26 +116,28 @@  discard block
 block discarded – undo
116 116
 	if (defined('FPDF_FONTPATH'))
117 117
 	{
118 118
 		$this->fontpath = FPDF_FONTPATH;
119
-		if (substr($this->fontpath, -1) != '/' && substr($this->fontpath, -1) != '\\')
120
-			$this->fontpath .= '/';
121
-	}
122
-	elseif (is_dir(dirname(__FILE__).'/font'))
123
-		$this->fontpath = dirname(__FILE__).'/font/';
124
-	else
125
-		$this->fontpath = '';	
119
+		if (substr($this->fontpath, -1) != '/' && substr($this->fontpath, -1) != '\\') {
120
+					$this->fontpath .= '/';
121
+		}
122
+	} elseif (is_dir(dirname(__FILE__).'/font')) {
123
+			$this->fontpath = dirname(__FILE__).'/font/';
124
+	} else {
125
+			$this->fontpath = '';
126
+	}
126 127
 	// Core fonts
127 128
 	$this->CoreFonts = array('courier', 'helvetica', 'times', 'symbol', 'zapfdingbats');
128 129
 	// Scale factor
129
-	if ($unit == 'pt')
130
-		$this->k = 1;
131
-	elseif ($unit == 'mm')
132
-		$this->k = 72 / 25.4;
133
-	elseif ($unit == 'cm')
134
-		$this->k = 72 / 2.54;
135
-	elseif ($unit == 'in')
136
-		$this->k = 72;
137
-	else
138
-		$this->Error('Incorrect unit: '.$unit);
130
+	if ($unit == 'pt') {
131
+			$this->k = 1;
132
+	} elseif ($unit == 'mm') {
133
+			$this->k = 72 / 25.4;
134
+	} elseif ($unit == 'cm') {
135
+			$this->k = 72 / 2.54;
136
+	} elseif ($unit == 'in') {
137
+			$this->k = 72;
138
+	} else {
139
+			$this->Error('Incorrect unit: '.$unit);
140
+	}
139 141
 	// Page sizes
140 142
 	$this->StdPageSizes = array('a3'=>array(841.89, 1190.55), 'a4'=>array(595.28, 841.89), 'a5'=>array(420.94, 595.28),
141 143
 		'letter'=>array(612, 792), 'legal'=>array(612, 1008));
@@ -149,15 +151,14 @@  discard block
 block discarded – undo
149 151
 		$this->DefOrientation = 'P';
150 152
 		$this->w = $size[0];
151 153
 		$this->h = $size[1];
152
-	}
153
-	elseif ($orientation == 'l' || $orientation == 'landscape')
154
+	} elseif ($orientation == 'l' || $orientation == 'landscape')
154 155
 	{
155 156
 		$this->DefOrientation = 'L';
156 157
 		$this->w = $size[1];
157 158
 		$this->h = $size[0];
158
-	}
159
-	else
160
-		$this->Error('Incorrect orientation: '.$orientation);
159
+	} else {
160
+			$this->Error('Incorrect orientation: '.$orientation);
161
+	}
161 162
 	$this->CurOrientation = $this->DefOrientation;
162 163
 	$this->wPt = $this->w * $this->k;
163 164
 	$this->hPt = $this->h * $this->k;
@@ -197,9 +198,10 @@  discard block
 block discarded – undo
197 198
 {
198 199
 	// Set left margin
199 200
 	$this->lMargin = $margin;
200
-	if ($this->page > 0 && $this->x < $margin)
201
-		$this->x = $margin;
202
-}
201
+	if ($this->page > 0 && $this->x < $margin) {
202
+			$this->x = $margin;
203
+	}
204
+	}
203 205
 
204 206
 function SetTopMargin($margin)
205 207
 {
@@ -230,15 +232,17 @@  discard block
 block discarded – undo
230 232
 function SetDisplayMode($zoom, $layout='default')
231 233
 {
232 234
 	// Set display mode in viewer
233
-	if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom))
234
-		$this->ZoomMode = $zoom;
235
-	else
236
-		$this->Error('Incorrect zoom display mode: '.$zoom);
237
-	if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default')
238
-		$this->LayoutMode = $layout;
239
-	else
240
-		$this->Error('Incorrect layout display mode: '.$layout);
241
-}
235
+	if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom)) {
236
+			$this->ZoomMode = $zoom;
237
+	} else {
238
+			$this->Error('Incorrect zoom display mode: '.$zoom);
239
+	}
240
+	if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default') {
241
+			$this->LayoutMode = $layout;
242
+	} else {
243
+			$this->Error('Incorrect layout display mode: '.$layout);
244
+	}
245
+	}
242 246
 
243 247
 /**
244 248
  * @param boolean $compress
@@ -246,49 +250,55 @@  discard block
 block discarded – undo
246 250
 function SetCompression($compress)
247 251
 {
248 252
 	// Set page compression
249
-	if (function_exists('gzcompress'))
250
-		$this->compress = $compress;
251
-	else
252
-		$this->compress = false;
253
-}
253
+	if (function_exists('gzcompress')) {
254
+			$this->compress = $compress;
255
+	} else {
256
+			$this->compress = false;
257
+	}
258
+	}
254 259
 
255 260
 function SetTitle($title, $isUTF8 = false)
256 261
 {
257 262
 	// Title of document
258
-	if ($isUTF8)
259
-		$title = $this->_UTF8toUTF16($title);
263
+	if ($isUTF8) {
264
+			$title = $this->_UTF8toUTF16($title);
265
+	}
260 266
 	$this->title = $title;
261 267
 }
262 268
 
263 269
 function SetSubject($subject, $isUTF8 = false)
264 270
 {
265 271
 	// Subject of document
266
-	if ($isUTF8)
267
-		$subject = $this->_UTF8toUTF16($subject);
272
+	if ($isUTF8) {
273
+			$subject = $this->_UTF8toUTF16($subject);
274
+	}
268 275
 	$this->subject = $subject;
269 276
 }
270 277
 
271 278
 function SetAuthor($author, $isUTF8 = false)
272 279
 {
273 280
 	// Author of document
274
-	if ($isUTF8)
275
-		$author = $this->_UTF8toUTF16($author);
281
+	if ($isUTF8) {
282
+			$author = $this->_UTF8toUTF16($author);
283
+	}
276 284
 	$this->author = $author;
277 285
 }
278 286
 
279 287
 function SetKeywords($keywords, $isUTF8 = false)
280 288
 {
281 289
 	// Keywords of document
282
-	if ($isUTF8)
283
-		$keywords = $this->_UTF8toUTF16($keywords);
290
+	if ($isUTF8) {
291
+			$keywords = $this->_UTF8toUTF16($keywords);
292
+	}
284 293
 	$this->keywords = $keywords;
285 294
 }
286 295
 
287 296
 function SetCreator($creator, $isUTF8 = false)
288 297
 {
289 298
 	// Creator of document
290
-	if ($isUTF8)
291
-		$creator = $this->_UTF8toUTF16($creator);
299
+	if ($isUTF8) {
300
+			$creator = $this->_UTF8toUTF16($creator);
301
+	}
292 302
 	$this->creator = $creator;
293 303
 }
294 304
 
@@ -313,10 +323,12 @@  discard block
 block discarded – undo
313 323
 function Close()
314 324
 {
315 325
 	// Terminate document
316
-	if ($this->state == 3)
317
-		return;
318
-	if ($this->page == 0)
319
-		$this->AddPage();
326
+	if ($this->state == 3) {
327
+			return;
328
+	}
329
+	if ($this->page == 0) {
330
+			$this->AddPage();
331
+	}
320 332
 	// Page footer
321 333
 	$this->InFooter = true;
322 334
 	$this->Footer();
@@ -330,8 +342,9 @@  discard block
 block discarded – undo
330 342
 function AddPage($orientation = '', $size = '')
331 343
 {
332 344
 	// Start a new page
333
-	if ($this->state == 0)
334
-		$this->Open();
345
+	if ($this->state == 0) {
346
+			$this->Open();
347
+	}
335 348
 	$family = $this->FontFamily;
336 349
 	$style = $this->FontStyle.($this->underline ? 'U' : '');
337 350
 	$fontsize = $this->FontSizePt;
@@ -357,15 +370,18 @@  discard block
 block discarded – undo
357 370
 	$this->LineWidth = $lw;
358 371
 	$this->_out(sprintf('%.2F w', $lw * $this->k));
359 372
 	// Set font
360
-	if ($family)
361
-		$this->SetFont($family, $style, $fontsize);
373
+	if ($family) {
374
+			$this->SetFont($family, $style, $fontsize);
375
+	}
362 376
 	// Set colors
363 377
 	$this->DrawColor = $dc;
364
-	if ($dc != '0 G')
365
-		$this->_out($dc);
378
+	if ($dc != '0 G') {
379
+			$this->_out($dc);
380
+	}
366 381
 	$this->FillColor = $fc;
367
-	if ($fc != '0 g')
368
-		$this->_out($fc);
382
+	if ($fc != '0 g') {
383
+			$this->_out($fc);
384
+	}
369 385
 	$this->TextColor = $tc;
370 386
 	$this->ColorFlag = $cf;
371 387
 	// Page header
@@ -379,8 +395,9 @@  discard block
 block discarded – undo
379 395
 		$this->_out(sprintf('%.2F w', $lw * $this->k));
380 396
 	}
381 397
 	// Restore font
382
-	if ($family)
383
-		$this->SetFont($family, $style, $fontsize);
398
+	if ($family) {
399
+			$this->SetFont($family, $style, $fontsize);
400
+	}
384 401
 	// Restore colors
385 402
 	if ($this->DrawColor != $dc)
386 403
 	{
@@ -415,13 +432,15 @@  discard block
 block discarded – undo
415 432
 function SetDrawColor($r, $g=null, $b=null)
416 433
 {
417 434
 	// Set color for all stroking operations
418
-	if(($r==0 && $g==0 && $b==0) || $g===null)
419
-		$this->DrawColor = sprintf('%.3F G',$r/255);
420
-	else
421
-		$this->DrawColor = sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255);
422
-	if($this->page>0)
423
-		$this->_out($this->DrawColor);
424
-}
435
+	if(($r==0 && $g==0 && $b==0) || $g===null) {
436
+			$this->DrawColor = sprintf('%.3F G',$r/255);
437
+	} else {
438
+			$this->DrawColor = sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255);
439
+	}
440
+	if($this->page>0) {
441
+			$this->_out($this->DrawColor);
442
+	}
443
+	}
425 444
 
426 445
 /**
427 446
  * @param integer $r
@@ -431,22 +450,25 @@  discard block
 block discarded – undo
431 450
 function SetFillColor($r, $g=null, $b=null)
432 451
 {
433 452
 	// Set color for all filling operations
434
-	if(($r==0 && $g==0 && $b==0) || $g===null)
435
-		$this->FillColor = sprintf('%.3F g',$r/255);
436
-	else
437
-		$this->FillColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255);
453
+	if(($r==0 && $g==0 && $b==0) || $g===null) {
454
+			$this->FillColor = sprintf('%.3F g',$r/255);
455
+	} else {
456
+			$this->FillColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255);
457
+	}
438 458
 	$this->ColorFlag = ($this->FillColor!=$this->TextColor);
439
-	if($this->page>0)
440
-		$this->_out($this->FillColor);
441
-}
459
+	if($this->page>0) {
460
+			$this->_out($this->FillColor);
461
+	}
462
+	}
442 463
 
443 464
 function SetTextColor($r, $g=null, $b=null)
444 465
 {
445 466
 	// Set color for text
446
-	if(($r==0 && $g==0 && $b==0) || $g===null)
447
-		$this->TextColor = sprintf('%.3F g',$r/255);
448
-	else
449
-		$this->TextColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255);
467
+	if(($r==0 && $g==0 && $b==0) || $g===null) {
468
+			$this->TextColor = sprintf('%.3F g',$r/255);
469
+	} else {
470
+			$this->TextColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255);
471
+	}
450 472
 	$this->ColorFlag = ($this->FillColor!=$this->TextColor);
451 473
 }
452 474
 
@@ -594,20 +616,23 @@  discard block
 block discarded – undo
594 616
 	$this->FontSizePt = $size;
595 617
 	$this->FontSize = $size / $this->k;
596 618
 	$this->CurrentFont = &$this->fonts[$fontkey];
597
-	if ($this->page > 0)
598
-		$this->_out(sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt));
599
-}
619
+	if ($this->page > 0) {
620
+			$this->_out(sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt));
621
+	}
622
+	}
600 623
 
601 624
 function SetFontSize($size)
602 625
 {
603 626
 	// Set font size in points
604
-	if ($this->FontSizePt == $size)
605
-		return;
627
+	if ($this->FontSizePt == $size) {
628
+			return;
629
+	}
606 630
 	$this->FontSizePt = $size;
607 631
 	$this->FontSize = $size / $this->k;
608
-	if ($this->page > 0)
609
-		$this->_out(sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt));
610
-}
632
+	if ($this->page > 0) {
633
+			$this->_out(sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt));
634
+	}
635
+	}
611 636
 
612 637
 function AddLink()
613 638
 {
@@ -620,10 +645,12 @@  discard block
 block discarded – undo
620 645
 function SetLink($link, $y = 0, $page = -1)
621 646
 {
622 647
 	// Set destination of internal link
623
-	if ($y == -1)
624
-		$y = $this->y;
625
-	if ($page == -1)
626
-		$page = $this->page;
648
+	if ($y == -1) {
649
+			$y = $this->y;
650
+	}
651
+	if ($page == -1) {
652
+			$page = $this->page;
653
+	}
627 654
 	$this->links[$link] = array($page, $y);
628 655
 }
629 656
 
@@ -641,10 +668,12 @@  discard block
 block discarded – undo
641 668
 {
642 669
 	// Output a string
643 670
 	$s = sprintf('BT %.2F %.2F Td (%s) Tj ET', $x * $this->k, ($this->h - $y) * $this->k, $this->_escape($txt));
644
-	if ($this->underline && $txt != '')
645
-		$s .= ' '.$this->_dounderline($x, $y, $txt);
646
-	if ($this->ColorFlag)
647
-		$s = 'q '.$this->TextColor.' '.$s.' Q';
671
+	if ($this->underline && $txt != '') {
672
+			$s .= ' '.$this->_dounderline($x, $y, $txt);
673
+	}
674
+	if ($this->ColorFlag) {
675
+			$s = 'q '.$this->TextColor.' '.$s.' Q';
676
+	}
648 677
 	$this->_out($s);
649 678
 }
650 679
 
@@ -676,62 +705,75 @@  discard block
 block discarded – undo
676 705
 			$this->_out(sprintf('%.3F Tw',$ws*$k));
677 706
 		}
678 707
 	}
679
-	if($w==0)
680
-		$w = $this->w-$this->rMargin-$this->x;
708
+	if($w==0) {
709
+			$w = $this->w-$this->rMargin-$this->x;
710
+	}
681 711
 	$s = '';
682 712
 	if($fill || $border==1)
683 713
 	{
684
-		if($fill)
685
-			$op = ($border==1) ? 'B' : 'f';
686
-		else
687
-			$op = 'S';
714
+		if($fill) {
715
+					$op = ($border==1) ? 'B' : 'f';
716
+		} else {
717
+					$op = 'S';
718
+		}
688 719
 		$s = sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op);
689 720
 	}
690 721
 	if(is_string($border))
691 722
 	{
692 723
 		$x = $this->x;
693 724
 		$y = $this->y;
694
-		if(strpos($border,'L')!==false)
695
-			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k);
696
-		if(strpos($border,'T')!==false)
697
-			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k);
698
-		if(strpos($border,'R')!==false)
699
-			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
700
-		if(strpos($border,'B')!==false)
701
-			$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
725
+		if(strpos($border,'L')!==false) {
726
+					$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k);
727
+		}
728
+		if(strpos($border,'T')!==false) {
729
+					$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k);
730
+		}
731
+		if(strpos($border,'R')!==false) {
732
+					$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
733
+		}
734
+		if(strpos($border,'B')!==false) {
735
+					$s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
736
+		}
702 737
 	}
703 738
 	if($txt!=='')
704 739
 	{
705
-		if($align=='R')
706
-			$dx = $w-$this->cMargin-$this->GetStringWidth($txt);
707
-		elseif($align=='C')
708
-			$dx = ($w-$this->GetStringWidth($txt))/2;
709
-		else
710
-			$dx = $this->cMargin;
711
-		if($this->ColorFlag)
712
-			$s .= 'q '.$this->TextColor.' ';
740
+		if($align=='R') {
741
+					$dx = $w-$this->cMargin-$this->GetStringWidth($txt);
742
+		} elseif($align=='C') {
743
+					$dx = ($w-$this->GetStringWidth($txt))/2;
744
+		} else {
745
+					$dx = $this->cMargin;
746
+		}
747
+		if($this->ColorFlag) {
748
+					$s .= 'q '.$this->TextColor.' ';
749
+		}
713 750
 		$txt2 = str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt)));
714 751
 		$s .= sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2);
715
-		if($this->underline)
716
-			$s .= ' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt);
717
-		if($this->ColorFlag)
718
-			$s .= ' Q';
719
-		if($link)
720
-			$this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link);
752
+		if($this->underline) {
753
+					$s .= ' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt);
754
+		}
755
+		if($this->ColorFlag) {
756
+					$s .= ' Q';
757
+		}
758
+		if($link) {
759
+					$this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link);
760
+		}
721 761
 	}
722
-	if($s)
723
-		$this->_out($s);
762
+	if($s) {
763
+			$this->_out($s);
764
+	}
724 765
 	$this->lasth = $h;
725 766
 	if($ln>0)
726 767
 	{
727 768
 		// Go to next line
728 769
 		$this->y += $h;
729
-		if($ln==1)
730
-			$this->x = $this->lMargin;
770
+		if($ln==1) {
771
+					$this->x = $this->lMargin;
772
+		}
773
+	} else {
774
+			$this->x += $w;
775
+	}
731 776
 	}
732
-	else
733
-		$this->x += $w;
734
-}
735 777
 
736 778
 /**
737 779
  * @param integer $w
@@ -741,13 +783,15 @@  discard block
 block discarded – undo
741 783
 {
742 784
 	// Output text with automatic or explicit line breaks
743 785
 	$cw = &$this->CurrentFont['cw'];
744
-	if($w==0)
745
-		$w = $this->w-$this->rMargin-$this->x;
786
+	if($w==0) {
787
+			$w = $this->w-$this->rMargin-$this->x;
788
+	}
746 789
 	$wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
747 790
 	$s = str_replace("\r",'',$txt);
748 791
 	$nb = strlen($s);
749
-	if($nb>0 && $s[$nb-1]=="\n")
750
-		$nb--;
792
+	if($nb>0 && $s[$nb-1]=="\n") {
793
+			$nb--;
794
+	}
751 795
 	$b = 0;
752 796
 	if($border)
753 797
 	{
@@ -756,14 +800,15 @@  discard block
 block discarded – undo
756 800
 			$border = 'LTRB';
757 801
 			$b = 'LRT';
758 802
 			$b2 = 'LR';
759
-		}
760
-		else
803
+		} else
761 804
 		{
762 805
 			$b2 = '';
763
-			if (strpos($border, 'L') !== false)
764
-				$b2 .= 'L';
765
-			if (strpos($border, 'R') !== false)
766
-				$b2 .= 'R';
806
+			if (strpos($border, 'L') !== false) {
807
+							$b2 .= 'L';
808
+			}
809
+			if (strpos($border, 'R') !== false) {
810
+							$b2 .= 'R';
811
+			}
767 812
 			$b = (strpos($border, 'T') !== false) ? $b2.'T' : $b2;
768 813
 		}
769 814
 	}
@@ -792,8 +837,9 @@  discard block
 block discarded – undo
792 837
 			$l = 0;
793 838
 			$ns = 0;
794 839
 			$nl++;
795
-			if ($border && $nl == 2)
796
-				$b = $b2;
840
+			if ($border && $nl == 2) {
841
+							$b = $b2;
842
+			}
797 843
 			continue;
798 844
 		}
799 845
 		if ($c == ' ')
@@ -808,16 +854,16 @@  discard block
 block discarded – undo
808 854
 			// Automatic line break
809 855
 			if ($sep == -1)
810 856
 			{
811
-				if ($i == $j)
812
-					$i++;
857
+				if ($i == $j) {
858
+									$i++;
859
+				}
813 860
 				if ($this->ws > 0)
814 861
 				{
815 862
 					$this->ws = 0;
816 863
 					$this->_out('0 Tw');
817 864
 				}
818 865
 				$this->Cell($w, $h, substr($s, $j, $i - $j), $b, 2, $align, $fill);
819
-			}
820
-			else
866
+			} else
821 867
 			{
822 868
 				if ($align == 'J')
823 869
 				{
@@ -832,11 +878,12 @@  discard block
 block discarded – undo
832 878
 			$l = 0;
833 879
 			$ns = 0;
834 880
 			$nl++;
835
-			if ($border && $nl == 2)
836
-				$b = $b2;
837
-		}
838
-		else
839
-			$i++;
881
+			if ($border && $nl == 2) {
882
+							$b = $b2;
883
+			}
884
+		} else {
885
+					$i++;
886
+		}
840 887
 	}
841 888
 	// Last chunk
842 889
 	if ($this->ws > 0)
@@ -844,8 +891,9 @@  discard block
 block discarded – undo
844 891
 		$this->ws = 0;
845 892
 		$this->_out('0 Tw');
846 893
 	}
847
-	if ($border && strpos($border, 'B') !== false)
848
-		$b .= 'B';
894
+	if ($border && strpos($border, 'B') !== false) {
895
+			$b .= 'B';
896
+	}
849 897
 	$this->Cell($w, $h, substr($s, $j, $i - $j), $b, 2, $align, $fill);
850 898
 	$this->x = $this->lMargin;
851 899
 }
@@ -884,8 +932,9 @@  discard block
 block discarded – undo
884 932
 			$nl++;
885 933
 			continue;
886 934
 		}
887
-		if ($c == ' ')
888
-			$sep = $i;
935
+		if ($c == ' ') {
936
+					$sep = $i;
937
+		}
889 938
 		$l += $cw[$c];
890 939
 		if ($l > $wmax)
891 940
 		{
@@ -903,11 +952,11 @@  discard block
 block discarded – undo
903 952
 					$nl++;
904 953
 					continue;
905 954
 				}
906
-				if ($i == $j)
907
-					$i++;
955
+				if ($i == $j) {
956
+									$i++;
957
+				}
908 958
 				$this->Cell($w, $h, substr($s, $j, $i - $j), 0, 2, '', 0, $link);
909
-			}
910
-			else
959
+			} else
911 960
 			{
912 961
 				$this->Cell($w, $h, substr($s, $j, $sep - $j), 0, 2, '', 0, $link);
913 962
 				$i = $sep + 1;
@@ -922,24 +971,26 @@  discard block
 block discarded – undo
922 971
 				$wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
923 972
 			}
924 973
 			$nl++;
925
-		}
926
-		else
927
-			$i++;
974
+		} else {
975
+					$i++;
976
+		}
928 977
 	}
929 978
 	// Last chunk
930
-	if ($i != $j)
931
-		$this->Cell($l / 1000 * $this->FontSize, $h, substr($s, $j), 0, 0, '', 0, $link);
932
-}
979
+	if ($i != $j) {
980
+			$this->Cell($l / 1000 * $this->FontSize, $h, substr($s, $j), 0, 0, '', 0, $link);
981
+	}
982
+	}
933 983
 
934 984
 function Ln($h = null)
935 985
 {
936 986
 	// Line feed; default value is last cell height
937 987
 	$this->x = $this->lMargin;
938
-	if ($h === null)
939
-		$this->y += $this->lasth;
940
-	else
941
-		$this->y += $h;
942
-}
988
+	if ($h === null) {
989
+			$this->y += $this->lasth;
990
+	} else {
991
+			$this->y += $h;
992
+	}
993
+	}
943 994
 
944 995
 function Image($file, $x = null, $y = null, $w = 0, $h = 0, $type = '', $link = '')
945 996
 {
@@ -950,22 +1001,25 @@  discard block
 block discarded – undo
950 1001
 		if ($type == '')
951 1002
 		{
952 1003
 			$pos = strrpos($file, '.');
953
-			if ( ! $pos)
954
-				$this->Error('Image file has no extension and no type was specified: '.$file);
1004
+			if ( ! $pos) {
1005
+							$this->Error('Image file has no extension and no type was specified: '.$file);
1006
+			}
955 1007
 			$type = substr($file, $pos + 1);
956 1008
 		}
957 1009
 		$type = strtolower($type);
958
-		if ($type == 'jpeg')
959
-			$type = 'jpg';
1010
+		if ($type == 'jpeg') {
1011
+					$type = 'jpg';
1012
+		}
960 1013
 		$mtd = '_parse'.$type;
961
-		if ( ! method_exists($this, $mtd))
962
-			$this->Error('Unsupported image type: '.$type);
1014
+		if ( ! method_exists($this, $mtd)) {
1015
+					$this->Error('Unsupported image type: '.$type);
1016
+		}
963 1017
 		$info = $this->$mtd($file);
964 1018
 		$info['i'] = count($this->images) + 1;
965 1019
 		$this->images[$file] = $info;
966
-	}
967
-	else
968
-		$info = $this->images[$file];
1020
+	} else {
1021
+			$info = $this->images[$file];
1022
+	}
969 1023
 
970 1024
 	// Automatic width and height calculation if needed
971 1025
 	if ($w == 0 && $h == 0)
@@ -974,14 +1028,18 @@  discard block
 block discarded – undo
974 1028
 		$w = -96;
975 1029
 		$h = -96;
976 1030
 	}
977
-	if ($w < 0)
978
-		$w = -$info['w'] * 72 / $w / $this->k;
979
-	if ($h < 0)
980
-		$h = -$info['h'] * 72 / $h / $this->k;
981
-	if ($w == 0)
982
-		$w = $h * $info['w'] / $info['h'];
983
-	if ($h == 0)
984
-		$h = $w * $info['h'] / $info['w'];
1031
+	if ($w < 0) {
1032
+			$w = -$info['w'] * 72 / $w / $this->k;
1033
+	}
1034
+	if ($h < 0) {
1035
+			$h = -$info['h'] * 72 / $h / $this->k;
1036
+	}
1037
+	if ($w == 0) {
1038
+			$w = $h * $info['w'] / $info['h'];
1039
+	}
1040
+	if ($h == 0) {
1041
+			$h = $w * $info['h'] / $info['w'];
1042
+	}
985 1043
 
986 1044
 	// Flowing mode
987 1045
 	if ($y === null)
@@ -997,12 +1055,14 @@  discard block
 block discarded – undo
997 1055
 		$this->y += $h;
998 1056
 	}
999 1057
 
1000
-	if ($x === null)
1001
-		$x = $this->x;
1058
+	if ($x === null) {
1059
+			$x = $this->x;
1060
+	}
1002 1061
 	$this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q', $w * $this->k, $h * $this->k, $x * $this->k, ($this->h - ($y + $h)) * $this->k, $info['i']));
1003
-	if ($link)
1004
-		$this->Link($x, $y, $w, $h, $link);
1005
-}
1062
+	if ($link) {
1063
+			$this->Link($x, $y, $w, $h, $link);
1064
+	}
1065
+	}
1006 1066
 
1007 1067
 function GetX()
1008 1068
 {
@@ -1013,11 +1073,12 @@  discard block
 block discarded – undo
1013 1073
 function SetX($x)
1014 1074
 {
1015 1075
 	// Set x position
1016
-	if ($x >= 0)
1017
-		$this->x = $x;
1018
-	else
1019
-		$this->x = $this->w + $x;
1020
-}
1076
+	if ($x >= 0) {
1077
+			$this->x = $x;
1078
+	} else {
1079
+			$this->x = $this->w + $x;
1080
+	}
1081
+	}
1021 1082
 
1022 1083
 function GetY()
1023 1084
 {
@@ -1029,11 +1090,12 @@  discard block
 block discarded – undo
1029 1090
 {
1030 1091
 	// Set y position and reset x
1031 1092
 	$this->x = $this->lMargin;
1032
-	if ($y >= 0)
1033
-		$this->y = $y;
1034
-	else
1035
-		$this->y = $this->h + $y;
1036
-}
1093
+	if ($y >= 0) {
1094
+			$this->y = $y;
1095
+	} else {
1096
+			$this->y = $this->h + $y;
1097
+	}
1098
+	}
1037 1099
 
1038 1100
 /**
1039 1101
  * @param integer $x
@@ -1048,8 +1110,9 @@  discard block
 block discarded – undo
1048 1110
 function Output($name = '', $dest = '')
1049 1111
 {
1050 1112
 	// Output PDF to some destination
1051
-	if ($this->state < 3)
1052
-		$this->Close();
1113
+	if ($this->state < 3) {
1114
+			$this->Close();
1115
+	}
1053 1116
 	$dest = strtoupper($dest);
1054 1117
 	if ($dest == '')
1055 1118
 	{
@@ -1089,8 +1152,9 @@  discard block
 block discarded – undo
1089 1152
 		case 'F':
1090 1153
 			// Save to local file
1091 1154
 			$f = fopen($name, 'wb');
1092
-			if ( ! $f)
1093
-				$this->Error('Unable to create output file: '.$name);
1155
+			if ( ! $f) {
1156
+							$this->Error('Unable to create output file: '.$name);
1157
+			}
1094 1158
 			fwrite($f, $this->buffer, strlen($this->buffer));
1095 1159
 			fclose($f);
1096 1160
 			break;
@@ -1111,22 +1175,26 @@  discard block
 block discarded – undo
1111 1175
 function _dochecks()
1112 1176
 {
1113 1177
 	// Check availability of %F
1114
-	if (sprintf('%.1F', 1.0) != '1.0')
1115
-		$this->Error('This version of PHP is not supported');
1178
+	if (sprintf('%.1F', 1.0) != '1.0') {
1179
+			$this->Error('This version of PHP is not supported');
1180
+	}
1116 1181
 	// Check mbstring overloading
1117
-	if (ini_get('mbstring.func_overload') & 2)
1118
-		$this->Error('mbstring overloading must be disabled');
1182
+	if (ini_get('mbstring.func_overload') & 2) {
1183
+			$this->Error('mbstring overloading must be disabled');
1184
+	}
1119 1185
 	// Ensure runtime magic quotes are disabled
1120
-	if (get_magic_quotes_runtime())
1121
-		@set_magic_quotes_runtime(0);
1122
-}
1186
+	if (get_magic_quotes_runtime()) {
1187
+			@set_magic_quotes_runtime(0);
1188
+	}
1189
+	}
1123 1190
 
1124 1191
 function _checkoutput()
1125 1192
 {
1126 1193
 	if (PHP_SAPI != 'cli')
1127 1194
 	{
1128
-		if (headers_sent($file, $line))
1129
-			$this->Error("Some data has already been output, can't send PDF file (output started at $file:$line)");
1195
+		if (headers_sent($file, $line)) {
1196
+					$this->Error("Some data has already been output, can't send PDF file (output started at $file:$line)");
1197
+		}
1130 1198
 	}
1131 1199
 	if (ob_get_length())
1132 1200
 	{
@@ -1146,17 +1214,18 @@  discard block
 block discarded – undo
1146 1214
 	if (is_string($size))
1147 1215
 	{
1148 1216
 		$size = strtolower($size);
1149
-		if ( ! isset($this->StdPageSizes[$size]))
1150
-			$this->Error('Unknown page size: '.$size);
1217
+		if ( ! isset($this->StdPageSizes[$size])) {
1218
+					$this->Error('Unknown page size: '.$size);
1219
+		}
1151 1220
 		$a = $this->StdPageSizes[$size];
1152 1221
 		return array($a[0] / $this->k, $a[1] / $this->k);
1153
-	}
1154
-	else
1222
+	} else
1155 1223
 	{
1156
-		if ($size[0] > $size[1])
1157
-			return array($size[1], $size[0]);
1158
-		else
1159
-			return $size;
1224
+		if ($size[0] > $size[1]) {
1225
+					return array($size[1], $size[0]);
1226
+		} else {
1227
+					return $size;
1228
+		}
1160 1229
 	}
1161 1230
 }
1162 1231
 
@@ -1173,14 +1242,16 @@  discard block
 block discarded – undo
1173 1242
 	$this->y = $this->tMargin;
1174 1243
 	$this->FontFamily = '';
1175 1244
 	// Check page size and orientation
1176
-	if ($orientation == '')
1177
-		$orientation = $this->DefOrientation;
1178
-	else
1179
-		$orientation = strtoupper($orientation[0]);
1180
-	if ($size == '')
1181
-		$size = $this->DefPageSize;
1182
-	else
1183
-		$size = $this->_getpagesize($size);
1245
+	if ($orientation == '') {
1246
+			$orientation = $this->DefOrientation;
1247
+	} else {
1248
+			$orientation = strtoupper($orientation[0]);
1249
+	}
1250
+	if ($size == '') {
1251
+			$size = $this->DefPageSize;
1252
+	} else {
1253
+			$size = $this->_getpagesize($size);
1254
+	}
1184 1255
 	if ($orientation != $this->CurOrientation || $size[0] != $this->CurPageSize[0] || $size[1] != $this->CurPageSize[1])
1185 1256
 	{
1186 1257
 		// New size or orientation
@@ -1199,9 +1270,10 @@  discard block
 block discarded – undo
1199 1270
 		$this->CurOrientation = $orientation;
1200 1271
 		$this->CurPageSize = $size;
1201 1272
 	}
1202
-	if ($orientation != $this->DefOrientation || $size[0] != $this->DefPageSize[0] || $size[1] != $this->DefPageSize[1])
1203
-		$this->PageSizes[$this->page] = array($this->wPt, $this->hPt);
1204
-}
1273
+	if ($orientation != $this->DefOrientation || $size[0] != $this->DefPageSize[0] || $size[1] != $this->DefPageSize[1]) {
1274
+			$this->PageSizes[$this->page] = array($this->wPt, $this->hPt);
1275
+	}
1276
+	}
1205 1277
 
1206 1278
 function _endpage()
1207 1279
 {
@@ -1216,8 +1288,9 @@  discard block
 block discarded – undo
1216 1288
 	// Load a font definition file from the font directory
1217 1289
 	include($this->fontpath.$font);
1218 1290
 	$a = get_defined_vars();
1219
-	if ( ! isset($a['name']))
1220
-		$this->Error('Could not include font definition file');
1291
+	if ( ! isset($a['name'])) {
1292
+			$this->Error('Could not include font definition file');
1293
+	}
1221 1294
 	return $a;
1222 1295
 }
1223 1296
 
@@ -1253,15 +1326,13 @@  discard block
 block discarded – undo
1253 1326
 			$c3 = ord($s[$i++]);
1254 1327
 			$res .= chr((($c1 & 0x0F) << 4) + (($c2 & 0x3C) >> 2));
1255 1328
 			$res .= chr((($c2 & 0x03) << 6) + ($c3 & 0x3F));
1256
-		}
1257
-		elseif ($c1 >= 192)
1329
+		} elseif ($c1 >= 192)
1258 1330
 		{
1259 1331
 			// 2-byte character
1260 1332
 			$c2 = ord($s[$i++]);
1261 1333
 			$res .= chr(($c1 & 0x1C) >> 2);
1262 1334
 			$res .= chr((($c1 & 0x03) << 6) + ($c2 & 0x3F));
1263
-		}
1264
-		else
1335
+		} else
1265 1336
 		{
1266 1337
 			// Single-byte character
1267 1338
 			$res .= "\0".chr($c1);
@@ -1283,16 +1354,19 @@  discard block
 block discarded – undo
1283 1354
 {
1284 1355
 	// Extract info from a JPEG file
1285 1356
 	$a = getimagesize($file);
1286
-	if ( ! $a)
1287
-		$this->Error('Missing or incorrect image file: '.$file);
1288
-	if ($a[2] != 2)
1289
-		$this->Error('Not a JPEG file: '.$file);
1290
-	if ( ! isset($a['channels']) || $a['channels'] == 3)
1291
-		$colspace = 'DeviceRGB';
1292
-	elseif ($a['channels'] == 4)
1293
-		$colspace = 'DeviceCMYK';
1294
-	else
1295
-		$colspace = 'DeviceGray';
1357
+	if ( ! $a) {
1358
+			$this->Error('Missing or incorrect image file: '.$file);
1359
+	}
1360
+	if ($a[2] != 2) {
1361
+			$this->Error('Not a JPEG file: '.$file);
1362
+	}
1363
+	if ( ! isset($a['channels']) || $a['channels'] == 3) {
1364
+			$colspace = 'DeviceRGB';
1365
+	} elseif ($a['channels'] == 4) {
1366
+			$colspace = 'DeviceCMYK';
1367
+	} else {
1368
+			$colspace = 'DeviceGray';
1369
+	}
1296 1370
 	$bpc = isset($a['bits']) ? $a['bits'] : 8;
1297 1371
 	$data = file_get_contents($file);
1298 1372
 	return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data);
@@ -1305,8 +1379,9 @@  discard block
 block discarded – undo
1305 1379
 {
1306 1380
 	// Extract info from a PNG file
1307 1381
 	$f = fopen($file, 'rb');
1308
-	if ( ! $f)
1309
-		$this->Error('Can\'t open image file: '.$file);
1382
+	if ( ! $f) {
1383
+			$this->Error('Can\'t open image file: '.$file);
1384
+	}
1310 1385
 	$info = $this->_parsepngstream($f, $file);
1311 1386
 	fclose($f);
1312 1387
 	return $info;
@@ -1315,33 +1390,40 @@  discard block
 block discarded – undo
1315 1390
 function _parsepngstream($f, $file)
1316 1391
 {
1317 1392
 	// Check signature
1318
-	if ($this->_readstream($f, 8) != chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10))
1319
-		$this->Error('Not a PNG file: '.$file);
1393
+	if ($this->_readstream($f, 8) != chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) {
1394
+			$this->Error('Not a PNG file: '.$file);
1395
+	}
1320 1396
 
1321 1397
 	// Read header chunk
1322 1398
 	$this->_readstream($f, 4);
1323
-	if ($this->_readstream($f, 4) != 'IHDR')
1324
-		$this->Error('Incorrect PNG file: '.$file);
1399
+	if ($this->_readstream($f, 4) != 'IHDR') {
1400
+			$this->Error('Incorrect PNG file: '.$file);
1401
+	}
1325 1402
 	$w = $this->_readint($f);
1326 1403
 	$h = $this->_readint($f);
1327 1404
 	$bpc = ord($this->_readstream($f, 1));
1328
-	if ($bpc > 8)
1329
-		$this->Error('16-bit depth not supported: '.$file);
1405
+	if ($bpc > 8) {
1406
+			$this->Error('16-bit depth not supported: '.$file);
1407
+	}
1330 1408
 	$ct = ord($this->_readstream($f, 1));
1331
-	if ($ct == 0 || $ct == 4)
1332
-		$colspace = 'DeviceGray';
1333
-	elseif ($ct == 2 || $ct == 6)
1334
-		$colspace = 'DeviceRGB';
1335
-	elseif ($ct == 3)
1336
-		$colspace = 'Indexed';
1337
-	else
1338
-		$this->Error('Unknown color type: '.$file);
1339
-	if (ord($this->_readstream($f, 1)) != 0)
1340
-		$this->Error('Unknown compression method: '.$file);
1341
-	if (ord($this->_readstream($f, 1)) != 0)
1342
-		$this->Error('Unknown filter method: '.$file);
1343
-	if (ord($this->_readstream($f, 1)) != 0)
1344
-		$this->Error('Interlacing not supported: '.$file);
1409
+	if ($ct == 0 || $ct == 4) {
1410
+			$colspace = 'DeviceGray';
1411
+	} elseif ($ct == 2 || $ct == 6) {
1412
+			$colspace = 'DeviceRGB';
1413
+	} elseif ($ct == 3) {
1414
+			$colspace = 'Indexed';
1415
+	} else {
1416
+			$this->Error('Unknown color type: '.$file);
1417
+	}
1418
+	if (ord($this->_readstream($f, 1)) != 0) {
1419
+			$this->Error('Unknown compression method: '.$file);
1420
+	}
1421
+	if (ord($this->_readstream($f, 1)) != 0) {
1422
+			$this->Error('Unknown filter method: '.$file);
1423
+	}
1424
+	if (ord($this->_readstream($f, 1)) != 0) {
1425
+			$this->Error('Interlacing not supported: '.$file);
1426
+	}
1345 1427
 	$this->_readstream($f, 4);
1346 1428
 	$dp = '/Predictor 15 /Colors '.($colspace == 'DeviceRGB' ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w;
1347 1429
 
@@ -1358,44 +1440,45 @@  discard block
 block discarded – undo
1358 1440
 			// Read palette
1359 1441
 			$pal = $this->_readstream($f, $n);
1360 1442
 			$this->_readstream($f, 4);
1361
-		}
1362
-		elseif ($type == 'tRNS')
1443
+		} elseif ($type == 'tRNS')
1363 1444
 		{
1364 1445
 			// Read transparency info
1365 1446
 			$t = $this->_readstream($f, $n);
1366
-			if ($ct == 0)
1367
-				$trns = array(ord(substr($t, 1, 1)));
1368
-			elseif ($ct == 2)
1369
-				$trns = array(ord(substr($t, 1, 1)), ord(substr($t, 3, 1)), ord(substr($t, 5, 1)));
1370
-			else
1447
+			if ($ct == 0) {
1448
+							$trns = array(ord(substr($t, 1, 1)));
1449
+			} elseif ($ct == 2) {
1450
+							$trns = array(ord(substr($t, 1, 1)), ord(substr($t, 3, 1)), ord(substr($t, 5, 1)));
1451
+			} else
1371 1452
 			{
1372 1453
 				$pos = strpos($t, chr(0));
1373
-				if ($pos !== false)
1374
-					$trns = array($pos);
1454
+				if ($pos !== false) {
1455
+									$trns = array($pos);
1456
+				}
1375 1457
 			}
1376 1458
 			$this->_readstream($f, 4);
1377
-		}
1378
-		elseif ($type == 'IDAT')
1459
+		} elseif ($type == 'IDAT')
1379 1460
 		{
1380 1461
 			// Read image data block
1381 1462
 			$data .= $this->_readstream($f, $n);
1382 1463
 			$this->_readstream($f, 4);
1383
-		}
1384
-		elseif ($type == 'IEND')
1385
-			break;
1386
-		else
1387
-			$this->_readstream($f, $n + 4);
1464
+		} elseif ($type == 'IEND') {
1465
+					break;
1466
+		} else {
1467
+					$this->_readstream($f, $n + 4);
1468
+		}
1388 1469
 	}
1389 1470
 	while ($n);
1390 1471
 
1391
-	if ($colspace == 'Indexed' && empty($pal))
1392
-		$this->Error('Missing palette in '.$file);
1472
+	if ($colspace == 'Indexed' && empty($pal)) {
1473
+			$this->Error('Missing palette in '.$file);
1474
+	}
1393 1475
 	$info = array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'dp'=>$dp, 'pal'=>$pal, 'trns'=>$trns);
1394 1476
 	if ($ct >= 4)
1395 1477
 	{
1396 1478
 		// Extract alpha channel
1397
-		if ( ! function_exists('gzuncompress'))
1398
-			$this->Error('Zlib not available, can\'t handle alpha channel: '.$file);
1479
+		if ( ! function_exists('gzuncompress')) {
1480
+					$this->Error('Zlib not available, can\'t handle alpha channel: '.$file);
1481
+		}
1399 1482
 		$data = gzuncompress($data);
1400 1483
 		$color = '';
1401 1484
 		$alpha = '';
@@ -1429,8 +1512,9 @@  discard block
 block discarded – undo
1429 1512
 		unset($data);
1430 1513
 		$data = gzcompress($color);
1431 1514
 		$info['smask'] = gzcompress($alpha);
1432
-		if ($this->PDFVersion < '1.4')
1433
-			$this->PDFVersion = '1.4';
1515
+		if ($this->PDFVersion < '1.4') {
1516
+					$this->PDFVersion = '1.4';
1517
+		}
1434 1518
 	}
1435 1519
 	$info['data'] = $data;
1436 1520
 	return $info;
@@ -1443,13 +1527,15 @@  discard block
 block discarded – undo
1443 1527
 	while ($n > 0 && ! feof($f))
1444 1528
 	{
1445 1529
 		$s = fread($f, $n);
1446
-		if ($s === false)
1447
-			$this->Error('Error while reading stream');
1530
+		if ($s === false) {
1531
+					$this->Error('Error while reading stream');
1532
+		}
1448 1533
 		$n -= strlen($s);
1449 1534
 		$res .= $s;
1450 1535
 	}
1451
-	if ($n > 0)
1452
-		$this->Error('Unexpected end of stream');
1536
+	if ($n > 0) {
1537
+			$this->Error('Unexpected end of stream');
1538
+	}
1453 1539
 	return $res;
1454 1540
 }
1455 1541
 
@@ -1463,13 +1549,16 @@  discard block
 block discarded – undo
1463 1549
 function _parsegif($file)
1464 1550
 {
1465 1551
 	// Extract info from a GIF file (via PNG conversion)
1466
-	if ( ! function_exists('imagepng'))
1467
-		$this->Error('GD extension is required for GIF support');
1468
-	if ( ! function_exists('imagecreatefromgif'))
1469
-		$this->Error('GD has no GIF read support');
1552
+	if ( ! function_exists('imagepng')) {
1553
+			$this->Error('GD extension is required for GIF support');
1554
+	}
1555
+	if ( ! function_exists('imagecreatefromgif')) {
1556
+			$this->Error('GD has no GIF read support');
1557
+	}
1470 1558
 	$im = imagecreatefromgif($file);
1471
-	if ( ! $im)
1472
-		$this->Error('Missing or incorrect image file: '.$file);
1559
+	if ( ! $im) {
1560
+			$this->Error('Missing or incorrect image file: '.$file);
1561
+	}
1473 1562
 	imageinterlace($im, 0);
1474 1563
 	$f = @fopen('php://temp', 'rb+');
1475 1564
 	if ($f)
@@ -1483,15 +1572,16 @@  discard block
 block discarded – undo
1483 1572
 		rewind($f);
1484 1573
 		$info = $this->_parsepngstream($f, $file);
1485 1574
 		fclose($f);
1486
-	}
1487
-	else
1575
+	} else
1488 1576
 	{
1489 1577
 		// Use temporary file
1490 1578
 		$tmp = tempnam('.', 'gif');
1491
-		if ( ! $tmp)
1492
-			$this->Error('Unable to create a temporary file');
1493
-		if ( ! imagepng($im, $tmp))
1494
-			$this->Error('Error while saving to temporary file');
1579
+		if ( ! $tmp) {
1580
+					$this->Error('Unable to create a temporary file');
1581
+		}
1582
+		if ( ! imagepng($im, $tmp)) {
1583
+					$this->Error('Error while saving to temporary file');
1584
+		}
1495 1585
 		imagedestroy($im);
1496 1586
 		$info = $this->_parsepng($tmp);
1497 1587
 		unlink($tmp);
@@ -1517,11 +1607,12 @@  discard block
 block discarded – undo
1517 1607
 function _out($s)
1518 1608
 {
1519 1609
 	// Add a line to the document
1520
-	if ($this->state == 2)
1521
-		$this->pages[$this->page] .= $s."\n";
1522
-	else
1523
-		$this->buffer .= $s."\n";
1524
-}
1610
+	if ($this->state == 2) {
1611
+			$this->pages[$this->page] .= $s."\n";
1612
+	} else {
1613
+			$this->buffer .= $s."\n";
1614
+	}
1615
+	}
1525 1616
 
1526 1617
 function _putpages()
1527 1618
 {
@@ -1529,15 +1620,15 @@  discard block
 block discarded – undo
1529 1620
 	if ( ! empty($this->AliasNbPages))
1530 1621
 	{
1531 1622
 		// Replace number of pages
1532
-		for ($n = 1; $n <= $nb; $n++)
1533
-			$this->pages[$n] = str_replace($this->AliasNbPages, $nb, $this->pages[$n]);
1623
+		for ($n = 1; $n <= $nb; $n++) {
1624
+					$this->pages[$n] = str_replace($this->AliasNbPages, $nb, $this->pages[$n]);
1625
+		}
1534 1626
 	}
1535 1627
 	if ($this->DefOrientation == 'P')
1536 1628
 	{
1537 1629
 		$wPt = $this->DefPageSize[0] * $this->k;
1538 1630
 		$hPt = $this->DefPageSize[1] * $this->k;
1539
-	}
1540
-	else
1631
+	} else
1541 1632
 	{
1542 1633
 		$wPt = $this->DefPageSize[1] * $this->k;
1543 1634
 		$hPt = $this->DefPageSize[0] * $this->k;
@@ -1549,8 +1640,9 @@  discard block
 block discarded – undo
1549 1640
 		$this->_newobj();
1550 1641
 		$this->_out('<</Type /Page');
1551 1642
 		$this->_out('/Parent 1 0 R');
1552
-		if (isset($this->PageSizes[$n]))
1553
-			$this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]', $this->PageSizes[$n][0], $this->PageSizes[$n][1]));
1643
+		if (isset($this->PageSizes[$n])) {
1644
+					$this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]', $this->PageSizes[$n][0], $this->PageSizes[$n][1]));
1645
+		}
1554 1646
 		$this->_out('/Resources 2 0 R');
1555 1647
 		if (isset($this->PageLinks[$n]))
1556 1648
 		{
@@ -1560,9 +1652,9 @@  discard block
 block discarded – undo
1560 1652
 			{
1561 1653
 				$rect = sprintf('%.2F %.2F %.2F %.2F', $pl[0], $pl[1], $pl[0] + $pl[2], $pl[1] - $pl[3]);
1562 1654
 				$annots .= '<</Type /Annot /Subtype /Link /Rect ['.$rect.'] /Border [0 0 0] ';
1563
-				if (is_string($pl[4]))
1564
-					$annots .= '/A <</S /URI /URI '.$this->_textstring($pl[4]).'>>>>';
1565
-				else
1655
+				if (is_string($pl[4])) {
1656
+									$annots .= '/A <</S /URI /URI '.$this->_textstring($pl[4]).'>>>>';
1657
+				} else
1566 1658
 				{
1567 1659
 					$l = $this->links[$pl[4]];
1568 1660
 					$h = isset($this->PageSizes[$l[0]]) ? $this->PageSizes[$l[0]][1] : $hPt;
@@ -1571,8 +1663,9 @@  discard block
 block discarded – undo
1571 1663
 			}
1572 1664
 			$this->_out($annots.']');
1573 1665
 		}
1574
-		if ($this->PDFVersion > '1.3')
1575
-			$this->_out('/Group <</Type /Group /S /Transparency /CS /DeviceRGB>>');
1666
+		if ($this->PDFVersion > '1.3') {
1667
+					$this->_out('/Group <</Type /Group /S /Transparency /CS /DeviceRGB>>');
1668
+		}
1576 1669
 		$this->_out('/Contents '.($this->n + 1).' 0 R>>');
1577 1670
 		$this->_out('endobj');
1578 1671
 		// Page content
@@ -1587,8 +1680,9 @@  discard block
 block discarded – undo
1587 1680
 	$this->_out('1 0 obj');
1588 1681
 	$this->_out('<</Type /Pages');
1589 1682
 	$kids = '/Kids [';
1590
-	for ($i = 0; $i < $nb; $i++)
1591
-		$kids .= (3 + 2 * $i).' 0 R ';
1683
+	for ($i = 0; $i < $nb; $i++) {
1684
+			$kids .= (3 + 2 * $i).' 0 R ';
1685
+	}
1592 1686
 	$this->_out($kids.']');
1593 1687
 	$this->_out('/Count '.$nb);
1594 1688
 	$this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]', $wPt, $hPt));
@@ -1612,17 +1706,21 @@  discard block
 block discarded – undo
1612 1706
 		$this->_newobj();
1613 1707
 		$this->FontFiles[$file]['n'] = $this->n;
1614 1708
 		$font = file_get_contents($this->fontpath.$file, true);
1615
-		if ( ! $font)
1616
-			$this->Error('Font file not found: '.$file);
1709
+		if ( ! $font) {
1710
+					$this->Error('Font file not found: '.$file);
1711
+		}
1617 1712
 		$compressed = (substr($file, -2) == '.z');
1618
-		if ( ! $compressed && isset($info['length2']))
1619
-			$font = substr($font, 6, $info['length1']).substr($font, 6 + $info['length1'] + 6, $info['length2']);
1713
+		if ( ! $compressed && isset($info['length2'])) {
1714
+					$font = substr($font, 6, $info['length1']).substr($font, 6 + $info['length1'] + 6, $info['length2']);
1715
+		}
1620 1716
 		$this->_out('<</Length '.strlen($font));
1621
-		if ($compressed)
1622
-			$this->_out('/Filter /FlateDecode');
1717
+		if ($compressed) {
1718
+					$this->_out('/Filter /FlateDecode');
1719
+		}
1623 1720
 		$this->_out('/Length1 '.$info['length1']);
1624
-		if (isset($info['length2']))
1625
-			$this->_out('/Length2 '.$info['length2'].' /Length3 0');
1721
+		if (isset($info['length2'])) {
1722
+					$this->_out('/Length2 '.$info['length2'].' /Length3 0');
1723
+		}
1626 1724
 		$this->_out('>>');
1627 1725
 		$this->_putstream($font);
1628 1726
 		$this->_out('endobj');
@@ -1640,12 +1738,12 @@  discard block
 block discarded – undo
1640 1738
 			$this->_out('<</Type /Font');
1641 1739
 			$this->_out('/BaseFont /'.$name);
1642 1740
 			$this->_out('/Subtype /Type1');
1643
-			if ($name != 'Symbol' && $name != 'ZapfDingbats')
1644
-				$this->_out('/Encoding /WinAnsiEncoding');
1741
+			if ($name != 'Symbol' && $name != 'ZapfDingbats') {
1742
+							$this->_out('/Encoding /WinAnsiEncoding');
1743
+			}
1645 1744
 			$this->_out('>>');
1646 1745
 			$this->_out('endobj');
1647
-		}
1648
-		elseif ($type == 'Type1' || $type == 'TrueType')
1746
+		} elseif ($type == 'Type1' || $type == 'TrueType')
1649 1747
 		{
1650 1748
 			// Additional Type1 or TrueType/OpenType font
1651 1749
 			$this->_newobj();
@@ -1655,36 +1753,40 @@  discard block
 block discarded – undo
1655 1753
 			$this->_out('/FirstChar 32 /LastChar 255');
1656 1754
 			$this->_out('/Widths '.($this->n + 1).' 0 R');
1657 1755
 			$this->_out('/FontDescriptor '.($this->n + 2).' 0 R');
1658
-			if (isset($font['diffn']))
1659
-				$this->_out('/Encoding '.($nf + $font['diffn']).' 0 R');
1660
-			else
1661
-				$this->_out('/Encoding /WinAnsiEncoding');
1756
+			if (isset($font['diffn'])) {
1757
+							$this->_out('/Encoding '.($nf + $font['diffn']).' 0 R');
1758
+			} else {
1759
+							$this->_out('/Encoding /WinAnsiEncoding');
1760
+			}
1662 1761
 			$this->_out('>>');
1663 1762
 			$this->_out('endobj');
1664 1763
 			// Widths
1665 1764
 			$this->_newobj();
1666 1765
 			$cw = &$font['cw'];
1667 1766
 			$s = '[';
1668
-			for ($i = 32; $i <= 255; $i++)
1669
-				$s .= $cw[chr($i)].' ';
1767
+			for ($i = 32; $i <= 255; $i++) {
1768
+							$s .= $cw[chr($i)].' ';
1769
+			}
1670 1770
 			$this->_out($s.']');
1671 1771
 			$this->_out('endobj');
1672 1772
 			// Descriptor
1673 1773
 			$this->_newobj();
1674 1774
 			$s = '<</Type /FontDescriptor /FontName /'.$name;
1675
-			foreach ($font['desc'] as $k=>$v)
1676
-				$s .= ' /'.$k.' '.$v;
1677
-			if ( ! empty($font['file']))
1678
-				$s .= ' /FontFile'.($type == 'Type1' ? '' : '2').' '.$this->FontFiles[$font['file']]['n'].' 0 R';
1775
+			foreach ($font['desc'] as $k=>$v) {
1776
+							$s .= ' /'.$k.' '.$v;
1777
+			}
1778
+			if ( ! empty($font['file'])) {
1779
+							$s .= ' /FontFile'.($type == 'Type1' ? '' : '2').' '.$this->FontFiles[$font['file']]['n'].' 0 R';
1780
+			}
1679 1781
 			$this->_out($s.'>>');
1680 1782
 			$this->_out('endobj');
1681
-		}
1682
-		else
1783
+		} else
1683 1784
 		{
1684 1785
 			// Allow for additional types
1685 1786
 			$mtd = '_put'.strtolower($type);
1686
-			if ( ! method_exists($this, $mtd))
1687
-				$this->Error('Unsupported font type: '.$type);
1787
+			if ( ! method_exists($this, $mtd)) {
1788
+							$this->Error('Unsupported font type: '.$type);
1789
+			}
1688 1790
 			$this->$mtd($font);
1689 1791
 		}
1690 1792
 	}
@@ -1708,28 +1810,33 @@  discard block
 block discarded – undo
1708 1810
 	$this->_out('/Subtype /Image');
1709 1811
 	$this->_out('/Width '.$info['w']);
1710 1812
 	$this->_out('/Height '.$info['h']);
1711
-	if ($info['cs'] == 'Indexed')
1712
-		$this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal']) / 3 - 1).' '.($this->n + 1).' 0 R]');
1713
-	else
1813
+	if ($info['cs'] == 'Indexed') {
1814
+			$this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal']) / 3 - 1).' '.($this->n + 1).' 0 R]');
1815
+	} else
1714 1816
 	{
1715 1817
 		$this->_out('/ColorSpace /'.$info['cs']);
1716
-		if ($info['cs'] == 'DeviceCMYK')
1717
-			$this->_out('/Decode [1 0 1 0 1 0 1 0]');
1818
+		if ($info['cs'] == 'DeviceCMYK') {
1819
+					$this->_out('/Decode [1 0 1 0 1 0 1 0]');
1820
+		}
1718 1821
 	}
1719 1822
 	$this->_out('/BitsPerComponent '.$info['bpc']);
1720
-	if (isset($info['f']))
1721
-		$this->_out('/Filter /'.$info['f']);
1722
-	if (isset($info['dp']))
1723
-		$this->_out('/DecodeParms <<'.$info['dp'].'>>');
1823
+	if (isset($info['f'])) {
1824
+			$this->_out('/Filter /'.$info['f']);
1825
+	}
1826
+	if (isset($info['dp'])) {
1827
+			$this->_out('/DecodeParms <<'.$info['dp'].'>>');
1828
+	}
1724 1829
 	if (isset($info['trns']) && is_array($info['trns']))
1725 1830
 	{
1726 1831
 		$trns = '';
1727
-		for ($i = 0; $i < count($info['trns']); $i++)
1728
-			$trns .= $info['trns'][$i].' '.$info['trns'][$i].' ';
1832
+		for ($i = 0; $i < count($info['trns']); $i++) {
1833
+					$trns .= $info['trns'][$i].' '.$info['trns'][$i].' ';
1834
+		}
1729 1835
 		$this->_out('/Mask ['.$trns.']');
1730 1836
 	}
1731
-	if (isset($info['smask']))
1732
-		$this->_out('/SMask '.($this->n + 1).' 0 R');
1837
+	if (isset($info['smask'])) {
1838
+			$this->_out('/SMask '.($this->n + 1).' 0 R');
1839
+	}
1733 1840
 	$this->_out('/Length '.strlen($info['data']).'>>');
1734 1841
 	$this->_putstream($info['data']);
1735 1842
 	$this->_out('endobj');
@@ -1754,16 +1861,18 @@  discard block
 block discarded – undo
1754 1861
 
1755 1862
 function _putxobjectdict()
1756 1863
 {
1757
-	foreach ($this->images as $image)
1758
-		$this->_out('/I'.$image['i'].' '.$image['n'].' 0 R');
1759
-}
1864
+	foreach ($this->images as $image) {
1865
+			$this->_out('/I'.$image['i'].' '.$image['n'].' 0 R');
1866
+	}
1867
+	}
1760 1868
 
1761 1869
 function _putresourcedict()
1762 1870
 {
1763 1871
 	$this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
1764 1872
 	$this->_out('/Font <<');
1765
-	foreach ($this->fonts as $font)
1766
-		$this->_out('/F'.$font['i'].' '.$font['n'].' 0 R');
1873
+	foreach ($this->fonts as $font) {
1874
+			$this->_out('/F'.$font['i'].' '.$font['n'].' 0 R');
1875
+	}
1767 1876
 	$this->_out('>>');
1768 1877
 	$this->_out('/XObject <<');
1769 1878
 	$this->_putxobjectdict();
@@ -1786,16 +1895,21 @@  discard block
 block discarded – undo
1786 1895
 function _putinfo()
1787 1896
 {
1788 1897
 	$this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION));
1789
-	if ( ! empty($this->title))
1790
-		$this->_out('/Title '.$this->_textstring($this->title));
1791
-	if ( ! empty($this->subject))
1792
-		$this->_out('/Subject '.$this->_textstring($this->subject));
1793
-	if ( ! empty($this->author))
1794
-		$this->_out('/Author '.$this->_textstring($this->author));
1795
-	if ( ! empty($this->keywords))
1796
-		$this->_out('/Keywords '.$this->_textstring($this->keywords));
1797
-	if ( ! empty($this->creator))
1798
-		$this->_out('/Creator '.$this->_textstring($this->creator));
1898
+	if ( ! empty($this->title)) {
1899
+			$this->_out('/Title '.$this->_textstring($this->title));
1900
+	}
1901
+	if ( ! empty($this->subject)) {
1902
+			$this->_out('/Subject '.$this->_textstring($this->subject));
1903
+	}
1904
+	if ( ! empty($this->author)) {
1905
+			$this->_out('/Author '.$this->_textstring($this->author));
1906
+	}
1907
+	if ( ! empty($this->keywords)) {
1908
+			$this->_out('/Keywords '.$this->_textstring($this->keywords));
1909
+	}
1910
+	if ( ! empty($this->creator)) {
1911
+			$this->_out('/Creator '.$this->_textstring($this->creator));
1912
+	}
1799 1913
 	$this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis')));
1800 1914
 }
1801 1915
 
@@ -1803,21 +1917,23 @@  discard block
 block discarded – undo
1803 1917
 {
1804 1918
 	$this->_out('/Type /Catalog');
1805 1919
 	$this->_out('/Pages 1 0 R');
1806
-	if ($this->ZoomMode == 'fullpage')
1807
-		$this->_out('/OpenAction [3 0 R /Fit]');
1808
-	elseif ($this->ZoomMode == 'fullwidth')
1809
-		$this->_out('/OpenAction [3 0 R /FitH null]');
1810
-	elseif ($this->ZoomMode == 'real')
1811
-		$this->_out('/OpenAction [3 0 R /XYZ null null 1]');
1812
-	elseif ( ! is_string($this->ZoomMode))
1813
-		$this->_out('/OpenAction [3 0 R /XYZ null null '.sprintf('%.2F', $this->ZoomMode / 100).']');
1814
-	if ($this->LayoutMode == 'single')
1815
-		$this->_out('/PageLayout /SinglePage');
1816
-	elseif ($this->LayoutMode == 'continuous')
1817
-		$this->_out('/PageLayout /OneColumn');
1818
-	elseif ($this->LayoutMode == 'two')
1819
-		$this->_out('/PageLayout /TwoColumnLeft');
1820
-}
1920
+	if ($this->ZoomMode == 'fullpage') {
1921
+			$this->_out('/OpenAction [3 0 R /Fit]');
1922
+	} elseif ($this->ZoomMode == 'fullwidth') {
1923
+			$this->_out('/OpenAction [3 0 R /FitH null]');
1924
+	} elseif ($this->ZoomMode == 'real') {
1925
+			$this->_out('/OpenAction [3 0 R /XYZ null null 1]');
1926
+	} elseif ( ! is_string($this->ZoomMode)) {
1927
+			$this->_out('/OpenAction [3 0 R /XYZ null null '.sprintf('%.2F', $this->ZoomMode / 100).']');
1928
+	}
1929
+	if ($this->LayoutMode == 'single') {
1930
+			$this->_out('/PageLayout /SinglePage');
1931
+	} elseif ($this->LayoutMode == 'continuous') {
1932
+			$this->_out('/PageLayout /OneColumn');
1933
+	} elseif ($this->LayoutMode == 'two') {
1934
+			$this->_out('/PageLayout /TwoColumnLeft');
1935
+	}
1936
+	}
1821 1937
 
1822 1938
 function _putheader()
1823 1939
 {
@@ -1853,8 +1969,9 @@  discard block
 block discarded – undo
1853 1969
 	$this->_out('xref');
1854 1970
 	$this->_out('0 '.($this->n + 1));
1855 1971
 	$this->_out('0000000000 65535 f ');
1856
-	for ($i = 1; $i <= $this->n; $i++)
1857
-		$this->_out(sprintf('%010d 00000 n ', $this->offsets[$i]));
1972
+	for ($i = 1; $i <= $this->n; $i++) {
1973
+			$this->_out(sprintf('%010d 00000 n ', $this->offsets[$i]));
1974
+	}
1858 1975
 	// Trailer
1859 1976
 	$this->_out('trailer');
1860 1977
 	$this->_out('<<');
Please login to merge, or discard this patch.
web_interface/astpp/system/libraries/Ftp.php 1 patch
Doc Comments   +1 added lines patch added patch discarded remove patch
@@ -461,6 +461,7 @@
 block discarded – undo
461 461
 	 * @param	string	the file path
462 462
 	 * @param	string	the permissions
463 463
 	 * @param integer $perm
464
+	 * @param string $path
464 465
 	 * @return	bool
465 466
 	 */
466 467
 	function chmod($path, $perm)
Please login to merge, or discard this patch.