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