presentación appy/pod
DESCRIPTION
Generación automática de documentos usando Appy/POD (Codigo fuente disponible con licencia CC-BY en https://bitbucket.org/euribates/presentacion-appy/)TRANSCRIPT
![Page 1: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/1.jpg)
Generación dinámicade documentoscon Appy/POD
Juan Ignacio Rodríguez de León ~ @jileon en twitter ~ [email protected]
![Page 2: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/2.jpg)
¿Qué es POD?
POD (Python Open Document) es unalibrería python que permite generar
documentos con contenidosdinámicos.
Es parte de un framework llamandoAppy (Applications in python)
![Page 3: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/3.jpg)
¿Cómo funciona?
1) Se crea una plantilla en formato ODF (OpenDocument Format)
![Page 4: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/4.jpg)
¿Cómo funciona?
1) Se crea una plantilla en formato ODF (OpenDocument Format)
2) Insertamos código dentro
![Page 5: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/5.jpg)
¿Cómo funciona?
1) Se crea una plantilla en formato ODF (OpenDocument Format)
2) Insertamos código dentro
3) Llamamos a pod con la plantilla y unconjunto de objetos Python, obteniendo undocumento ODF con el resultado deseado
![Page 6: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/6.jpg)
Otros formatos
• Se puede usar el LibreOffice en modo deservidor para convertir el ODT resultante encualquier formato que LibreOffice puedaexportar: RTF, Documentos Word, PDF, etc...
• No lo veremos en esta presentación, pero sepuede hacer
• Para generar en documento en formato ODT,sin embargo, NO es necesario ni siquiera tenerinstalado OpenOffice.
![Page 7: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/7.jpg)
Hola, Mundo
Primero creamos un documento conOpenOffice/LibreOffice. Vamos a incluir una variableque definiremos por programa. Para incluir la variableen el texto del documento:
![Page 8: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/8.jpg)
Hola, Mundo
Primero creamos un documento conOpenOffice/LibreOffice. Vamos a incluir unavariable que definiremos por programa. Paraincluir la variable en el texto del documento:
1) Seleccionamos “grabar cambios” (MenúEditar->Cambios->Grabar)
![Page 9: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/9.jpg)
Hola, Mundo
Primero creamos un documento conOpenOffice/LibreOffice. Vamos a incluir unavariable que definiremos por programa. Paraincluir la variable en el texto del documento:
1) Seleccionamos “grabar cambios” (MenúEditar->Cambios->Grabar)
2) Escribimos el nombre de la variable
![Page 10: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/10.jpg)
Hola, Mundo
Primero creamos un documento conOpenOffice/LibreOffice. Vamos a incluir unavariable que definiremos por programa. Paraincluir la variable en el texto del documento:
1) Seleccionamos “grabar cambios” (MenúEditar->Cambios->Grabar)
2) Escribimos el nombre de la variable
3) Volvemos al modo normal con la mismaopción del menú.
![Page 11: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/11.jpg)
Quedaría algo así
![Page 12: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/12.jpg)
Fusionar plantilla con datos
#!/usr/bin/env python
from appy.pod.renderer import Rendererimport datetime
hora = datetime.datetime.now()renderer = Renderer(
'ex_01.odt', # Plantilla{'hora':hora}, # Contexto'out_01.odt' # Salida)
renderer.run()
![Page 13: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/13.jpg)
No solo variables
Podemos incluir otras cosas, además devariables:
• Valores retornados por funciones
• Expresiones
• Valores retornados por métodos de objetos
• Estructuras de datos complejas
![Page 14: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/14.jpg)
Plantilla con funciones/expresiones
![Page 15: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/15.jpg)
Fusionar con funciones/expresiones
#!/usr/bin/env python
from appy.pod.renderer import Rendererimport datetime
hora = datetime.datetime.now()def to_upper(s):
return s.upper()renderer = Renderer(
'ex_02.odt',globals(),'out_02.odt')
renderer.run()
![Page 16: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/16.jpg)
Plantilla con métodos/estructuras de datos
![Page 17: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/17.jpg)
#!/usr/bin/env python
from appy.pod.renderer import Renderer
class Mensajes:def __init__(self, msg):
self.msg = msg
def hola(self):return self.msg
mensajes = Mensajes('hola, mundo')
datos = [{'nombre':'Matt Murdock'},{'nombre':'Peter Parker'},]
renderer = Renderer('ex_03.odt', globals(), 'out_03.odt')renderer.run()
Fusionar con métodos/estructuras de datos
![Page 18: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/18.jpg)
Estructuras de control
• Las estructuras de control se realizan mediantenotas (En LibreOffice: Insertar -> Comentarios[Ctrl-Shift-C])
• El código va dentro de la nota
• Solo hay dos estructuras de control: IF y FOR
![Page 19: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/19.jpg)
La sentencia IF
La sentencia if tiene la siguiente forma:do <área afectada> [if <condicion python>]
Donde el área afectada puede ser:
• text Todo el párrafo
• title El título
• section Toda la sección
• table Toda la tabla
• row Toda una fila de una tabla
• cell Una celda dentro de una tabla
![Page 20: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/20.jpg)
La sentencia IF
Después del IF, puede venir cualquier expresiónen Python, que se evaluará como un valorbooleano. Si es verdadero, el área afectadaaparecerá en el documento generado, si esfalsa, no aparecerá.
![Page 21: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/21.jpg)
La sentencia IF
![Page 22: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/22.jpg)
La sentencia IF
#!/usr/bin/env python# -*- coding: utf-8 -*-
from appy.pod.renderer import Renderer
flag = False
renderer = Renderer('ex_04.odt',locals(),'out_04.odt',)
renderer.run()
![Page 23: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/23.jpg)
La sentencia FOR
La sentencia for tiene la siguiente forma:do <área afectada> for <variable> in <iterador>
• En variable podemos usar cualquier nombre quesea válido en Python
• Servirá como la variable de la iteración, es decir, elvalor que cambia en cada ciclo. Se inserta en elcontexto para que sea accesible.
• En iterador nos servirá cualquier variable iterableen Python: listas, texto, tuplas, etc...
• El área de actuación es igual que en el if.
![Page 24: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/24.jpg)
La sentencia FOR
![Page 25: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/25.jpg)
La sentencia FOR
#!/usr/bin/env python# -*- coding: utf-8 -*-
from appy.pod.renderer import Renderer
numeros = range(1,101)
renderer = Renderer('ex_05.odt',locals(),'out_05.odt',)
renderer.run()
![Page 26: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/26.jpg)
Insertar contenido arbitrario
• Existe una clausula especial from, que se puedeañadir a las sentencias if/for
• Permite sustituir el área afectada por elresultado de la cláusula from
![Page 27: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/27.jpg)
• La cláusula from debe empezar en una nuevalínea (Si no, pensará que es parte de lasentencia y probablemente de error)
• La cláusula debe ser una expresión válida enPython, que debe devolver un fragmentocorrectamente formateado en ODT.
Para usar la cláusula from
![Page 28: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/28.jpg)
Ejemplo de uso de la cláusula from
do textfrom '<text:p>Hola, mundo</text:p>'
Ejemplo con un if
Ejemplo con un fordo text for i in range(3)from '<text:p>Hola, mundo %d</text:p>' % i
La pega: Hay que conocer el formato internode ODT (El resumen tiene 303 páginas)
Por eso se inventó...
![Page 29: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/29.jpg)
La función xhtml
• Esta función nos permite convertir de Html aformato ODT, preparado para ser incrustado con lacláusula from.
• Si utilizamos clases en nuestro Html, y existe unestilo con el mismo nombre en la plantilla, se usaráese estilo.
• Los tags h1..h6 se mapean a los estilosHeading1..Heading6.
![Page 30: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/30.jpg)
Ejemplo 6 ~ Uso de from/xhtml ~ Plantilla
![Page 31: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/31.jpg)
Ejemplo 6 ~ Uso de from/xhtml ~ Programa
#!/usr/bin/env python# -*- coding: utf-8 -*-
from appy.pod.renderer import Rendererejemplo = '''<h2>Ejemplo</h2><p>Un párrafo con <b>negritas</b>, <i>itálicas</i>, subíndices:H<sub>2</sub>O, exponentes: 2·π·r<sup>2</sup> y de postre un enlace:<a href="http://www.python.org/">www.python.org</a>.</p><ul>
<li>Uno</li><li>Dos</li><li>Tres</li>
<ul><li>Tres.Uno</li><li>Tres.Dos</li></ul>
</ul>'''renderer = Renderer('ex_06.odt', locals(), 'out_06.odt',)renderer.run()
![Page 32: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/32.jpg)
la función document
• La función document permite integrar dentrodel resultado imágenes o ficheros externos.
• La función tiene la siguiente signatura:
document(content=None, at=None, format=None, anchor='as-char')
• Se puede usar para incrustar contenidos queestén en memoria (porque los recuperamos deuna base de datos, por ejemplo) o que estén enel sistema de ficheros.
![Page 33: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/33.jpg)
la función document para contenidos en memoria
Si el contenido está en memoria:
• content puede ser o una variable cuyo valor sonlos datos binarios, o un objeto de tipo file, abierto
• format puede ser o un tipo MIME o un extensiónde fichero (sin punto) de alguno de los formatosaceptables: Un documento ODT, un documentoPDF, una imagen PNG, una imagen JPEG o unaimagen GIF
![Page 34: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/34.jpg)
Si el contenido está en un fichero:
• El parámetro at indica la ruta dentro del sistemade ficheros de la imagen o documento a incrustar.
• los parámetros content y format no sonnecesarios.
la función document para contenidos en ficheros
![Page 35: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/35.jpg)
El parámetro anchor de la función document
Este parámetro se usa solo para las imágenes, ydetermina la forma en que la imagen se anclaen el documento resultante. Los posiblesvalores son:
Valor del parámetro Descripciónpage
Al párrafo
char
A la página
paragrap
as-char
Al carácter
Como un carácter
![Page 36: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/36.jpg)
El código de los ejemplos está disponible
El contenido de esta presentación, tanto en pdfcomo en su fuente original para scribus, losficheros auxiliares, documentos y scripts deejemplo están disponibles públicamente en:
Con licencia Creative-commons reconocimiento (Attribution)
hg clone https://bitbucket.org/euribates/presentacion-appy
![Page 37: Presentación appy/pod](https://reader033.vdocuments.mx/reader033/viewer/2022052601/5595a2ae1a28ab34748b45eb/html5/thumbnails/37.jpg)
Créditos y agradecimientos
La fotografía usada en el fondo es de:
Luke Robinson
(mortalcoil)http://www.flickr.com/photos/mortalcoil/