source: trunk/client/inc/hpdf403/_class/myPdf.class.php@ 421

Last change on this file since 421 was 349, checked in by roby, 4 years ago
File size: 42.9 KB
Line 
1<?php
2/**
3 * HTML2PDF Librairy - myPdf class
4 *
5 * HTML => PDF convertor
6 * distributed under the LGPL License
7 *
8 * @author Laurent MINGUET <webmaster@html2pdf.fr>
9 * @version 4.03
10 */
11
12require_once(dirname(__FILE__).'/tcpdfConfig.php');
13require_once(dirname(__FILE__).'/../_tcpdf_'.HTML2PDF_USED_TCPDF_VERSION.'/tcpdf.php');
14
15class HTML2PDF_myPdf extends TCPDF
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 * @access public
135 */
136 public function cloneFontFrom(&$pdf)
137 {
138 $this->fonts = &$pdf->getFonts();
139 $this->FontFiles = &$pdf->getFontFiles();
140 $this->diffs = &$pdf->getDiffs();
141 $this->fontlist = &$pdf->getFontList();
142 $this->numfonts = &$pdf->getNumFonts();
143 $this->fontkeys = &$pdf->getFontKeys();
144 $this->font_obj_ids = &$pdf->getFontObjIds();
145 $this->annotation_fonts = &$pdf->getAnnotFonts();
146 }
147
148 /**
149 * multiple public accessor for some private attributs
150 * used only by cloneFontFrom
151 *
152 * @return &array
153 * @access public
154 */
155 public function &getFonts()
156 {
157 return $this->fonts;
158 }
159 public function &getFontFiles()
160 {
161 return $this->FontFiles;
162 }
163 public function &getDiffs()
164 {
165 return $this->diffs;
166 }
167 public function &getFontList()
168 {
169 return $this->fontlist;
170 }
171 public function &getNumFonts()
172 {
173 return $this->numfonts;
174 }
175 public function &getFontKeys()
176 {
177 return $this->fontkeys;
178 }
179 public function &getFontObjIds()
180 {
181 return $this->font_obj_ids;
182 }
183 public function &getAnnotFonts()
184 {
185 return $this->annotation_fonts;
186 }
187
188 /**
189 * Verify that a Font is already loaded
190 *
191 * @param string Font Key
192 * @return boolean
193 * @access public
194 */
195 public function isLoadedFont($fontKey)
196 {
197 if (isset($this->fonts[$fontKey])) {
198 return true;
199 }
200
201 if (isset($this->CoreFonts[$fontKey])) {
202 return true;
203 }
204
205 return false;
206 }
207
208 /**
209 * Get the Word Spacing
210 *
211 * @access public
212 * @return float word spacing
213 */
214 public function getWordSpacing()
215 {
216 return $this->ws;
217 }
218
219 /**
220 * set the Word Spacing
221 *
222 * @param float word spacing
223 * @access public
224 */
225 public function setWordSpacing($ws=0.)
226 {
227 $this->ws = $ws;
228 $this->_out(sprintf('%.3F Tw', $ws*$this->k));
229 }
230
231 /**
232 * start to use a rectangular Cliping Path with radius corners
233 *
234 * @param float $x (top left corner)
235 * @param float $y (top left corner)
236 * @param float $w (x+w = botom rigth corner)
237 * @param float $h (y+h = botom rigth corner)
238 * @param array $cornerTL radius of the Top Left corner
239 * @param array $cornerTR radius of the Top Right corner
240 * @param array $cornerBL radius of the Bottom Left corner
241 * @param array $cornerBR radius of the Bottom Right corner
242 * @access public
243 */
244 public function clippingPathStart(
245 $x = null,
246 $y = null,
247 $w = null,
248 $h = null,
249 $cornerTL=null,
250 $cornerTR=null,
251 $cornerBL=null,
252 $cornerBR=null)
253 {
254 // init the path
255 $path = '';
256
257 // if we have the position and the size of the rectangle, we can proceed
258 if ($x!==null && $y!==null && $w!==null && $h!==null) {
259 // the positions of the rectangle's corners
260 $x1 = $x*$this->k;
261 $y1 = ($this->h-$y)*$this->k;
262
263 $x2 = ($x+$w)*$this->k;
264 $y2 = ($this->h-$y)*$this->k;
265
266 $x3 = ($x+$w)*$this->k;
267 $y3 = ($this->h-$y-$h)*$this->k;
268
269 $x4 = $x*$this->k;
270 $y4 = ($this->h-$y-$h)*$this->k;
271
272 // if we have at least one radius corner, then we proceed to a specific path, else it is just a rectangle
273 if ($cornerTL || $cornerTR || $cornerBL || $cornerBR) {
274 // prepare the radius values
275 if ($cornerTL) {
276 $cornerTL[0] = $cornerTL[0]*$this->k;
277 $cornerTL[1] =-$cornerTL[1]*$this->k;
278 }
279 if ($cornerTR) {
280 $cornerTR[0] = $cornerTR[0]*$this->k;
281 $cornerTR[1] =-$cornerTR[1]*$this->k;
282 }
283 if ($cornerBL) {
284 $cornerBL[0] = $cornerBL[0]*$this->k;
285 $cornerBL[1] =-$cornerBL[1]*$this->k;
286 }
287 if ($cornerBR) {
288 $cornerBR[0] = $cornerBR[0]*$this->k;
289 $cornerBR[1] =-$cornerBR[1]*$this->k;
290 }
291
292 // if TL radius then specific start else (X1,Y1)
293 if ($cornerTL) {
294 $path.= sprintf('%.2F %.2F m ', $x1+$cornerTL[0], $y1);
295 } else {
296 $path.= sprintf('%.2F %.2F m ', $x1, $y1);
297 }
298
299 // if TR radius then line + arc, else line to (X2,Y2)
300 if ($cornerTR) {
301 $xt1 = ($x2-$cornerTR[0])+$cornerTR[0]*self::MY_ARC;
302 $yt1 = ($y2+$cornerTR[1])-$cornerTR[1];
303 $xt2 = ($x2-$cornerTR[0])+$cornerTR[0];
304 $yt2 = ($y2+$cornerTR[1])-$cornerTR[1]*self::MY_ARC;
305
306 $path.= sprintf('%.2F %.2F l ', $x2-$cornerTR[0], $y2);
307 $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x2, $y2+$cornerTR[1]);
308 } else {
309 $path.= sprintf('%.2F %.2F l ', $x2, $y2);
310 }
311
312 // if BR radius then line + arc, else line to (X3, Y3)
313 if ($cornerBR) {
314 $xt1 = ($x3-$cornerBR[0])+$cornerBR[0];
315 $yt1 = ($y3-$cornerBR[1])+$cornerBR[1]*self::MY_ARC;
316 $xt2 = ($x3-$cornerBR[0])+$cornerBR[0]*self::MY_ARC;
317 $yt2 = ($y3-$cornerBR[1])+$cornerBR[1];
318
319 $path.= sprintf('%.2F %.2F l ', $x3, $y3-$cornerBR[1]);
320 $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x3-$cornerBR[0], $y3);
321 } else {
322 $path.= sprintf('%.2F %.2F l ', $x3, $y3);
323 }
324
325 // if BL radius then line + arc, else line to (X4, Y4)
326 if ($cornerBL) {
327 $xt1 = ($x4+$cornerBL[0])-$cornerBL[0]*self::MY_ARC;
328 $yt1 = ($y4-$cornerBL[1])+$cornerBL[1];
329 $xt2 = ($x4+$cornerBL[0])-$cornerBL[0];
330 $yt2 = ($y4-$cornerBL[1])+$cornerBL[1]*self::MY_ARC;
331
332 $path.= sprintf('%.2F %.2F l ', $x4+$cornerBL[0], $y4);
333 $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x4, $y4-$cornerBL[1]);
334 } else {
335 $path.= sprintf('%.2F %.2F l ', $x4, $y4);
336 }
337
338 // if RL radius then line + arc
339 if ($cornerTL) {
340 $xt1 = ($x1+$cornerTL[0])-$cornerTL[0];
341 $yt1 = ($y1+$cornerTL[1])-$cornerTL[1]*self::MY_ARC;
342 $xt2 = ($x1+$cornerTL[0])-$cornerTL[0]*self::MY_ARC;
343 $yt2 = ($y1+$cornerTL[1])-$cornerTL[1];
344
345 $path.= sprintf('%.2F %.2F l ', $x1, $y1+$cornerTL[1]);
346 $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x1+$cornerTL[0], $y1);
347 }
348 } else {
349 $path.= sprintf('%.2F %.2F m ', $x1, $y1);
350 $path.= sprintf('%.2F %.2F l ', $x2, $y2);
351 $path.= sprintf('%.2F %.2F l ', $x3, $y3);
352 $path.= sprintf('%.2F %.2F l ', $x4, $y4);
353 }
354
355 // close the path
356 $path.= ' h W n';
357 }
358
359 // using the path as a clipping path
360 $this->_out('q '.$path.' ');
361 }
362
363 /**
364 * stop to use the Cliping Path
365 *
366 * @access public
367 */
368 public function clippingPathStop()
369 {
370 $this->_out(' Q');
371 }
372
373 /**
374 * draw a filled corner of a border with a external and a internal radius
375 * /--------+ ext2
376 * / |
377 * / /-------+ int2
378 * / /
379 * | /
380 * | |
381 * | |
382 * ext1 +-+ int1 + cen
383 *
384 * @param float $ext1X
385 * @param float $ext1Y
386 * @param float $ext2X
387 * @param float $ext2Y
388 * @param float $int1X
389 * @param float $int1Y
390 * @param float $int2X
391 * @param float $int2Y
392 * @param float $cenX
393 * @param float $cenY
394 * @access public
395 */
396 public function drawCurve($ext1X, $ext1Y, $ext2X, $ext2Y, $int1X, $int1Y, $int2X, $int2Y, $cenX, $cenY)
397 {
398 // prepare the coordinates
399 $ext1X = $ext1X*$this->k;
400 $ext2X = $ext2X*$this->k;
401 $int1X = $int1X*$this->k;
402 $int2X = $int2X*$this->k;
403 $cenX = $cenX*$this->k;
404
405 $ext1Y = ($this->h-$ext1Y)*$this->k;
406 $ext2Y = ($this->h-$ext2Y)*$this->k;
407 $int1Y = ($this->h-$int1Y)*$this->k;
408 $int2Y = ($this->h-$int2Y)*$this->k;
409 $cenY = ($this->h-$cenY) *$this->k;
410
411 // init the curve
412 $path = '';
413
414 if ($ext1X-$cenX!=0) {
415 $xt1 = $cenX+($ext1X-$cenX);
416 $yt1 = $cenY+($ext2Y-$cenY)*self::MY_ARC;
417 $xt2 = $cenX+($ext1X-$cenX)*self::MY_ARC;
418 $yt2 = $cenY+($ext2Y-$cenY);
419 } else {
420 $xt1 = $cenX+($ext2X-$cenX)*self::MY_ARC;
421 $yt1 = $cenY+($ext1Y-$cenY);
422 $xt2 = $cenX+($ext2X-$cenX);
423 $yt2 = $cenY+($ext1Y-$cenY)*self::MY_ARC;
424 }
425 $path.= sprintf('%.2F %.2F m ', $ext1X, $ext1Y);
426 $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $ext2X, $ext2Y);
427
428 if ($int1X-$cenX!=0) {
429 $xt1 = $cenX+($int1X-$cenX)*self::MY_ARC;
430 $yt1 = $cenY+($int2Y-$cenY);
431 $xt2 = $cenX+($int1X-$cenX);
432 $yt2 = $cenY+($int2Y-$cenY)*self::MY_ARC;
433 } else {
434 $xt1 = $cenX+($int2X-$cenX);
435 $yt1 = $cenY+($int1Y-$cenY)*self::MY_ARC;
436 $xt2 = $cenX+($int2X-$cenX)*self::MY_ARC;
437 $yt2 = $cenY+($int1Y-$cenY);
438 }
439 $path.= sprintf('%.2F %.2F l ', $int2X, $int2Y);
440 $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $int1X, $int1Y);
441
442 // draw the curve
443 $this->_out($path . 'f');
444 }
445
446 /**
447 * draw a filled corner of a border with only a external radius
448 * /--+ ext2
449 * / |
450 * / |
451 * / |
452 * | |
453 * | |
454 * | |
455 * ext1 +-----+ int + cen
456 *
457 * @param float $ext1X
458 * @param float $ext1Y
459 * @param float $ext2X
460 * @param float $ext2Y
461 * @param float $intX
462 * @param float $intY
463 * @param float $cenX
464 * @param float $cenY
465 * @access public
466 */
467 public function drawCorner($ext1X, $ext1Y, $ext2X, $ext2Y, $intX, $intY, $cenX, $cenY)
468 {
469 // prepare the coordinates
470 $ext1X = $ext1X*$this->k;
471 $ext2X = $ext2X*$this->k;
472 $intX = $intX*$this->k;
473 $cenX = $cenX*$this->k;
474
475 $ext1Y = ($this->h-$ext1Y)*$this->k;
476 $ext2Y = ($this->h-$ext2Y)*$this->k;
477 $intY = ($this->h-$intY)*$this->k;
478 $cenY = ($this->h-$cenY)*$this->k;
479
480 // init the curve
481 $path = '';
482
483 if ($ext1X-$cenX!=0) {
484 $xt1 = $cenX+($ext1X-$cenX);
485 $yt1 = $cenY+($ext2Y-$cenY)*self::MY_ARC;
486 $xt2 = $cenX+($ext1X-$cenX)*self::MY_ARC;
487 $yt2 = $cenY+($ext2Y-$cenY);
488 } else {
489 $xt1 = $cenX+($ext2X-$cenX)*self::MY_ARC;
490 $yt1 = $cenY+($ext1Y-$cenY);
491 $xt2 = $cenX+($ext2X-$cenX);
492 $yt2 = $cenY+($ext1Y-$cenY)*self::MY_ARC;
493 }
494 $path.= sprintf('%.2F %.2F m ', $ext1X, $ext1Y);
495 $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $ext2X, $ext2Y);
496 $path.= sprintf('%.2F %.2F l ', $intX, $intY);
497 $path.= sprintf('%.2F %.2F l ', $ext1X, $ext1Y);
498
499 // draw the curve
500 $this->_out($path . 'f');
501 }
502
503 /**
504 * Start a transformation
505 *
506 * @access public
507 */
508 public function startTransform()
509 {
510 $this->_out('q');
511 }
512
513 /**
514 * Stop a transformation
515 *
516 * @access public
517 */
518 public function stopTransform()
519 {
520 $this->_out('Q');
521 }
522
523 /**
524 * add a Translate transformation
525 *
526 * @param float $Tx
527 * @param float $Ty
528 * @access public
529 */
530 public function setTranslate($xT, $yT)
531 {
532 // Matrix for Translate
533 $tm[0]=1;
534 $tm[1]=0;
535 $tm[2]=0;
536 $tm[3]=1;
537 $tm[4]=$xT*$this->k;
538 $tm[5]=-$yT*$this->k;
539
540 // apply the Transform Matric
541 $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5]));
542 }
543
544 /**
545 * add a Rotate transformation
546 *
547 * @param float $angle
548 * @param float $Cx
549 * @param float $Cy
550 * @access public
551 */
552 public function setRotation($angle, $xC=null, $yC=null)
553 {
554 // if no center, rotate around the current posiition
555 if($xC === null) $xC=$this->x;
556 if($yC === null) $yC=$this->y;
557
558 // prepare the coordinate
559 $yC=($this->h-$yC)*$this->k;
560 $xC*=$this->k;
561
562 // Matrix for Rotate
563 $tm[0]=cos(deg2rad($angle));
564 $tm[1]=sin(deg2rad($angle));
565 $tm[2]=-$tm[1];
566 $tm[3]=$tm[0];
567 $tm[4]=$xC+$tm[1]*$yC-$tm[0]*$xC;
568 $tm[5]=$yC-$tm[0]*$yC-$tm[1]*$xC;
569
570 // apply the Transform Matric
571 $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5]));
572 }
573
574 /**
575 * we redifine the original SetX method, because we don't want the automatic treatment.
576 * It is HTML2PDF that make the treatment
577 *
578 * @param float $x
579 * @param boolean $rtloff NOT USED
580 * @access public
581 */
582 public function SetX($x, $rtloff=false)
583 {
584 $this->x=$x;
585 }
586
587 /**
588 * we redifine the original SetY method, because we don't want the automatic treatment.
589 * It is HTML2PDF that make the treatment
590 *
591 * @param float $y
592 * @param boolean $resetx Reset the X position
593 * @param boolean $rtloff NOT USED
594 * @access public
595 */
596 public function SetY($y, $resetx=true, $rtloff=false)
597 {
598 if ($resetx)
599 $this->x=$this->lMargin;
600
601 $this->y=$y;
602 }
603
604 /**
605 * we redifine the original SetXY method, because we don't want the automatic treatment.
606 * It is HTML2PDF that make the treatment
607 *
608 * @param integer $x
609 * @param integer $y
610 * @param boolean $rtloff NOT USED
611 * @access public
612 */
613 public function SetXY($x, $y, $rtloff=false)
614 {
615 $this->x=$x;
616 $this->y=$y;
617 }
618
619 /**
620 * multiple public accessor because HTML2PDF need to use TCPDF without being a extend of it
621 *
622 * @param mixed
623 * @return mixed
624 * @access public
625 */
626 public function getK()
627 {
628 return $this->k;
629 }
630 public function getW()
631 {
632 return $this->w;
633 }
634 public function getH()
635 {
636 return $this->h;
637 }
638 public function getlMargin()
639 {
640 return $this->lMargin;
641 }
642 public function getrMargin()
643 {
644 return $this->rMargin;
645 }
646 public function gettMargin()
647 {
648 return $this->tMargin;
649 }
650 public function getbMargin()
651 {
652 return $this->bMargin;
653 }
654 public function setbMargin($v)
655 {
656 $this->bMargin=$v;
657 }
658
659 /**
660 * SVG - Convert a SVG Style in PDF Style
661 *
662 * @param array $styles SVG Style
663 * @return string PDF style
664 * @access public
665 */
666 public function svgSetStyle($styles)
667 {
668 // init the PDF style
669 $style = '';
670
671 // Style : fill
672 if ($styles['fill']) {
673 $this->setFillColorArray($styles['fill']);
674 $style.= 'F';
675 }
676
677 // Style : stroke
678 if ($styles['stroke'] && $styles['stroke-width']) {
679 $this->SetDrawColorArray($styles['stroke']);
680 $this->SetLineWidth($styles['stroke-width']);
681 $style.= 'D';
682 }
683
684 // Style : opacity
685 if ($styles['fill-opacity']) {
686 $this->SetAlpha($styles['fill-opacity']);
687 }
688
689 return $style;
690 }
691
692 /**
693 * SVG - make a Rectangle
694 *
695 * @param float $x
696 * @param float $y
697 * @param float $w
698 * @param float $h
699 * @param string $style PDF Style
700 * @access public
701 */
702 public function svgRect($x, $y, $w, $h, $style)
703 {
704 // prepare the 4 corners
705 $x1=$x;
706 $x2=$x+$w;
707 $x3=$x+$w;
708 $x4=$x;
709
710 $y1=$y;
711 $y2=$y;
712 $y3=$y+$h;
713 $y4=$y+$h;
714
715 // get the Closing operator from the PDF Style
716 if($style=='F') $op='f';
717 elseif($style=='FD' || $style=='DF') $op='B';
718 else $op='S';
719
720 // drawing
721 $this->_Point($x1, $y1, true);
722 $this->_Line($x2, $y2, true);
723 $this->_Line($x3, $y3, true);
724 $this->_Line($x4, $y4, true);
725 $this->_Line($x1, $y1, true);
726 $this->_out($op);
727 }
728
729 /**
730 * SVG - make a Line
731 *
732 * @param float $x1
733 * @param float $y1
734 * @param float $x2
735 * @param float $y2
736 * @access public
737 */
738 public function svgLine($x1, $y1, $x2, $y2)
739 {
740 // get the Closing operator
741 $op='S';
742
743 // drawing
744 $this->_Point($x1, $y1, true);
745 $this->_Line($x2, $y2, true);
746 $this->_out($op);
747 }
748
749 /**
750 * SVG - make a Ellipse
751 *
752 * @param float $x0 x Center
753 * @param float $y0 y Center
754 * @param float $rx x radius
755 * @param float $ry y radius
756 * @param string $style PDF Style
757 * @access public
758 */
759 public function svgEllipse($x0, $y0, $rx, $ry, $style)
760 {
761 // get the Closing operator from the PDF Style
762 if($style=='F') $op='f';
763 elseif($style=='FD' || $style=='DF') $op='B';
764 else $op='S';
765
766 // drawing
767 $this->_Arc($x0, $y0, $rx, $ry, 0, 2*M_PI, true, true, true);
768 $this->_out($op);
769 }
770
771 /**
772 * SVG - make a Advanced Polygone
773 *
774 * @param array $actions list of actions
775 * @param string $style PDF Style
776 * @access public
777 */
778 public function svgPolygone($actions, $style)
779 {
780 // get the Closing operator from the PDF Style
781 if($style=='F') $op='f';
782 elseif($style=='FD' || $style=='DF') $op='B';
783 else $op='S';
784
785 // To save the First action and the last point
786 $first = array('', 0, 0);
787 $last = array(0, 0, 0, 0);
788
789 foreach ($actions as $action) {
790 switch($action[0])
791 {
792 // Start the Path
793 case 'M':
794 case 'm':
795 $first = $action;
796 $x = $action[1]; $y = $action[2]; $xc = $x; $yc = $y;
797 $this->_Point($x, $y, true);
798 break;
799
800 // Close the Path
801 case 'Z':
802 case 'z':
803 $x = $first[1]; $y = $first[2]; $xc = $x; $yc = $y;
804 $this->_Line($x, $y, true);
805 break;
806
807 // Make a Line (new point)
808 case 'L':
809 $x = $action[1]; $y = $action[2]; $xc = $x; $yc = $y;
810 $this->_Line($x, $y, true);
811 break;
812
813 // Make a Line (vector from last point)
814 case 'l':
815 $x = $last[0]+$action[1]; $y = $last[1]+$action[2]; $xc = $x; $yc = $y;
816 $this->_Line($x, $y, true);
817 break;
818
819 // Make a Horizontal Line (new point)
820 case 'H':
821 $x = $action[1]; $y = $last[1]; $xc = $x; $yc = $y;
822 $this->_Line($x, $y, true);
823 break;
824
825 // Make a Horisontal Line (vector from last point)
826 case 'h':
827 $x = $last[0]+$action[1]; $y = $last[1]; $xc = $x; $yc = $y;
828 $this->_Line($x, $y, true);
829 break;
830
831 // Make a Vertical Line (new point)
832 case 'V':
833 $x = $last[0]; $y = $action[1]; $xc = $x; $yc = $y;
834 $this->_Line($x, $y, true);
835 break;
836
837 // Make a Vertical Line (vector from last point)
838 case 'v':
839 $x = $last[0]; $y = $last[1]+$action[1]; $xc = $x; $yc = $y;
840 $this->_Line($x, $y, true);
841 break;
842
843 // Make a Arc (new point)
844 case 'A':
845 $rx = $action[1]; // rx
846 $ry = $action[2]; // ry
847 $a = $action[3]; // deviation angle of the axis X
848 $l = $action[4]; // large-arc-flag
849 $s = $action[5]; // sweep-flag
850 $x1 = $last[0]; // begin x
851 $y1 = $last[1]; // begin y
852 $x2 = $action[6]; // final x
853 $y2 = $action[7]; // final y
854
855 $this->_Arc2($x1, $y1, $x2, $y2, $rx, $ry, $a, $l, $s, true);
856 $x = $x2; $y = $y2; $xc = $x; $yc = $y;
857 break;
858
859 // Make a Arc (vector from last point)
860 case 'a':
861 $rx = $action[1]; // rx
862 $ry = $action[2]; // ry
863 $a = $action[3]; // deviation angle of the axis X
864 $l = $action[4]; // large-arc-flag
865 $s = $action[5]; // sweep-flag
866 $x1 = $last[0]; // begin x
867 $y1 = $last[1]; // begin y
868 $x2 = $last[0]+$action[6]; // final x
869 $y2 = $last[1]+$action[7]; // final y
870
871 $this->_Arc2($x1, $y1, $x2, $y2, $rx, $ry, $a, $l, $s, true);
872 $x = $x2; $y = $y2; $xc = $x; $yc = $y;
873 break;
874
875 // Make a Bezier Curve (new point)
876 case 'C':
877 $x1 = $action[1];
878 $y1 = $action[2];
879 $x2 = $action[3];
880 $y2 = $action[4];
881 $xf = $action[5];
882 $yf = $action[6];
883 $this->_Curve($x1, $y1, $x2, $y2, $xf, $yf, true);
884 $x = $xf; $y = $yf; $xc = $x2; $yc = $y2;
885 break;
886
887 // Make a Bezier Curve (vector from last point)
888 case 'c':
889 $x1 = $last[0]+$action[1];
890 $y1 = $last[1]+$action[2];
891 $x2 = $last[0]+$action[3];
892 $y2 = $last[1]+$action[4];
893 $xf = $last[0]+$action[5];
894 $yf = $last[1]+$action[6];
895 $this->_Curve($x1, $y1, $x2, $y2, $xf, $yf, true);
896 $x = $xf; $y = $yf; $xc = $x2; $yc = $y2;
897 break;
898
899 // Unknown Path
900 default:
901 throw new HTML2PDF_exception(0, 'SVG Path Error : ['.$action[0].'] unkown');
902 }
903
904 // save the last point
905 $last = array($x, $y, $xc, $yc);
906 }
907
908 // finish the path
909 $this->_out($op);
910 }
911
912 /**
913 * SVG - go to a point
914 *
915 * @param float $x
916 * @param float $y
917 * @param boolean $trans apply transformation
918 * @access protected
919 */
920 protected function _Point($x, $y, $trans = false)
921 {
922 if ($trans) $this->ptTransform($x, $y);
923
924 $this->_out(sprintf('%.2F %.2F m', $x, $y));
925 }
926
927 /**
928 * SVG - make a line from the last point to (x,y)
929 *
930 * @param float $x
931 * @param float $y
932 * @param boolean $trans apply transformation
933 * @access protected
934 */
935 protected function _Line($x, $y, $trans = false)
936 {
937 if ($trans) $this->ptTransform($x, $y);
938
939 $this->_out(sprintf('%.2F %.2F l', $x, $y));
940 }
941
942 /**
943 * SVG - make a bezier curve from the last point to (xf,yf), with the 2 direction points (x1,y1) and (x2,y2)
944 *
945 * @param float $x1
946 * @param float $y1
947 * @param float $x2
948 * @param float $y2
949 * @param float $xf
950 * @param float $yf
951 * @param boolean $trans apply transformation
952 * @access protected
953 */
954 protected function _Curve($x1, $y1, $x2, $y2, $xf, $yf, $trans = false)
955 {
956 if ($trans) {
957 $this->ptTransform($x1, $y1);
958 $this->ptTransform($x2, $y2);
959 $this->ptTransform($xf, $yf);
960 }
961 $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c', $x1, $y1, $x2, $y2, $xf, $yf));
962 }
963
964 /**
965 * SVG - make a arc with Center, Radius, from angleBegin to angleEnd
966 *
967 * @param float $xc
968 * @param float $yc
969 * @param float $rx
970 * @param float $ry
971 * @param float $angleBegin in radians
972 * @param float $angleEng in radians
973 * @param boolean $direction
974 * @param boolean $drawFirst, true => add the first point
975 * @param boolean $trans apply transformation
976 * @access protected
977 */
978 protected function _Arc(
979 $xc,
980 $yc,
981 $rx,
982 $ry,
983 $angleBegin,
984 $angleEnd,
985 $direction = true,
986 $drawFirst = true,
987 $trans=false)
988 {
989 // if we want the no trigo direction : add 2PI to the begin angle, to invert the direction
990 if (!$direction) $angleBegin+= M_PI*2.;
991
992 // cut in segment to convert in berize curv
993 $dt = ($angleEnd - $angleBegin)/self::ARC_NB_SEGMENT;
994 $dtm = $dt/3;
995
996 // center of the arc
997 $x0 = $xc; $y0 = $yc;
998
999 // calculing the first point
1000 $t1 = $angleBegin;
1001 $a0 = $x0 + ($rx * cos($t1));
1002 $b0 = $y0 + ($ry * sin($t1));
1003 $c0 = -$rx * sin($t1);
1004 $d0 = $ry * cos($t1);
1005
1006 // if drawFirst => draw the first point
1007 if ($drawFirst) $this->_Point($a0, $b0, $trans);
1008
1009 // foreach segment
1010 for ($i = 1; $i <= self::ARC_NB_SEGMENT; $i++) {
1011 // calculing the next point
1012 $t1 = ($i * $dt)+$angleBegin;
1013 $a1 = $x0 + ($rx * cos($t1));
1014 $b1 = $y0 + ($ry * sin($t1));
1015 $c1 = -$rx * sin($t1);
1016 $d1 = $ry * cos($t1);
1017
1018 // make the bezier curv
1019 $this->_Curve(
1020 $a0 + ($c0 * $dtm), $b0 + ($d0 * $dtm),
1021 $a1 - ($c1 * $dtm), $b1 - ($d1 * $dtm),
1022 $a1, $b1,
1023 $trans
1024 );
1025
1026 // save the point
1027 $a0 = $a1;
1028 $b0 = $b1;
1029 $c0 = $c1;
1030 $d0 = $d1;
1031 }
1032 }
1033
1034 /**
1035 * SVG - make a arc from Pt1 to Pt2, with Radius
1036 *
1037 * @param float $x1
1038 * @param float $y1
1039 * @param float $x2
1040 * @param float $y2
1041 * @param float $rx
1042 * @param float $ry
1043 * @param float $angle deviation angle of the axis X
1044 * @param boolean $l large-arc-flag
1045 * @param boolean $s sweep-flag
1046 * @param boolean $trans apply transformation
1047 * @access protected
1048 */
1049 protected function _Arc2($x1, $y1, $x2, $y2, $rx, $ry, $angle=0., $l=0, $s=0, $trans = false)
1050 {
1051 // array to stock the parameters
1052 $v = array();
1053
1054 // the original values
1055 $v['x1'] = $x1;
1056 $v['y1'] = $y1;
1057 $v['x2'] = $x2;
1058 $v['y2'] = $y2;
1059 $v['rx'] = $rx;
1060 $v['ry'] = $ry;
1061
1062 // rotate with the deviation angle of the axis X
1063 $v['xr1'] = $v['x1']*cos($angle) - $v['y1']*sin($angle);
1064 $v['yr1'] = $v['x1']*sin($angle) + $v['y1']*cos($angle);
1065 $v['xr2'] = $v['x2']*cos($angle) - $v['y2']*sin($angle);
1066 $v['yr2'] = $v['x2']*sin($angle) + $v['y2']*cos($angle);
1067
1068 // the normalized vector
1069 $v['Xr1'] = $v['xr1']/$v['rx'];
1070 $v['Yr1'] = $v['yr1']/$v['ry'];
1071 $v['Xr2'] = $v['xr2']/$v['rx'];
1072 $v['Yr2'] = $v['yr2']/$v['ry'];
1073 $v['dXr'] = $v['Xr2']-$v['Xr1'];
1074 $v['dYr'] = $v['Yr2']-$v['Yr1'];
1075 $v['D'] = $v['dXr']*$v['dXr'] + $v['dYr']*$v['dYr'];
1076
1077 // if |vector| is Null, or if |vector| > 2 : impossible to make a arc => Line
1078 if ($v['D']==0 || $v['D']>4) {
1079 $this->_Line($x2, $y2, $trans);
1080 return false;
1081 }
1082
1083 // convert paramters for make a arc with Center, Radius, from angleBegin to angleEnd
1084 $v['s1'] = array();
1085 $v['s1']['t'] = sqrt((4.-$v['D'])/$v['D']);
1086 $v['s1']['Xr'] = ($v['Xr1']+$v['Xr2'])/2. + $v['s1']['t']*($v['Yr2']-$v['Yr1'])/2.;
1087 $v['s1']['Yr'] = ($v['Yr1']+$v['Yr2'])/2. + $v['s1']['t']*($v['Xr1']-$v['Xr2'])/2.;
1088 $v['s1']['xr'] = $v['s1']['Xr']*$v['rx'];
1089 $v['s1']['yr'] = $v['s1']['Yr']*$v['ry'];
1090 $v['s1']['x'] = $v['s1']['xr']*cos($angle)+$v['s1']['yr']*sin($angle);
1091 $v['s1']['y'] =-$v['s1']['xr']*sin($angle)+$v['s1']['yr']*cos($angle);
1092 $v['s1']['a1'] = atan2($v['y1']-$v['s1']['y'], $v['x1']-$v['s1']['x']);
1093 $v['s1']['a2'] = atan2($v['y2']-$v['s1']['y'], $v['x2']-$v['s1']['x']);
1094 if ($v['s1']['a1']>$v['s1']['a2']) $v['s1']['a1']-=2*M_PI;
1095
1096 $v['s2'] = array();
1097 $v['s2']['t'] = -$v['s1']['t'];
1098 $v['s2']['Xr'] = ($v['Xr1']+$v['Xr2'])/2. + $v['s2']['t']*($v['Yr2']-$v['Yr1'])/2.;
1099 $v['s2']['Yr'] = ($v['Yr1']+$v['Yr2'])/2. + $v['s2']['t']*($v['Xr1']-$v['Xr2'])/2.;
1100 $v['s2']['xr'] = $v['s2']['Xr']*$v['rx'];
1101 $v['s2']['yr'] = $v['s2']['Yr']*$v['ry'];
1102 $v['s2']['x'] = $v['s2']['xr']*cos($angle)+$v['s2']['yr']*sin($angle);
1103 $v['s2']['y'] =-$v['s2']['xr']*sin($angle)+$v['s2']['yr']*cos($angle);
1104 $v['s2']['a1'] = atan2($v['y1']-$v['s2']['y'], $v['x1']-$v['s2']['x']);
1105 $v['s2']['a2'] = atan2($v['y2']-$v['s2']['y'], $v['x2']-$v['s2']['x']);
1106 if ($v['s2']['a1']>$v['s2']['a2']) $v['s2']['a1']-=2*M_PI;
1107
1108 if (!$l) {
1109 if ($s) {
1110 $xc = $v['s2']['x'];
1111 $yc = $v['s2']['y'];
1112 $a1 = $v['s2']['a1'];
1113 $a2 = $v['s2']['a2'];
1114 $this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, true, false, $trans);
1115 } else {
1116 $xc = $v['s1']['x'];
1117 $yc = $v['s1']['y'];
1118 $a1 = $v['s1']['a1'];
1119 $a2 = $v['s1']['a2'];
1120 $this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, false, false, $trans);
1121 }
1122 } else {
1123 if ($s) {
1124 $xc = $v['s1']['x'];
1125 $yc = $v['s1']['y'];
1126 $a1 = $v['s1']['a1'];
1127 $a2 = $v['s1']['a2'];
1128 $this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, true, false, $trans);
1129 } else {
1130 $xc = $v['s2']['x'];
1131 $yc = $v['s2']['y'];
1132 $a1 = $v['s2']['a1'];
1133 $a2 = $v['s2']['a2'];
1134 $this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, false, false, $trans);
1135 }
1136 }
1137 }
1138
1139 /**
1140 * SVG - transform the point (reference)
1141 *
1142 * @param float &$x
1143 * @param float &$y
1144 * @param boolean $trans true => convert into PDF unit
1145 * @return boolean
1146 * @access public
1147 */
1148 public function ptTransform(&$x, &$y, $trans=true)
1149 {
1150 // load the last Transfomation Matrix
1151 $nb = count($this->_transf);
1152 if ($nb) $m = $this->_transf[$nb-1];
1153 else $m = array(1,0,0,1,0,0);
1154
1155 // apply the Transformation Matrix
1156 list($x,$y) = array(($x*$m[0]+$y*$m[2]+$m[4]),($x*$m[1]+$y*$m[3]+$m[5]));
1157
1158 // if true => convert into PDF unit
1159 if ($trans) {
1160 $x = $x*$this->k;
1161 $y = ($this->h-$y)*$this->k;
1162 }
1163
1164 return true;
1165 }
1166
1167 /**
1168 * SVG - add a transformation Matric
1169 *
1170 * @param array $n matrix
1171 * @access public
1172 */
1173 public function doTransform($n = null)
1174 {
1175 // get the last Transformation Matrix
1176 $nb = count($this->_transf);
1177 if ($nb) $m = $this->_transf[$nb-1];
1178 else $m = array(1,0,0,1,0,0);
1179
1180 // if no transform, get the Identity Matrix
1181 if (!$n) $n = array(1,0,0,1,0,0);
1182
1183 // create the new Transformation Matrix
1184 $this->_transf[] = array(
1185 $m[0]*$n[0]+$m[2]*$n[1],
1186 $m[1]*$n[0]+$m[3]*$n[1],
1187 $m[0]*$n[2]+$m[2]*$n[3],
1188 $m[1]*$n[2]+$m[3]*$n[3],
1189 $m[0]*$n[4]+$m[2]*$n[5]+$m[4],
1190 $m[1]*$n[4]+$m[3]*$n[5]+$m[5]
1191 );
1192 }
1193
1194 /**
1195 * SVG - remove a transformation Matric
1196 *
1197 * @access public
1198 */
1199 public function undoTransform()
1200 {
1201 array_pop($this->_transf);
1202 }
1203
1204 /**
1205 * Convert a HTML2PDF barcode in a TCPDF barcode
1206 *
1207 * @param string $code code to print
1208 * @param string $type type of barcode (see tcpdf/barcodes.php for supported formats)
1209 * @param int $x x position in user units
1210 * @param int $y y position in user units
1211 * @param int $w width in user units
1212 * @param int $h height in user units
1213 * @param int $labelFontsize of the Test Label. If false : no Label
1214 * @param array $color color of the foreground
1215 * @access public
1216 */
1217 public function myBarcode($code, $type, $x, $y, $w, $h, $labelFontsize, $color)
1218 {
1219 // the style of the barcode
1220 $style = array(
1221 'position' => 'S',
1222 'text' => ($labelFontsize ? true : false),
1223 'fgcolor' => $color,
1224 'bgcolor' => false,
1225 );
1226
1227 // build the barcode
1228 $this->write1DBarcode($code, $type, $x, $y, $w, $h, '', $style, 'N');
1229
1230 // it Label => add the FontSize to the height
1231 if ($labelFontsize) $h+= ($labelFontsize);
1232
1233 // return the size of the barcode
1234 return array($w, $h);
1235 }
1236
1237 /**
1238 * create a automatic Index on a page
1239 *
1240 * @param html2pdf $obj parent object
1241 * @param string $titre Title of the Index Page
1242 * @param integer $sizeTitle Font size for hthe Title
1243 * @param integer $sizeBookmark Font size for the bookmarks
1244 * @param boolean $bookmarkTitle Bookmark the Title
1245 * @param boolean $displayPage Display the page number for each bookmark
1246 * @param integer $page draw the automatic Index on a specific Page. if null => add a page at the end
1247 * @param string $fontName FontName to use
1248 * @access public
1249 */
1250 public function createIndex(
1251 &$obj,
1252 $titre = 'Index',
1253 $sizeTitle = 20,
1254 $sizeBookmark = 15,
1255 $bookmarkTitle = true,
1256 $displayPage = true,
1257 $page = null,
1258 $fontName = 'helvetica')
1259 {
1260 // bookmark the Title if wanted
1261 if ($bookmarkTitle) $this->Bookmark($titre, 0, -1);
1262
1263 // display the Title with the good Font size
1264 $this->SetFont($fontName, '', $sizeTitle);
1265 $this->Cell(0, 5, $titre, 0, 1, 'C');
1266
1267 // set the good Font size for the bookmarks
1268 $this->SetFont($fontName, '', $sizeBookmark);
1269 $this->Ln(10);
1270
1271 // get the number of bookmarks
1272 $size=sizeof($this->outlines);
1273
1274 // get the size of the "P. xx" cell
1275 $pageCellSize=$this->GetStringWidth('p. '.$this->outlines[$size-1]['p'])+2;
1276
1277 // Foreach bookmark
1278 for ($i=0;$i<$size;$i++) {
1279 // if we need a new page => add a new page
1280 if ($this->getY()+$this->FontSize>=($this->h - $this->bMargin)) {
1281 $obj->_INDEX_NewPage($page);
1282 $this->SetFont($fontName, '', $sizeBookmark);
1283 }
1284
1285 // Offset of the current level
1286 $level=$this->outlines[$i]['l'];
1287 if($level>0) $this->Cell($level*8);
1288
1289 // Caption (cut to fit on the width page)
1290 $str=$this->outlines[$i]['t'];
1291 $strsize=$this->GetStringWidth($str);
1292 $availableSize=$this->w-$this->lMargin-$this->rMargin-$pageCellSize-($level*8)-4;
1293 while ($strsize>=$availableSize) {
1294 $str=substr($str, 0, -1);
1295 $strsize=$this->GetStringWidth($str);
1296 }
1297
1298 // if we want to display the page nmber
1299 if ($displayPage) {
1300 // display the Bookmark Caption
1301 $this->Cell($strsize+2, $this->FontSize+2, $str);
1302
1303 //Filling dots
1304 $w=$this->w-$this->lMargin-$this->rMargin-$pageCellSize-($level*8)-($strsize+2);
1305 $nb=$w/$this->GetStringWidth('.');
1306 $dots=str_repeat('.', $nb);
1307 $this->Cell($w, $this->FontSize+2, $dots, 0, 0, 'R');
1308
1309 //Page number
1310 $this->Cell($pageCellSize, $this->FontSize+2, 'p. '.$this->outlines[$i]['p'], 0, 1, 'R');
1311 } else {
1312 // display the Bookmark Caption
1313 $this->Cell($strsize+2, $this->FontSize+2, $str, 0, 1);
1314 }
1315 }
1316 }
1317
1318 /**
1319 * Returns the string alias used for the total number of pages.
1320 *
1321 * @access public
1322 * @return string;
1323 * @see TCPDF::getAliasNbPages(), TCPDF::getPageGroupAlias()
1324 */
1325 public function getMyAliasNbPages()
1326 {
1327 if ($this->_myLastPageGroupNb==0) {
1328 return $this->getAliasNbPages();
1329 } else {
1330 $old = $this->currpagegroup;
1331 $this->currpagegroup = '{nb'.$this->_myLastPageGroupNb.'}';
1332 $new = $this->getPageGroupAlias();
1333 $this->currpagegroup = $old;
1334
1335 return $new;
1336 }
1337 }
1338
1339 /**
1340 * Returns the current page number.
1341 *
1342 * @access public
1343 * @param integer $page
1344 * @return integer;
1345 */
1346 public function getMyNumPage($page=null)
1347 {
1348 if ($page===null) {
1349 $page = $this->page;
1350 }
1351
1352 if ($this->_myLastPageGroupNb==0) {
1353 return $page;
1354 } else {
1355 return $page-$this->_myLastPageGroup;
1356 }
1357 }
1358
1359 /**
1360 * Start a new group of pages
1361 *
1362 * @access public
1363 * @return integer;
1364 * @see tcpdf::startPageGroup
1365 */
1366 public function myStartPageGroup()
1367 {
1368 $this->_myLastPageGroup = $this->page-1;
1369 $this->_myLastPageGroupNb++;
1370 }
1371
1372 /**
1373 * get $_myLastPageGroup;
1374 *
1375 * @access public
1376 * @return integer $_myLastPageGroup;
1377 */
1378 public function getMyLastPageGroup()
1379 {
1380 return $this->_myLastPageGroup;
1381 }
1382
1383 /**
1384 * set $_myLastPageGroup;
1385 *
1386 * @access public
1387 * @param integer $myLastPageGroup;
1388 */
1389 public function setMyLastPageGroup($myLastPageGroup)
1390 {
1391 $this->_myLastPageGroup = $myLastPageGroup;
1392 }
1393
1394 /**
1395 * get $_myLastPageGroupNb;
1396 *
1397 * @access public
1398 * @return integer $_myLastPageGroupNb;
1399 */
1400 public function getMyLastPageGroupNb()
1401 {
1402 return $this->_myLastPageGroupNb;
1403 }
1404
1405 /**
1406 * set $_myLastPageGroupNb;
1407 *
1408 * @access public
1409 * @param integer $myLastPageGroupNb;
1410 */
1411 public function setMyLastPageGroupNb($myLastPageGroupNb)
1412 {
1413 $this->_myLastPageGroupNb = $myLastPageGroupNb;
1414 }
1415}
Note: See TracBrowser for help on using the repository browser.