]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/PDF/Marco.php
error en excepciones
[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         if ($encabezado) {
172             $this->espacioDisponible = $this->_config['encabezado']['Yi'] - 27;
173             if ($this->countPages() === 1) {
174                 if ($this->titulo || $this->subtitulo) {
175                     $this->espacioDisponible -= 27;
176                 }
177             }
178             if (!is_null($seccion)) {
179                 $this->_excepciones[$this->numPage()]['seccion'] = $seccion;
180             }
181             if (!is_null($subseccion)) {
182                 $this->_excepciones[$this->numPage()]['subseccion'] = $subseccion;
183             }
184         }
185         else {
186             $this->espacioDisponible = $this->_config['encabezado']['Yf'];
187             $this->_excepciones[$this->countPages()]['nova'] = true;
188             
189         }
190     }
191
192     /**
193      * Funcion que agrega el logo al encabezado de una pagina.
194      *
195      * @return void
196      * @access protected
197      */
198     function _addLogo() {
199         $this->_resetConf();
200         $conf = $this->_config['encabezado'];
201         if ($this->logo) {
202             $this->addImage($this->logo, $conf['logo']['X'],
203                     $conf['logo']['Y'], null, 'jpg');
204         }
205     }
206
207     /**
208      * Funcion que agrega la seccion al encabezado de una pagina.
209      *
210      * @return void
211      * @access protected
212      */
213     function _addSeccion() {
214         $this->_resetConf();
215         $conf = $this->_config['encabezado'];
216         if ($this->seccion) {
217             $tmp = $this->strlen($this->seccion, $conf['seccion']);
218             $tmp2 = $conf['linea2']['Xi'] - $conf['linea1']['Xi'];
219             if ($tmp >= $tmp2) {
220                 $this->seccion = $this->wrapLine ($this->seccion, $tmp2,
221                         $conf['seccion']);
222                 $tmp = $this->strlen($this->seccion, $conf['seccion']);
223             }
224             $init = $conf['linea1']['Xi'] + ( $conf['linea2']['Xi'] 
225                     - $conf['linea1']['Xi'] - $tmp) / 2; 
226             $this->addText($init, $conf['seccion']['Y'], $this->seccion,
227                     $conf['seccion']);
228         }
229     }
230    
231     /**
232      * Funcion que agrega la subseccion al encabezado de una pagina.
233      *
234      * @return void
235      * @access protected
236      */
237     function _addSubSeccion() {
238         $this->_resetConf();
239         $conf = $this->_config['encabezado'];
240         if ($this->subseccion) {
241             $tmp = $this->strlen($this->subseccion, $conf['subseccion']);
242             $tmp2 = $conf['linea2']['Xi'] - $conf['linea1']['Xi'];
243             if ($tmp >= $tmp2) {
244                 $this->subseccion = $this->wrapLine ($this->subseccion, $tmp2,
245                         $conf['subseccion']);
246                 $tmp = $this->strlen($this->subseccion, $conf['subseccion']);
247             }
248             $init = $conf['linea1']['Xi'] + ( $conf['linea2']['Xi'] 
249                     - $conf['linea1']['Xi'] - $tmp) / 2; 
250             $this->addText($init, $conf['subseccion']['Y'], $this->subseccion, 
251                     $conf['subseccion']);
252         }
253     }
254
255     /**
256      * Funcion que agrega el paginador al encabezado de una pagina.
257      *
258      * @return void
259      * @access protected
260      */
261     function _addPager() {
262         $this->_resetConf();
263         $conf = $this->_config['encabezado'];
264         if ($this->paginador) {
265             $txt = 'Pagina '.$this->numPage().' de '.
266                 $this->countPages();
267             $tmp = $this->strlen($txt, $conf['paginador']);
268             $init = $conf['linea2']['Xi'] + ( $conf['Xf'] 
269                     - $conf['linea2']['Xi'] - $tmp) / 2; 
270             $this->addText($init, $conf['paginador']['Y'], $txt, 
271                     $conf['paginador']);
272         }
273     }
274     
275     /**
276      * Funcion que permite agregar la fecha al encabezado de una pagina.
277      *
278      * @return void
279      * @access protected
280      */
281     function _addDate() {
282         $this->_resetConf();
283         $conf = $this->_config['encabezado'];
284         if ($this->fecha) {
285             if (is_a($this->fecha, 'Date')) {
286                 $this->fecha = $this->fecha->format("%d/%m/%Y");
287             }
288             elseif ($this->fecha === true) {
289                 $this->fecha = date("d/m/Y");
290             }
291             $tmp = $this->strlen($this->fecha, $conf['fecha']);
292             $init = $conf['linea2']['Xi'] + ( $conf['Xf'] 
293                     - $conf['linea2']['Xi'] - $tmp) / 2; 
294             $this->addText($init, $conf['fecha']['Y'], $this->fecha,
295                     $conf['fecha']);
296         }
297     }
298     
299     /**
300      * Funcion que arma el recuadro del encabezado de las paginas.
301      * 
302      * @return void
303      * @access protected
304      */
305     function _addHeaderRectangle() {
306         $this->_resetConf();
307         $conf = $this->_config['encabezado'];
308         //Armo el recuadro
309         $this->addRectangle ($conf['Xi'], $conf['Yi'], $conf['Xf'], 
310                     $conf['Yf'], '');
311         $this->addLine($conf['linea1']['Xi'], $conf['linea1']['Yi'], 
312                 $conf['linea1']['Xf'], $conf['linea1']['Yf'], '');
313         $this->addLine($conf['linea2']['Xi'], $conf['linea2']['Yi'], 
314                 $conf['linea2']['Xf'], $conf['linea2']['Yf'], '');
315     }
316
317     /**
318      * Funcion que permite agregar el titulo a una pagina.
319      *
320      * @return void
321      * @access protected
322      */
323     function _addTitle() {
324         $this->_resetConf();
325         $conf = $this->_config['titulo'];
326         if ($this->titulo) {
327             $tmp = $this->strlen($this->titulo, $conf);
328             $tmp2 = $this->getWidth();
329             if ($tmp >= $tmp2) {
330                 $this->titulo = $this->wrapLine ($this->titulo, $tmp2,
331                         $conf);
332                 $tmp = $this->strlen($this->titulo, $conf);
333             }
334             $init = ($tmp2 - $tmp) / 2; 
335             $this->addText($init, $conf['Y'], $this->titulo, 
336                     $conf);
337         }
338     }
339
340     /**
341      * Funcion que permite agregar el subtitulo a una pagina.
342      *
343      * @return void
344      * @access protected
345      */
346     function _addSubTitle() {
347         $this->_resetConf();
348         $conf = $this->_config['subtitulo'];
349         if ($this->subtitulo) {
350             $tmp = $this->strlen($this->subtitulo, $conf);
351             $tmp2 = $this->getWidth();
352             if ($tmp >= $tmp2) {
353                 $this->subtitulo = $this->wrapLine ($this->subtitulo, $tmp2,
354                         $conf);
355                 $tmp = $this->strlen($this->subtitulo, $conf);
356             }
357             $init = ($tmp2 - $tmp) / 2; 
358             $this->addText($init, $conf['Y'], $this->subtitulo, 
359                     $conf);
360         }
361     }
362     
363     /**
364      * Funcion que agrega el encabezado a la pagina actual.      
365      *
366      * @param bool $title Muetra o no el titulo.
367      * @param bool $subtitle Muestra o no el subtitulo.
368      *
369      * @return void
370      * @access protected
371      */
372     function _buildHeader($title = true, $subtitle = true) {
373         $this->_resetConf();
374         $this->_addLogo();
375         $this->_addSeccion();
376         $this->_addSubseccion();
377         $this->_addPager();
378         $this->_addDate();
379         $this->_addHeaderRectangle();
380         if ($title) {
381             $this->_addTitle();
382         }
383         if ($subtitle) {
384             $this->_addSubTitle();
385         }
386     }
387
388     /**
389      * Funcion que agrega el contenido al PDF.
390      *
391      * @return void
392      * @access protected
393      */
394     function _buildContent() {
395         $this->_resetConf();
396         if ($this->_contenido) {
397             foreach ($this->_contenido as $cont) {
398                 $cont->toPDF($this); 
399                 //MECON_PDF_Marco se pasa por referencia para que se agregen las
400                 //paginas a medida que se van necesitando. Esto permite que varie el
401                 //tipo de contenido que se agrega.
402             }
403         }
404     }
405
406     /**
407      * Funcion que se encarga de transformar la informacion para que se genere
408      * el archivo pdf.
409      *
410      * @return pdffile Archivo PDF.
411      * @access public
412      */
413     function toPDF() {
414         $this->_buildContent();
415         if ($this->getPages()) {
416             $t = true;
417             foreach ($this->getPages() as $page) {
418                 $this->_pagina_actual = $page;
419                 
420                 $sec = $this->seccion;
421                 $subsec = $this->subseccion;
422                 
423                 if (@$this->_excepciones[$this->numPage($page)]['seccion']) {
424                     $this->seccion = 
425                         $this->_excepciones[$this->numPage($page)]['seccion'];
426                 }
427                 
428                 if (@$this->_excepciones[$this->numPage($page)]['subseccion']) {
429                     $this->subseccion = 
430                         $this->_excepciones[$this->numPage($page)]['subseccion'];
431                 }
432                 
433                 if (@!$this->_excepciones[$this->numPage($page)]['nova']) {
434                     $this->_buildHeader($t, $t);      
435                 }
436                 $t = false;
437                 
438                 $this->seccion = $sec;
439                 $this->subseccion = $subsec;
440             }
441         return parent::toPDF();
442         }
443     }
444
445     /**
446      * Funcion que pemite agregar contenido al PDF.
447      *
448      * @param mixed $contenido Objeto contenido que se agrega.
449      * @param bool $separador Indicacion si hay que agregar un separador.
450      *
451      * @return void
452      * @access public
453      */
454     function addContent($contenido, $separador = true) {
455         //Me aseguro de poner el separador siempre y cuando no sea el primer
456         //objeto de la primer pagina.
457         if ($separador) {
458             $this->_contenido[] = $this->_separador_defecto;
459         }
460         $this->_contenido[] = $contenido;
461     }
462 }
463 ?>