]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/PDF/Marco.php
Agregp un metodo mas comodo para get Width
[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             if (is_a($this->fecha, 'Date')) {
272                 $this->fecha = $this->fecha->format("%d/%m/%Y");
273             }
274             elseif ($this->fecha === true) {
275                 $this->fecha = date("d/m/Y");
276             }
277             $tmp = $this->strlen($this->fecha, $conf['fecha']);
278             $init = $conf['linea2']['Xi'] + ( $conf['Xf'] 
279                     - $conf['linea2']['Xi'] - $tmp) / 2; 
280             $this->addText($init, $conf['fecha']['Y'], $this->fecha,
281                     $conf['fecha'], null, $this->orientacion);
282         }
283     }
284     
285     /**
286      * Funcion que arma el recuadro del encabezado de las paginas.
287      * 
288      * @return void
289      * @access protected
290      */
291     function _addHeaderRectangle() {
292         $conf = $this->_config['encabezado'];
293         //Armo el recuadro
294         $this->addRectangle ($conf['Xi'], $conf['Yi'], $conf['Xf'], 
295                     $conf['Yf'], '', null, $this->orientacion);
296         $this->addLine($conf['linea1']['Xi'], $conf['linea1']['Yi'], 
297                 $conf['linea1']['Xf'], $conf['linea1']['Yf'], '', null,
298                 $this->orientacion);
299         $this->addLine($conf['linea2']['Xi'], $conf['linea2']['Yi'], 
300                 $conf['linea2']['Xf'], $conf['linea2']['Yf'], '', null,
301                 $this->orientacion);
302     }
303
304     /*
305      *  Funcion que obtiene el ancho de la pagina
306      *
307      *  @return ancho de la pagina
308      *  @access public
309      */
310      function getWidth() {
311        return parent::getWith($this->orientacion);
312      }
313     
314     /**
315      * Funcion que permite agregar el titulo a una pagina.
316      *
317      * @return void
318      * @access protected
319      */
320     function _addTitle() {
321         $conf = $this->_config['titulo'];
322         if ($this->titulo) {
323             $tmp = $this->strlen($this->titulo, $conf);
324             $tmp2 = $this->getWidth($this->orientacion);
325             if ($tmp >= $tmp2) {
326                 $this->titulo = $this->wrapLine ($this->titulo, $tmp2,
327                         $conf);
328                 $tmp = $this->strlen($this->titulo, $conf);
329             }
330             $init = ($tmp2 - $tmp) / 2; 
331             $this->addText($init, $conf['Y'], $this->titulo, 
332                     $conf, null, $this->orientacion);
333         }
334     }
335
336     /**
337      * Funcion que permite agregar el subtitulo a una pagina.
338      *
339      * @return void
340      * @access protected
341      */
342     function _addSubTitle() {
343         $conf = $this->_config['subtitulo'];
344         if ($this->subtitulo) {
345             $tmp = $this->strlen($this->subtitulo, $conf);
346             $tmp2 = $this->getWidth($this->orientacion);
347             if ($tmp >= $tmp2) {
348                 $this->subtitulo = $this->wrapLine ($this->subtitulo, $tmp2,
349                         $conf);
350                 $tmp = $this->strlen($this->subtitulo, $conf);
351             }
352             $init = ($tmp2 - $tmp) / 2; 
353             $this->addText($init, $conf['Y'], $this->subtitulo, 
354                     $conf, null, $this->orientacion);
355         }
356     }
357     
358     /**
359      * Funcion que agrega el encabezado a la pagina actual.      
360      *
361      * @param bool $title Muetra o no el titulo.
362      * @param bool $subtitle Muestra o no el subtitulo.
363      *
364      * @return void
365      * @access protected
366      */
367     function _buildHeader($title = true, $subtitle = true) {
368         $this->_addLogo();
369         $this->_addSeccion();
370         $this->_addSubseccion();
371         $this->_addPager();
372         $this->_addDate();
373         $this->_addHeaderRectangle();
374         if ($title) {
375             $this->_addTitle();
376         }
377         if ($subtitle) {
378             $this->_addSubTitle();
379         }
380     }
381
382     /**
383      * Funcion que agrega el contenido al PDF.
384      *
385      * @return void
386      * @access protected
387      */
388     function _buildContent() {
389         if ($this->_contenido) {
390             foreach ($this->_contenido as $cont) {
391                 $cont->toPDF($this); 
392                 //MECON_PDF_Marco se pasa por referencia para que se agregen las
393                 //paginas a medida que se van necesitando. Esto permite que varie el
394                 //tipo de contenido que se agrega.
395             }
396         }
397     }
398
399     /**
400      * Funcion que se encarga de transformar la informacion para que se genere
401      * el archivo pdf.
402      *
403      * @return pdffile Archivo PDF.
404      * @access public
405      */
406     function toPDF() {
407         $this->newPage($this->tamanio);
408         $this->_buildContent();
409         if ($this->getPages()) {
410             $t = true;
411             foreach ($this->getPages() as $page) {
412                 $this->_pagina_actual = $page;
413                 
414                 $sec = $this->seccion;
415                 $subsec = $this->subseccion;
416                 
417                 if (@$this->_excepciones[$this->numPage($page)]['seccion']) {
418                     $this->seccion = 
419                         $this->_excepciones[$this->numPage($page)]['seccion'];
420                 }
421                 
422                 if (@$this->_excepciones[$this->numPage($page)]['subseccion']) {
423                     $this->subseccion = 
424                         $this->_excepciones[$this->numPage($page)]['subseccion'];
425                 }
426                 
427                 if (@!$this->_excepciones[$this->numPage($page)]['nova']) {
428                     $this->_buildHeader($t, $t);      
429                 }
430                 $t = false;
431                 
432                 $this->seccion = $sec;
433                 $this->subseccion = $subsec;
434             }
435         return parent::toPDF();
436         }
437     }
438
439     /**
440      * Funcion que pemite agregar contenido al PDF.
441      *
442      * @param mixed $contenido Objeto contenido que se agrega.
443      * @param bool $separador Indicacion si hay que agregar un separador.
444      *
445      * @return void
446      * @access public
447      */
448     function addContent($contenido, $separador = true) {
449         if ($separador && $this->getPages()) {
450             //@TODO Agregar el separador por defecto.
451             //$this->contenido[] = $separador_defecto
452         }
453         $this->_contenido[] = $contenido;
454     }
455 }
456 ?>