]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/PDF/Marco.php
Se agrega un nuevo renderer.
[mecon/meconlib.git] / lib / MECON / PDF / Marco.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                              Ministerio de Economía
4                                     meconlib
5 -------------------------------------------------------------------------------
6 This file is part of meconlib.
7
8 meconlib is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2 of the License, or (at your option)
11 any later version.
12
13 meconlib is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16  
17 You should have received a copy of the GNU General Public License; if not,
18 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 Boston, MA  02111-1307  USA
20 -------------------------------------------------------------------------------
21 Creado: Fri Oct 24 16:34:11 2003
22 Autor:  Martin Marrese <mmarre@mecon.gov.ar>
23 -------------------------------------------------------------------------------
24 $Id$
25 -----------------------------------------------------------------------------*/
26
27 require_once 'MECON/PDF.php';
28 require_once 'MECON/PDF/Separador.php';
29
30 /**
31  * Libreria que crea un marco estandar para los pdfs.
32  */
33 class MECON_PDF_Marco extends MECON_PDF {
34
35     /**
36      * Objeto MECON_PDF_Separador que se utilizara por defecto.
37      * @var Object $separador
38      * @access protected
39      */
40     var $_separador_defecto;
41
42     /**
43      * Array de objetos MECON_PDF_Contenido
44      * @var array $contenido
45      * @access protected
46      */
47     var $_contenido = array();
48     
49     /**
50      * Espacio dispobible en la pagina. Representa la coordenada Y a partir de
51      * la cual se puede comenzar a escribir el contenido.
52      * @var int $espacioDisponible
53      * @access public
54      */
55     var $espacioDisponible;
56
57     /**
58      * Logo.
59      * @var string $logo
60      * @access public
61      */
62     var $logo; 
63
64     /**
65      * Paginador.
66      * @var bool $paginador
67      * @access public 
68      */
69     var $paginador = true;
70
71     /**
72      * Fecha. Si es true se pone la fecha del servidor, si es false no se pone
73      * nada, en caso contrario se pone lo que haya en esta variable.
74      * @var mixed $fecha
75      * @access public
76      */
77     var $fecha = true;
78     
79     /**
80      * Seccion.
81      * @var string $seccion
82      * @access public 
83      */
84     var $seccion = '';
85
86     /**
87      * SubSeccion.
88      * @var string $subseccion
89      * @access public 
90      */
91     var $subseccion = 'Ministerio de Economia';
92
93     /**
94      * Titulo.
95      * @var string $string
96      * @access public 
97      */
98     var $titulo;
99
100     /**
101      * SubTitulo.
102      * @var string $subtitulo
103      * @access public 
104      */
105     var $subtitulo;
106
107     /**
108      * Excepciones al encabezado
109      * @var array $excepciones
110      * @access protected
111      */
112     var $_excepciones = array ();
113      
114     /**
115      * Class constructor.
116      *
117      * @param string $tam Tamanio de las hojas.
118      * @param string $ori Orientacion de las hojaz (portrait o landscape).
119      *
120      * @return void
121      * @access public
122      */
123     function MECON_PDF_Marco($tam = "a4", $ori = "portrait") {
124         $this->MECON_PDF($tam, $ori);
125         $this->tamanio = $tam;
126         $this->_resetConf();
127         $this->_separador_defecto =& new MECON_PDF_Separador();
128     }
129
130     /**
131      *  Funcion que setea los valores de conf para poder poner las cabeceras
132      *  @access private
133      *  @param int $pagina numero del la pagina de la que debe setear loa
134      *  valores
135      *  @return void
136      */
137     function _resetConf($pagina = null)
138     {
139         if(is_null($pagina));
140             $pagina = $this->numPage();
141         $tmp = include 'MECON/PDF/Marco/medidas.php' ; 
142         $tmp = $tmp[$this->tamanio][$this->getOrientation($pagina)];
143         $tmp['Xi'] = $this->_config['Xi'];
144         $tmp['Yi'] = $this->_config['Yi'];
145         $tmp['Xf'] = $this->_config['Xf'];
146         $tmp['Yf'] = $this->_config['Yf'];
147         $this->_config = $tmp;
148         if (@$this->_config['encabezado']['logo']['path']) {
149             $this->logo = $this->_config['encabezado']['logo']['path'];
150         }
151     }
152
153     /**
154      * Permite agregar nuevas paginas al pdf que se esta armando.
155      *
156      * @param string $pagina Tipo de pagina que se va a utilizar.
157      * @param string $orientacion Orientacion de la hoja
158      * @param bool $encabezado Indica si el encabezado debe ponerse en la
159      * pagina.
160      * @param string $seccion Seccion del encabezado para esta pagina nueva.
161      * @param string $subseccion SubSeccion del encabezado para esta pagina 
162      * nueva.
163      *
164      * @return void
165      * @access public
166      */
167     function newPage($pagina = 'a4', $orientacion = null, $encabezado = true, $seccion = null, $subseccion =
168             null)
169     {   
170         parent::newPage($pagina, $orientacion);
171         $this->_resetConf();
172         if ($encabezado) {
173             $this->espacioDisponible = $this->_config['encabezado']['Yi'] - 27;
174             if ($this->countPages() === 1) {
175                 if ($this->titulo || $this->subtitulo) {
176                     $this->espacioDisponible -= 27;
177                 }
178             }
179             if (!is_null($seccion)) {
180                 $this->_excepciones[$this->numPage()]['seccion'] = $seccion;
181             }
182             if (!is_null($subseccion)) {
183                 $this->_excepciones[$this->numPage()]['subseccion'] = $subseccion;
184             }
185         }
186         else {
187             $this->espacioDisponible = $this->_config['encabezado']['Yf'];
188             $this->_excepciones[$this->countPages()]['nova'] = true;
189             
190         }
191     }
192
193     /**
194      * Funcion que agrega el logo al encabezado de una pagina.
195      *
196      * @return void
197      * @access protected
198      */
199     function _addLogo() {
200         $this->_resetConf();
201         $conf = $this->_config['encabezado'];
202         if ($this->logo) {
203             $this->addImage($this->logo, $conf['logo']['X'],
204                     $conf['logo']['Y'], null, 'jpg');
205         }
206     }
207
208     /**
209      * Funcion que agrega la seccion al encabezado de una pagina.
210      *
211      * @return void
212      * @access protected
213      */
214     function _addSeccion() {
215         $this->_resetConf();
216         $conf = $this->_config['encabezado'];
217         if ($this->seccion) {
218             $tmp = $this->strlen($this->seccion, $conf['seccion']);
219             $tmp2 = $conf['linea2']['Xi'] - $conf['linea1']['Xi'];
220             if ($tmp >= $tmp2) {
221                 $this->seccion = $this->wrapLine ($this->seccion, $tmp2,
222                         $conf['seccion']);
223                 $tmp = $this->strlen($this->seccion, $conf['seccion']);
224             }
225             $init = $conf['linea1']['Xi'] + ( $conf['linea2']['Xi'] 
226                     - $conf['linea1']['Xi'] - $tmp) / 2; 
227             $this->addText($init, $conf['seccion']['Y'], $this->seccion,
228                     $conf['seccion']);
229         }
230     }
231    
232     /**
233      * Funcion que agrega la subseccion al encabezado de una pagina.
234      *
235      * @return void
236      * @access protected
237      */
238     function _addSubSeccion() {
239         $this->_resetConf();
240         $conf = $this->_config['encabezado'];
241         if ($this->subseccion) {
242             $tmp = $this->strlen($this->subseccion, $conf['subseccion']);
243             $tmp2 = $conf['linea2']['Xi'] - $conf['linea1']['Xi'];
244             if ($tmp >= $tmp2) {
245                 $this->subseccion = $this->wrapLine ($this->subseccion, $tmp2,
246                         $conf['subseccion']);
247                 $tmp = $this->strlen($this->subseccion, $conf['subseccion']);
248             }
249             $init = $conf['linea1']['Xi'] + ( $conf['linea2']['Xi'] 
250                     - $conf['linea1']['Xi'] - $tmp) / 2; 
251             $this->addText($init, $conf['subseccion']['Y'], $this->subseccion, 
252                     $conf['subseccion']);
253         }
254     }
255
256     /**
257      * Funcion que agrega el paginador al encabezado de una pagina.
258      *
259      * @return void
260      * @access protected
261      */
262     function _addPager() {
263         $this->_resetConf();
264         $conf = $this->_config['encabezado'];
265         if ($this->paginador) {
266             $txt = 'Página '.$this->numPage().' de '.
267                 $this->countPages();
268             $tmp = $this->strlen($txt, $conf['paginador']);
269             $init = $conf['linea2']['Xi'] + ( $conf['Xf'] 
270                     - $conf['linea2']['Xi'] - $tmp) / 2; 
271             $this->addText($init, $conf['paginador']['Y'], $txt, 
272                     $conf['paginador']);
273         }
274     }
275     
276     /**
277      * Funcion que permite agregar la fecha al encabezado de una pagina.
278      *
279      * @return void
280      * @access protected
281      */
282     function _addDate() {
283         $this->_resetConf();
284         $conf = $this->_config['encabezado'];
285         if ($this->fecha) {
286             if (is_a($this->fecha, 'Date')) {
287                 $this->fecha = $this->fecha->format("%d/%m/%Y");
288             }
289             elseif ($this->fecha === true) {
290                 $this->fecha = date("d/m/Y");
291             }
292             $tmp = $this->strlen($this->fecha, $conf['fecha']);
293             $init = $conf['linea2']['Xi'] + ( $conf['Xf'] 
294                     - $conf['linea2']['Xi'] - $tmp) / 2; 
295             $this->addText($init, $conf['fecha']['Y'], $this->fecha,
296                     $conf['fecha']);
297         }
298     }
299     
300     /**
301      * Funcion que arma el recuadro del encabezado de las paginas.
302      * 
303      * @return void
304      * @access protected
305      */
306     function _addHeaderRectangle() {
307         $this->_resetConf();
308         $conf = $this->_config['encabezado'];
309         //Armo el recuadro
310         $this->addRectangle ($conf['Xi'], $conf['Yi'], $conf['Xf'], 
311                     $conf['Yf'], '');
312         $this->addLine($conf['linea1']['Xi'], $conf['linea1']['Yi'], 
313                 $conf['linea1']['Xf'], $conf['linea1']['Yf'], '');
314         $this->addLine($conf['linea2']['Xi'], $conf['linea2']['Yi'], 
315                 $conf['linea2']['Xf'], $conf['linea2']['Yf'], '');
316     }
317
318     /**
319      * Funcion que permite agregar el titulo a una pagina.
320      *
321      * @return void
322      * @access protected
323      */
324     function _addTitle() {
325         $this->_resetConf();
326         $conf = $this->_config['titulo'];
327         if ($this->titulo) {
328             $tmp = $this->strlen($this->titulo, $conf);
329             $tmp2 = $this->getWidth();
330             if ($tmp >= $tmp2) {
331                 $this->titulo = $this->wrapLine ($this->titulo, $tmp2,
332                         $conf);
333                 $tmp = $this->strlen($this->titulo, $conf);
334             }
335             $init = ($tmp2 - $tmp) / 2; 
336             $this->addText($init, $conf['Y'], $this->titulo, 
337                     $conf);
338         }
339     }
340
341     /**
342      * Funcion que permite agregar el subtitulo a una pagina.
343      *
344      * @return void
345      * @access protected
346      */
347     function _addSubTitle() {
348         $this->_resetConf();
349         $conf = $this->_config['subtitulo'];
350         if ($this->subtitulo) {
351             $tmp = $this->strlen($this->subtitulo, $conf);
352             $tmp2 = $this->getWidth();
353             if ($tmp >= $tmp2) {
354                 $this->subtitulo = $this->wrapLine ($this->subtitulo, $tmp2,
355                         $conf);
356                 $tmp = $this->strlen($this->subtitulo, $conf);
357             }
358             $init = ($tmp2 - $tmp) / 2; 
359             $this->addText($init, $conf['Y'], $this->subtitulo, 
360                     $conf);
361         }
362     }
363     
364     /**
365      * Funcion que agrega el encabezado a la pagina actual.      
366      *
367      * @param bool $title Muetra o no el titulo.
368      * @param bool $subtitle Muestra o no el subtitulo.
369      *
370      * @return void
371      * @access protected
372      */
373     function _buildHeader($title = true, $subtitle = true) {
374         $this->_resetConf();
375         $this->_addLogo();
376         $this->_addSeccion();
377         $this->_addSubseccion();
378         $this->_addPager();
379         $this->_addDate();
380         $this->_addHeaderRectangle();
381         if ($title) {
382             $this->_addTitle();
383         }
384         if ($subtitle) {
385             $this->_addSubTitle();
386         }
387     }
388
389     /**
390      * Funcion que agrega el contenido al PDF.
391      *
392      * @return void
393      * @access protected
394      */
395     function _buildContent() {
396         $this->_resetConf();
397         if ($this->_contenido) {
398             foreach ($this->_contenido as $cont) {
399                 $cont->toPDF($this); 
400                 //MECON_PDF_Marco se pasa por referencia para que se agregen las
401                 //paginas a medida que se van necesitando. Esto permite que varie el
402                 //tipo de contenido que se agrega.
403             }
404         }
405     }
406
407     /**
408      * Funcion que se encarga de transformar la informacion para que se genere
409      * el archivo pdf.
410      *
411      * @return pdffile Archivo PDF.
412      * @access public
413      */
414     function toPDF() {
415         $this->_buildContent();
416         if ($this->getPages()) {
417             $t = true;
418             foreach ($this->getPages() as $page) {
419                 $this->_pagina_actual = $page;
420                 
421                 $sec = $this->seccion;
422                 $subsec = $this->subseccion;
423                 
424                 if (@$this->_excepciones[$this->numPage($page)]['seccion']) {
425                     $this->seccion = 
426                         $this->_excepciones[$this->numPage($page)]['seccion'];
427                 }
428                 
429                 if (@$this->_excepciones[$this->numPage($page)]['subseccion']) {
430                     $this->subseccion = 
431                         $this->_excepciones[$this->numPage($page)]['subseccion'];
432                 }
433                 
434                 if (@!$this->_excepciones[$this->numPage($page)]['nova']) {
435                     $this->_buildHeader($t, $t);      
436                 }
437                 $t = false;
438                 
439                 $this->seccion = $sec;
440                 $this->subseccion = $subsec;
441             }
442         return parent::toPDF();
443         }
444     }
445
446     /**
447      * Funcion que pemite agregar contenido al PDF.
448      *
449      * @param mixed $contenido Objeto contenido que se agrega.
450      * @param bool $separador Indicacion si hay que agregar un separador.
451      *
452      * @return void
453      * @access public
454      */
455     function addContent($contenido, $separador = true) {
456         //Me aseguro de poner el separador siempre y cuando no sea el primer
457         //objeto de la primer pagina.
458         if ($separador && $this->_contenido) {
459             $this->_contenido[] = $this->_separador_defecto;
460         }
461         $this->_contenido[] = $contenido;
462     }
463 }
464 ?>