]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/PDF/Marco.php
Se agrega un ejemplo sobre la utilizacion de los PDF con la nueva clase
[mecon/meconlib.git] / lib / MLIB / PDF / Marco.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                                     mlib
4 -------------------------------------------------------------------------------
5 This file is part of mlib.
6
7 mlib is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2 of the License, or (at your option)
10 any later version.
11
12 mlib is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15  
16 You should have received a copy of the GNU General Public License; if not,
17 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 Boston, MA  02111-1307  USA
19 -------------------------------------------------------------------------------
20 Creado: Fri Oct 24 16:34:11 2003
21 Autor:  Martin Marrese <mmarre@mecon.gov.ar>
22 -------------------------------------------------------------------------------
23 $Id$
24 -----------------------------------------------------------------------------*/
25
26 require_once 'MLIB/PDF.php';
27 require_once 'MLIB/PDF/Separador.php';
28 require_once 'MLIB/PDF/HeaderDefecto.php';
29
30 /**
31  * Libreria que crea un marco estandar para los pdfs.
32  */
33 class MLIB_PDF_Marco extends MLIB_PDF {
34
35     /**
36      * Objeto MLIB_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 MLIB_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      * MLIB_PDF_Header. Objeto que hay que utilizar como enzabezado. Si hay
116      * algo aqui se desecha el encabezado por defecto.
117      * @var Object $header
118      * @access public
119      */
120     var $header = null;
121      
122     /**
123      * Class constructor.
124      *
125      * @param string $tam Tamanio de las hojas.
126      * @param string $ori Orientacion de las hojaz (portrait o landscape).
127      * @param string $nom Nombre del archivo.
128      *
129      * @return void
130      * @access public
131      */
132     function MLIB_PDF_Marco($tam = "a4", $ori = "portrait", $nom = 'Doc.pdf') {
133         $this->MLIB_PDF($tam, $ori, $nom);
134         $this->tamanio = $tam;
135         $this->_resetConf();
136         $this->_separador_defecto =& new MLIB_PDF_Separador();
137     }
138
139     /**
140      *  Funcion que setea los valores de conf para poder poner las cabeceras
141      *  @access private
142      *  @param int $pagina numero del la pagina de la que debe setear loa
143      *  valores
144      *  @return void
145      */
146     function _resetConf($pagina = null)
147     {
148         if(is_null($pagina));
149             $pagina = $this->numPage();
150         $tmp = include 'MLIB/PDF/Marco/medidas.php' ; 
151         $tmp = $tmp[$this->tamanio][$this->getOrientation($pagina)];
152         $tmp['Xi'] = $this->_config['Xi'];
153         $tmp['Yi'] = $this->_config['Yi'];
154         $tmp['Xf'] = $this->_config['Xf'];
155         $tmp['Yf'] = $this->_config['Yf'];
156         $this->_config = $tmp;
157     }
158
159     /**
160      * Permite agregar nuevas paginas al pdf que se esta armando.
161      *
162      * @param string $pagina Tipo de pagina que se va a utilizar.
163      * @param string $orientacion Orientacion de la hoja
164      * @param bool $encabezado Indica si el encabezado debe ponerse en la
165      * pagina.
166      * @param string $seccion Seccion del encabezado para esta pagina nueva.
167      * @param string $subseccion SubSeccion del encabezado para esta pagina 
168      * nueva.
169      *
170      * @return void
171      * @access public
172      */
173     function newPage($pagina = 'a4', $orientacion = null, $encabezado = true, 
174             $seccion = null, $subseccion = null) {   
175         parent::newPage($pagina, $orientacion);
176         $this->_resetConf();
177         if ($encabezado) {
178             $this->espacioDisponible = $this->header->getAltura() - 27;
179             if ($this->countPages() === 1) {
180                 if ($this->titulo || $this->subtitulo) {
181                     $this->espacioDisponible -= 27;
182                 }
183             }
184             if (!is_null($seccion)) {
185                 $this->_excepciones[$this->numPage()]['seccion'] = $seccion;
186             }
187             if (!is_null($subseccion)) {
188                 $this->_excepciones[$this->numPage()]['subseccion'] = $subseccion;
189             }
190         }
191         else {
192             $this->espacioDisponible = $this->_config['Yf'];
193             $this->_excepciones[$this->countPages()]['nova'] = true;
194             
195         }
196     }
197
198     /**
199      * Funcion que permite agregar el titulo a una pagina.
200      *
201      * @return void
202      * @access protected
203      */
204     function _addTitle() {
205         $this->_resetConf();
206         $conf = $this->_config['titulo'];
207         if ($this->titulo) {
208             $tmp = $this->strlen($this->titulo, $conf);
209             $tmp2 = $this->getWidth();
210             if ($tmp >= $tmp2) {
211                 $this->titulo = $this->wrapLine ($this->titulo, $tmp2,
212                         $conf);
213                 $tmp = $this->strlen($this->titulo, $conf);
214             }
215             $init = ($tmp2 - $tmp) / 2; 
216             $this->addText($init, $conf['Y'], $this->titulo, 
217                     $conf);
218         }
219     }
220
221     /**
222      * Funcion que permite agregar el subtitulo a una pagina.
223      *
224      * @return void
225      * @access protected
226      */
227     function _addSubTitle() {
228         $this->_resetConf();
229         $conf = $this->_config['subtitulo'];
230         if ($this->subtitulo) {
231             $tmp = $this->strlen($this->subtitulo, $conf);
232             $tmp2 = $this->getWidth();
233             if ($tmp >= $tmp2) {
234                 $this->subtitulo = $this->wrapLine ($this->subtitulo, $tmp2,
235                         $conf);
236                 $tmp = $this->strlen($this->subtitulo, $conf);
237             }
238             $init = ($tmp2 - $tmp) / 2; 
239             $this->addText($init, $conf['Y'], $this->subtitulo, 
240                     $conf);
241         }
242     }
243     
244     /**
245      * Funcion que agrega el encabezado a la pagina actual.      
246      *
247      * @param bool $title Muetra o no el titulo.
248      * @param bool $subtitle Muestra o no el subtitulo.
249      *
250      * @return void
251      * @access protected
252      */
253     function _buildHeader($title = true, $subtitle = true) {
254         //Agrego el header.
255         $this->header->toPdf($this);
256         if ($title) {
257             $this->_addTitle();
258         }
259         if ($subtitle) {
260             $this->_addSubTitle();
261         }
262     }
263
264     /**
265      * Funcion que crea el Header por defecto.
266      *
267      * @return void
268      * @access protected
269      */
270     function _crearHeaderDefecto() {
271         $this->header =& new MLIB_PDF_HeaderDefecto($this->tamanio,
272                 $this->getOrientation($this->numPage()));
273         if (@$this->logo) {
274             $this->header->logo = $this->logo;
275         }
276         $this->header->seccion = $this->seccion;
277         $this->header->subseccion = $this->subseccion;
278         $this->header->paginador = $this->paginador;
279         $this->header->fecha = $this->fecha;
280     }
281     
282     /**
283      * Funcion que agrega el contenido al PDF.
284      *
285      * @return void
286      * @access protected
287      */
288     function _buildContent() {
289         $this->_resetConf();
290         if ($this->_contenido) {
291             foreach ($this->_contenido as $cont) {
292                 $cont->toPDF($this); 
293                 //MLIB_PDF_Marco se pasa por referencia para que se agregen las
294                 //paginas a medida que se van necesitando. Esto permite que varie el
295                 //tipo de contenido que se agrega.
296             }
297         }
298     }
299
300     /**
301      * Funcion que se encarga de transformar la informacion para que se genere
302      * el archivo pdf.
303      *
304      * @return pdffile Archivo PDF.
305      * @access public
306      */
307     function toPDF() {
308         //Veo si hay que utilizar o no el header por defecto.
309         if (!$this->header) {
310             $this->_crearHeaderDefecto();
311         }
312         
313         $this->_buildContent();
314         if ($this->getPages()) {
315             $t = true;
316             foreach ($this->getPages() as $page) {
317                 $this->_pagina_actual = $page;
318                 
319                 $sec = $this->header->seccion;
320                 $subsec = $this->header->subseccion;
321                 
322                 if (@$this->_excepciones[$this->numPage($page)]['seccion']) {
323                     $this->header->seccion = 
324                         $this->_excepciones[$this->numPage($page)]['seccion'];
325                 }
326                 
327                 if (@$this->_excepciones[$this->numPage($page)]['subseccion']) {
328                     $this->header->subseccion = 
329                         $this->_excepciones[$this->numPage($page)]['subseccion'];
330                 }
331                 
332                 if (@!$this->_excepciones[$this->numPage($page)]['nova']) {
333                     $this->_buildHeader($t, $t);      
334                 }
335                 //Solo agrego el titulo y subtitulo en la primer hoja
336                 $t = false;
337                 
338                 $this->header->seccion = $sec;
339                 $this->header->subseccion = $subsec;
340             }
341         return parent::toPDF();
342         }
343     }
344
345     /**
346      * Funcion que pemite agregar contenido al PDF.
347      *
348      * @param mixed $contenido Objeto contenido que se agrega.
349      * @param bool $separador Indicacion si hay que agregar un separador.
350      *
351      * @return void
352      * @access public
353      */
354     function addContent($contenido, $separador = true) {
355         //Me aseguro de poner el separador siempre y cuando no sea el primer
356         //objeto de la primer pagina.
357         if ($separador && $this->_contenido) {
358             $this->_contenido[] = $this->_separador_defecto;
359         }
360         $this->_contenido[] = $contenido;
361     }
362 }
363 ?>