]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/PDF/Marco.php
Reestructuracion de todos los PDF
[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
29 /**
30  * Libreria que crea un marco estandar para los pdfs.
31  */
32 class MECON_PDF_Marco extends MECON_PDF {
33
34     /**
35      * Tamanio de las paginas.
36      * @var string $tamanio
37      * @access public   
38      */
39     var $tamanio = "a4";
40
41     /**
42      * Orientacion (portrait o landscape).
43      * @var sting $orientacion
44      * @access public
45      */
46     var $orientacion = "portrait";   
47
48     /**
49      * Array de objetos MECON_PDF_Contenido
50      @ @var array $contenido
51      * @access protected
52      */
53     var $_contenido = array();
54     
55     /**
56      * Espacio dispobible en la pagina. Representa la coordenada Y a partir de
57      * la cual se puede comenzar a escribir el contenido.
58      * @var int $espacioDisponible
59      * @access public
60      */
61     var $espacioDisponible;
62
63     /**
64      * Logo.
65      * @var string $logo
66      * @access public
67      */
68     var $logo; 
69
70     /**
71      * Paginador.
72      * @var bool $paginador
73      * @access public 
74      */
75     var $paginador = true;
76
77     /**
78      * Fecha. Si es true se pone la fecha del servidor, si es false no se pone
79      * nada, en caso contrario se pone lo que haya en esta variable.
80      * @var mixed $fecha
81      * @access public
82      */
83     var $fecha = true;
84     
85     /**
86      * Seccion.
87      * @var string $seccion
88      * @access public 
89      */
90     var $seccion = '';
91
92     /**
93      * SubSeccion.
94      * @var string $subseccion
95      * @access public 
96      */
97     var $subseccion = 'Ministerio de Economia';
98
99     /**
100      * Titulo.
101      * @var string $string
102      * @access public 
103      */
104     var $titulo;
105
106     /**
107      * SubTitulo.
108      * @var string $subtitulo
109      * @access public 
110      */
111     var $subtitulo;
112
113     /**
114      * Excepciones al encabezado
115      * @var array $excepciones
116      * @access protected
117      */
118     var $_excepciones = array ();
119      
120     /**
121      * Class constructor.
122      *
123      * @param string $tam Tamanio de las hojas.
124      * @param string $ori Orientacion de las hojaz (portrait o landscape).
125      *
126      * @return void
127      * @access public
128      */
129     function MECON_PDF_Marco($tam = "a4", $ori = "portrait") {
130         $this->MECON_PDF($tam);
131         $this->tamanio = $tam;
132         $this->orientacion = $ori;
133         $tmp = include 'MECON/PDF/Marco/medidas.php' ; 
134         $tmp = $tmp[$tam][$ori];
135         $tmp['Xi'] = $this->_config['Xi'];
136         $tmp['Yi'] = $this->_config['Yi'];
137         $tmp['Xf'] = $this->_config['Xf'];
138         $tmp['Yf'] = $this->_config['Yf'];
139         $this->_config = $tmp;
140         if (@$this->_config['encabezado']['logo']['path']) {
141             $this->logo = $this->_config['encabezado']['logo']['path'];
142         }
143     }
144
145     /**
146      * Permite agregar nuevas paginas al pdf que se esta armando.
147      *
148      * @param string $pagina Tipo de pagina que se va a utilizar.
149      * @param bool $encabezado Indica si el encabezado debe ponerse en la
150      * pagina.
151      * @param string $seccion Seccion del encabezado para esta pagina nueva.
152      * @param string $subseccion SubSeccion del encabezado para esta pagina 
153      * nueva.
154      *
155      * @return void
156      * @access public
157      */
158     function newPage($pagina = 'a4', $encabezado = true, $seccion = null, $subseccion =
159             null)
160     {   
161         parent::newPage($pagina);
162         if ($encabezado) {
163             $this->espacioDisponible = $this->_config['encabezado']['Yi'] - 27;
164             if ($this->countPages() === 1) {
165                 if ($this->titulo || $this->subtitulo) {
166                     $this->espacioDisponible -= 27;
167                 }
168             }
169             if (!is_null($seccion)) {
170                 $this->excepciones[$this->countPages()]['seccion'] = $seccion;
171             }
172             if (!is_null($subseccion)) {
173                 $this->excepciones[$this->countPages()]['subseccion'] = $subseccion;
174             }
175         }
176         else {
177             $this->espacioDisponible = $this->_config['encabezado']['Yf'];
178             $this->excepciones[$this->countPages()]['nova'] = true;
179             
180         }
181     }
182
183     /**
184      * Funcion que agrega el logo al encabezado de una pagina.
185      *
186      * @return void
187      * @access protected
188      */
189     function _addLogo() {
190         $conf = $this->_config['encabezado'];
191         if ($this->logo) {
192             $this->addImage($this->logo, $conf['logo']['X'],
193                     $conf['logo']['Y'], null, 'jpg', $this->orientacion);
194         }
195     }
196
197     /**
198      * Funcion que agrega la seccion al encabezado de una pagina.
199      *
200      * @return void
201      * @access protected
202      */
203     function _addSeccion() {
204         $conf = $this->_config['encabezado'];
205         if ($this->seccion) {
206             $tmp = $this->strlen($this->seccion, $conf['seccion']);
207             $tmp2 = $conf['linea2']['Xi'] - $conf['linea1']['Xi'];
208             if ($tmp >= $tmp2) {
209                 $this->seccion = $this->wrapLine ($this->seccion, $tmp2,
210                         $conf['seccion']);
211                 $tmp = $this->strlen($this->seccion, $conf['seccion']);
212             }
213             $init = $conf['linea1']['Xi'] + ( $conf['linea2']['Xi'] 
214                     - $conf['linea1']['Xi'] - $tmp) / 2; 
215             $this->addText($init, $conf['seccion']['Y'], $this->seccion,
216                     $conf['seccion'], null, $this->orientacion);
217         }
218     }
219    
220     /**
221      * Funcion que agrega la subseccion al encabezado de una pagina.
222      *
223      * @return void
224      * @access protected
225      */
226     function _addSubSeccion() {
227         $conf = $this->_config['encabezado'];
228         if ($this->subseccion) {
229             $tmp = $this->strlen($this->subseccion, $conf['subseccion']);
230             $tmp2 = $conf['linea2']['Xi'] - $conf['linea1']['Xi'];
231             if ($tmp >= $tmp2) {
232                 $this->subseccion = $this->wrapLine ($this->subseccion, $tmp2,
233                         $conf['subseccion']);
234                 $tmp = $this->strlen($this->subseccion, $conf['subseccion']);
235             }
236             $init = $conf['linea1']['Xi'] + ( $conf['linea2']['Xi'] 
237                     - $conf['linea1']['Xi'] - $tmp) / 2; 
238             $this->addText($init, $conf['subseccion']['Y'], $this->subseccion, 
239                     $conf['subseccion'], null, $this->orientacion);
240         }
241     }
242
243     /**
244      * Funcion que agrega el paginador al encabezado de una pagina.
245      *
246      * @return void
247      * @access protected
248      */
249     function _addPager() {
250         $conf = $this->_config['encabezado'];
251         if ($this->paginador) {
252             $txt = 'Pagina '.$this->numPage().' de '.
253                 $this->countPages();
254             $tmp = $this->strlen($txt, $conf['paginador']);
255             $init = $conf['linea2']['Xi'] + ( $conf['Xf'] 
256                     - $conf['linea2']['Xi'] - $tmp) / 2; 
257             $this->addText($init, $conf['paginador']['Y'], $txt, 
258                     $conf['paginador'], null, $this->orientacion);
259         }
260     }
261     
262     /**
263      * Funcion que permite agregar la fecha al encabezado de una pagina.
264      *
265      * @return void
266      * @access protected
267      */
268     function _addDate() {
269         $conf = $this->_config['encabezado'];
270         if ($this->fecha) {
271             //@TODO Ver si es un objeto DATE            
272             if ($this->fecha === true) {
273                 $this->fecha = date("d/m/Y");
274             }
275             $tmp = $this->strlen($this->fecha, $conf['fecha']);
276             $init = $conf['linea2']['Xi'] + ( $conf['Xf'] 
277                     - $conf['linea2']['Xi'] - $tmp) / 2; 
278             $this->addText($init, $conf['fecha']['Y'], $this->fecha,
279                     $conf['fecha'], null, $this->orientacion);
280         }
281     }
282     
283     /**
284      * Funcion que arma el recuadro del encabezado de las paginas.
285      * 
286      * @return void
287      * @access protected
288      */
289     function _addHeaderRectangle() {
290         $conf = $this->_config['encabezado'];
291         //Armo el recuadro
292         $this->addRectangle ($conf['Xi'], $conf['Yi'], $conf['Xf'], 
293                     $conf['Yf'], '', null, $this->orientacion);
294         $this->addLine($conf['linea1']['Xi'], $conf['linea1']['Yi'], 
295                 $conf['linea1']['Xf'], $conf['linea1']['Yf'], '', null,
296                 $this->orientacion);
297         $this->addLine($conf['linea2']['Xi'], $conf['linea2']['Yi'], 
298                 $conf['linea2']['Xf'], $conf['linea2']['Yf'], '', null,
299                 $this->orientacion);
300     }
301     
302     /**
303      * Funcion que permite agregar el titulo a una pagina.
304      *
305      * @return void
306      * @access protected
307      */
308     function _addTitle() {
309         $conf = $this->_config['titulo'];
310         if ($this->titulo) {
311             $tmp = $this->strlen($this->titulo, $conf);
312             $tmp2 = $this->getWidth($this->orientacion);
313             if ($tmp >= $tmp2) {
314                 $this->titulo = $this->wrapLine ($this->titulo, $tmp2,
315                         $conf);
316                 $tmp = $this->strlen($this->titulo, $conf);
317             }
318             $init = ($tmp2 - $tmp) / 2; 
319             $this->addText($init, $conf['Y'], $this->titulo, 
320                     $conf, null, $this->orientacion);
321         }
322     }
323
324     /**
325      * Funcion que permite agregar el subtitulo a una pagina.
326      *
327      * @return void
328      * @access protected
329      */
330     function _addSubTitle() {
331         $conf = $this->_config['subtitulo'];
332         if ($this->subtitulo) {
333             $tmp = $this->strlen($this->subtitulo, $conf);
334             $tmp2 = $this->getWidth($this->orientacion);
335             if ($tmp >= $tmp2) {
336                 $this->subtitulo = $this->wrapLine ($this->subtitulo, $tmp2,
337                         $conf);
338                 $tmp = $this->strlen($this->subtitulo, $conf);
339             }
340             $init = ($tmp2 - $tmp) / 2; 
341             $this->addText($init, $conf['Y'], $this->subtitulo, 
342                     $conf, null, $this->orientacion);
343         }
344     }
345     
346     /**
347      * Funcion que agrega el encabezado a la pagina actual.      
348      *
349      * @param bool $title Muetra o no el titulo.
350      * @param bool $subtitle Muestra o no el subtitulo.
351      *
352      * @return void
353      * @access protected
354      */
355     function _buildHeader($title = true, $subtitle = true) {
356         $this->_addLogo();
357         $this->_addSeccion();
358         $this->_addSubseccion();
359         $this->_addPager();
360         $this->_addDate();
361         $this->_addHeaderRectangle();
362         if ($title) {
363             $this->_addTitle();
364         }
365         if ($subtitle) {
366             $this->_addSubTitle();
367         }
368     }
369
370     /**
371      * Funcion que agrega el contenido al PDF.
372      *
373      * @return void
374      * @access protected
375      */
376     function _buildContent() {
377         if ($this->_contenido) {
378             foreach ($this->_contenido as $cont) {
379                 $cont->toPDF($this); 
380                 //MECON_PDF_Marco se pasa por referencia para que se agregen las
381                 //paginas a medida que se van necesitando. Esto permite que varie el
382                 //tipo de contenido que se agrega.
383             }
384         }
385     }
386
387     /**
388      * Funcion que se encarga de transformar la informacion para que se genere
389      * el archivo pdf.
390      *
391      * @return pdffile Archivo PDF.
392      * @access public
393      */
394     function toPDF() {
395         $this->newPage($this->tamanio);
396         $this->_buildContent();
397         if ($this->getPages()) {
398             $t = true;
399             foreach ($this->getPages() as $page) {
400                 $this->_pagina_actual = $page;
401                 
402                 $sec = $this->seccion;
403                 $subsec = $this->subseccion;
404                 
405                 if (@$this->_excepciones[$this->numPage($page)]['seccion']) {
406                     $this->seccion = 
407                         $this->_excepciones[$this->numPage($page)]['seccion'];
408                 }
409                 
410                 if (@$this->_excepciones[$this->numPage($page)]['subseccion']) {
411                     $this->subseccion = 
412                         $this->_excepciones[$this->numPage($page)]['subseccion'];
413                 }
414                 
415                 if (@!$this->_excepciones[$this->numPage($page)]['nova']) {
416                     $this->_buildHeader($t, $t);      
417                 }
418                 $t = false;
419                 
420                 $this->seccion = $sec;
421                 $this->subseccion = $subsec;
422             }
423         return parent::toPDF();
424         }
425     }
426
427     /**
428      * Funcion que pemite agregar contenido al PDF.
429      *
430      * @param mixed $contenido Objeto contenido que se agrega.
431      * @param bool $separador Indicacion si hay que agregar un separador.
432      *
433      * @return void
434      * @access public
435      */
436     function addContent($contenido, $separador = true) {
437         if ($separador && $this->getPages()) {
438             //@TODO Agregar el separador por defecto.
439             //$this->contenido[] = $separador_defecto
440         }
441         $this->_contenido[] = $contenido;
442     }
443 }
444 ?>