]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/PDF/Marco.php
Ahora puede asignarse un objeto Date a la fecha, automaticamente escribira el valor...
[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 permite agregar el titulo a una pagina.
306      *
307      * @return void
308      * @access protected
309      */
310     function _addTitle() {
311         $conf = $this->_config['titulo'];
312         if ($this->titulo) {
313             $tmp = $this->strlen($this->titulo, $conf);
314             $tmp2 = $this->getWidth($this->orientacion);
315             if ($tmp >= $tmp2) {
316                 $this->titulo = $this->wrapLine ($this->titulo, $tmp2,
317                         $conf);
318                 $tmp = $this->strlen($this->titulo, $conf);
319             }
320             $init = ($tmp2 - $tmp) / 2; 
321             $this->addText($init, $conf['Y'], $this->titulo, 
322                     $conf, null, $this->orientacion);
323         }
324     }
325
326     /**
327      * Funcion que permite agregar el subtitulo a una pagina.
328      *
329      * @return void
330      * @access protected
331      */
332     function _addSubTitle() {
333         $conf = $this->_config['subtitulo'];
334         if ($this->subtitulo) {
335             $tmp = $this->strlen($this->subtitulo, $conf);
336             $tmp2 = $this->getWidth($this->orientacion);
337             if ($tmp >= $tmp2) {
338                 $this->subtitulo = $this->wrapLine ($this->subtitulo, $tmp2,
339                         $conf);
340                 $tmp = $this->strlen($this->subtitulo, $conf);
341             }
342             $init = ($tmp2 - $tmp) / 2; 
343             $this->addText($init, $conf['Y'], $this->subtitulo, 
344                     $conf, null, $this->orientacion);
345         }
346     }
347     
348     /**
349      * Funcion que agrega el encabezado a la pagina actual.      
350      *
351      * @param bool $title Muetra o no el titulo.
352      * @param bool $subtitle Muestra o no el subtitulo.
353      *
354      * @return void
355      * @access protected
356      */
357     function _buildHeader($title = true, $subtitle = true) {
358         $this->_addLogo();
359         $this->_addSeccion();
360         $this->_addSubseccion();
361         $this->_addPager();
362         $this->_addDate();
363         $this->_addHeaderRectangle();
364         if ($title) {
365             $this->_addTitle();
366         }
367         if ($subtitle) {
368             $this->_addSubTitle();
369         }
370     }
371
372     /**
373      * Funcion que agrega el contenido al PDF.
374      *
375      * @return void
376      * @access protected
377      */
378     function _buildContent() {
379         if ($this->_contenido) {
380             foreach ($this->_contenido as $cont) {
381                 $cont->toPDF($this); 
382                 //MECON_PDF_Marco se pasa por referencia para que se agregen las
383                 //paginas a medida que se van necesitando. Esto permite que varie el
384                 //tipo de contenido que se agrega.
385             }
386         }
387     }
388
389     /**
390      * Funcion que se encarga de transformar la informacion para que se genere
391      * el archivo pdf.
392      *
393      * @return pdffile Archivo PDF.
394      * @access public
395      */
396     function toPDF() {
397         $this->newPage($this->tamanio);
398         $this->_buildContent();
399         if ($this->getPages()) {
400             $t = true;
401             foreach ($this->getPages() as $page) {
402                 $this->_pagina_actual = $page;
403                 
404                 $sec = $this->seccion;
405                 $subsec = $this->subseccion;
406                 
407                 if (@$this->_excepciones[$this->numPage($page)]['seccion']) {
408                     $this->seccion = 
409                         $this->_excepciones[$this->numPage($page)]['seccion'];
410                 }
411                 
412                 if (@$this->_excepciones[$this->numPage($page)]['subseccion']) {
413                     $this->subseccion = 
414                         $this->_excepciones[$this->numPage($page)]['subseccion'];
415                 }
416                 
417                 if (@!$this->_excepciones[$this->numPage($page)]['nova']) {
418                     $this->_buildHeader($t, $t);      
419                 }
420                 $t = false;
421                 
422                 $this->seccion = $sec;
423                 $this->subseccion = $subsec;
424             }
425         return parent::toPDF();
426         }
427     }
428
429     /**
430      * Funcion que pemite agregar contenido al PDF.
431      *
432      * @param mixed $contenido Objeto contenido que se agrega.
433      * @param bool $separador Indicacion si hay que agregar un separador.
434      *
435      * @return void
436      * @access public
437      */
438     function addContent($contenido, $separador = true) {
439         if ($separador && $this->getPages()) {
440             //@TODO Agregar el separador por defecto.
441             //$this->contenido[] = $separador_defecto
442         }
443         $this->_contenido[] = $contenido;
444     }
445 }
446 ?>