Hagamos que México crezca..

Prefiere el consumo de lo Hecho en México

Prefiere el consumo de lo Hecho en México
BúsquedaHagamos que México crezca..
![]() Prefiere el consumo de lo Hecho en México Posts Recientes
Conversación |
Generando reportes en PHP usando plantillas creadas con OpenOffice (WYSIWYG).Hace unos días desarrollando un sistema el cuál requiere generar facturas, estuve buscando una manera de poder hacerlo práctico, esto ya que la factura se mandaría a un formato preimpreso, por lo que la información debería coincidir con el formato, lo primero que me recomendaron es usar FPDF el cuál es una librería que funciona en PHP y que es relativamente fácil de usar, digo relativamente porqué hay que usar coordenadas para poder generar el documento lo que la vuelve algo complicada, más aun si se quiere dejar libertad al usuario que genere sus propios formatos.
Imaginaba que se podía hacer algo con OpenOffice (OO), ya que usa ODF(Open Document Format) el cuál es un formato abierto en XML. Los archivos generados por OpenOffice vienen comprimidos en formato .zip, al descomprimirlos genera varios archivos, de los cuáles el principal es content.xml, el cuál contiene la información que hemos capturado en el archivo, esto aplica para archivos de Hojas de Calculo, Procesador de Textos o una presentación de OO. Despues de desmenuzar los archivos de OpenOffice se me ocurrieron varias mafufadas que no tiene caso comentar aquí, pero lo cuál me llevó a encontrar una Librería Abierta llamada TinyButStrong [http://www.tinybutstrong.com/] , la cuál tiene un plugin para OpenOffice llamada TinyDoc [http://tinydoc.unesolution.fr/] que permite rellenar una plantilla de OpenOffice fácilmente y en unas cuantas líneas, lo que nos ahorra mucho trabajo al generar reportes. El concepto es muy fácil, definir variables en nuestro documento que luego serían sustiuídas. Por ejemplo si en nuestro documento de OpenOffice pusiéramos en alguna parte: [factura.fecha] En TinyDoc tendríamos que tener un arreglo que contenga la llave fecha para que la sustituya en OpenOffice
$_factura = array("fecha"=>"2009-01-01");
$doc->mergeXmlField('factura', $_factura);
$doc->mergeXmlBlock('detalle', $_detalle);
array( array( 'cantidad' => 2, 'descripcion' => 'Adaptador SPA3102', 'preciounitario' => 1450.00, 'importe' => 2900 ), array( 'cantidad' => 3, 'descripcion' => 'Modulos FXO', 'preciounitario' => 1400.00, 'importe' => 4200.00 ), array( 'cantidad' => 1, 'descripcion' => 'Router Inalambrico WRT54G ', 'preciounitario' => 650, 'importe' => 650 ), array( 'cantidad' => 1, 'descripcion' => 'Tarificador Web Asterisk', 'preciounitario' => 2500, 'importe' => 2500 ), ) Por ejemplo aquí muestro como sería el archivo plantilla en OpenOffice usando la "sintaxis" de TinyButStrong, De Lado derecho vemos como quedaría el archivo de OpenOffice despues de que se parseo con TinyButStrong. Un código de ejemplo de como procesar archivos de Open Office con PHP y TinyButStrong sería:
<?php //llamamos a las librerias de formateo de plantillas de Open Office include('lib/tinyButStrong.class.php'); include('lib/tinyDoc.class.php'); //Creamos un Objeto de la Clase $doc = new tinyDoc(); //Indicamos que OpenOffice esta en formato .zip, en linux hay que verificar que tengamos instalado unzip: sudo apt-get install unzip $doc->setZipMethod('ziparchive'); //Indicamos que el directorio temporal dónde descomprimira el archivo OD* de Open Office $doc->setProcessDir('./tmp'); //Le indicamos el archivo de Open Office que creamos como plantilla $doc->createFrom('formato_factura.odp'); //Indicamos el archivo que escribirá, OpenOffice guarda en content.xml la información capturada en el archivo $doc->loadXml('content.xml'); //Funcion que formateara la plantilla de Open Office crea_factura($doc); //Indicamos que genere uan descarga del archivo para el usuario $doc->sendResponse(); //Elimina toda la información que fué creada temporalmente $doc->remove(); function crea_factura($doc) { //En el archivo plantilla de de openoffice tenemos [factura.fecha], [factura.subtotla], [factura.iva], [factura.total], [factura.totaltext] //Lo que hace la clase es cambiar la información por la que asinemos aquí, si vemos asignamos el arreglo a factura y el método usado es mergeXmlField $doc->mergeXmlField('factura', array( 'id' => '1', 'fecha' => date('Y-m-d'), 'subtotal' => 10250, 'iva' => 1537.5, 'total' => 10787.5, 'totaltext' => 'Diez Mil Setecientos Pesos Cincuenta Centavos', ) ); //Al igual que en factura a cliente le asignamos el arreglo de cliente que tiene las llaves que seran sustituidas en la plantilla //usamos el metodo mergeXmlField ya que es un arreglo unidimensional $doc->mergeXmlField('cliente', array( 'id' => '1001', 'nombre' => 'OaxRom SA de CV', 'direccion' => 'Encuentranos en http://www.oaxrom.com', 'rfc' => 'OAX090101C45' ) ); //Este método es interesante, ya que nos permitirá mostrar listados en la plantilla //En la plantilla tenemos [detalle.cantida] [detalle.descripcion][detalle;block=table:table-row] [detalle.preciounitario] [detalle.importe] //Usando la funcion mergeXmlBlock, podremos listar información de un arreglo de arreglos en forma de listas, esto es práctico cuándo se intenta //mostrar informacion de productos en una factura por ejemplo, donde el numero de productos puede ser 1 o varios, esto lo que comunmente se llama detalle $doc->mergeXmlBlock('detalle', array( array( 'cantidad' => 2, 'descripcion' => 'Adaptador SPA3102', 'preciounitario' => 1450.00, 'importe' => 2900 ), array( 'cantidad' => 3, 'descripcion' => 'Modulos FXO', 'preciounitario' => 1400.00, 'importe' => 4200.00 ), array( 'cantidad' => 1, 'descripcion' => 'Router Inalambrico WRT54G ', 'preciounitario' => 650, 'importe' => 650 ), array( 'cantidad' => 1, 'descripcion' => 'Tarificador Web Asterisk', 'preciounitario' => 2500, 'importe' => 2500 ), ) ); //Ya que la clase asigna los valores, guarda la información $doc->saveXml(); /* $doc->loadXml('styles.xml'); $doc->mergeXmlField('header', array( 'title' => 'made with tinyDoc and', 'img' => 'images/samples/openoffice-by-benjamin-bois.png', ) ); $doc->mergeXmlField('footer', array( 'signature' => 'image credit : Benjamin Bois', ) ); $doc->saveXml(); */ //cerramos el archivo $doc->close(); } ?> entra con login:invitado y password:invitado Entra a la carpeta TinyButStrong y descarga el archivo factura.zip Descomprime la carpeta en algún directorio de tú servidor web y desde tu navegador abre por ejemplo: http://localhost/factura/formato_factura.php Y esto debería generarte un archivo de OpenOffice como muestro en la parte derecha de la imagen de arriba. Con tinyDoc es fácil crear reportes en PHP y obteniendo datos de MySQL, solo es cuestión de crear la plantilla y listo.. Puedes obtener más información en : http://tinydoc.unesolution.fr/ Dejar un comentario
Fuentes XML de comentario: RSS | Atom
|
Nube de EtiquetasEventosEncuestaComentarios Recientes
|
#1 Re:Generando reportes en PHP usando plantillas creadas con OpenOffice (WYSIWYG).
gracias por el aporte.
¿hay otra forma de descargar el ejemplo factura.zip?
Muchas gracias