Como primer artículo comentaré que labor estoy desarrollando ahora mismo en mi trabajo. Para poneros en antecedentes os diré que estoy desarrollando (e investigando) en un proyecto para la Comunidad de Madrid. No os comentaré mucho de que trata porque no creo que sin haber salido a la luz les guste a los responsables del mismo que se le de publicidad. Sin embargo si os puedo comentar algo de lo que estoy haciendo:
Dentro del proyecto hay un apartado donde se generan unas cedulas informativas. El objetivo es poder generar cedulas en formato PDF, sin embargo no es moco de pavo, porque dependiendo del municipio habrá distintos tipos de información y se tendrá que representar de forma igualmente distinta. El caso es que como es un proceso que posiblemente tenga que atender cientos de peticiones no es un simple «imprime en la impresora pdf» como podría ser en word o similares.
Hay una cosa clara, y es que la información que se baraja tiende a ser la misma, pero no así la presentación (¿os suena esto a la programación a tres capas?). El caso es que existe una herramienta denominada FOP la cual te permite pasarle un fichero XML, un fichero XSL (XSL + FO) y te genera un pdf en un santiamen. El proceso es el siguiente, el XML solo tiene los datos estructuradamente, el XSL contiene el pseudocodigo que manejará los datos XML. Luego cuando se ejecuta el fop, se interpreta el XSL que le dice donde poner los datos del fichero XML y a continuación genera un PDF interpretando las directrices del FO. El resultado es bastante bueno, aunque la generación del XSL la hago de momento a mano y suele ser un poco laborioso, sin embargo es gratificante ver sus resultados.
Un ejemplo muy cortito sería este:
——————————————————————————–
Fichero XML
——————————————————————————–
<?xml version=»1.0″ encoding=»ISO-8859-1″?>
<RAIZ>
<NOMBRE>Oscar Rodríguez</NOMBRE>
</RAIZ>
——————————————————————————–
Fichero XSL
——————————————————————————–
<?xml version=»1.0″ encoding=»iso-8859-1″?>
<xsl:stylesheet xmlns:xsl=»http://www.w3.org/1999/XSL/Transform» version=»1.0″ xmlns:fo=»http://www.w3.org/1999/XSL/Format»>
<xsl:template match=»/»>
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name=»pagina» page-width=»210mm» page-height=»297mm»>
<fo:region-body margin=»1cm»/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference=»pagina»>
<fo:flow flow-name=»xsl-region-body»>
<xsl:apply-templates select=»//NOMBRE»/>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match=»NOMBRE»>
<fo:block font-family=»Times» font-size=»8pt» color=»blue»>Hola, soy <xsl:value-of select=».»/></fo:block>
</xsl:template>
</xsl:stylesheet>
——————————————————————————–
Si os fijais, como comentaba antes el XML es una chorrada, sin embargo el XSL es más laborioso porque al fin y al cabo hay que tratar tanto la información del XML (aquellas etiquetas que empiecen por xsl) como indicar como se va a presentar (las etiquetas que empiecen por fo). En este ejemplo se esta diciendo que se genere una página DIN A4 con margen por todos los lados de 1 centimetro; que procese la etiqueta NOMBRE (o lo que sería como llamar a la función NOMBRE) para que saque al final la frase «Hola, soy Oscar Rodríguez» con un tipo de letra Times New Romans de 8 puntos y de color azul.
EL FOP al ejecutarlo de la siguiente forma:
fop -xsl oscar.xsl -xml oscar.xml -pdf oscar.pdf
muestra lo siguiente:
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] FOP 0.20.5
[INFO] Using org.apache.xerces.parsers.SAXParser as SAX2 Parser
[INFO] building formatting object tree
[INFO] setting up fonts
[INFO] [1]
[INFO] Parsing of document complete, stopping renderer
Y el resultado final queda así
Luego se puede complicar más poniendo cabeceras, números de página, imágenes, etc. Yo aún sigo investigando para ver todas las posibilidades del XSL (y su hermano menor el FO).