SlideShare una empresa de Scribd logo
Generación dinámica
de documentos
con Appy/POD
Juan Ignacio Rodríguez de León ~ @jileon en twitter ~ euribates@gmail.com
¿Qué es POD?
POD (Python Open Document) es una
librería python que permite generar
documentos con contenidos
dinámicos.
Es parte de un framework llamando
Appy (Applications in python)
¿Cómo funciona?
1) Se crea una plantilla en formato ODF (Open
Document Format)
¿Cómo funciona?
1) Se crea una plantilla en formato ODF (Open
Document Format)
2) Insertamos código dentro
¿Cómo funciona?
1) Se crea una plantilla en formato ODF (Open
Document Format)
2) Insertamos código dentro
3) Llamamos a pod con la plantilla y un
conjunto de objetos Python, obteniendo un
documento ODF con el resultado deseado
Otros formatos
• Se puede usar el LibreOffice en modo de
servidor para convertir el ODT resultante en
cualquier formato que LibreOffice pueda
exportar: RTF, Documentos Word, PDF, etc...
• No lo veremos en esta presentación, pero se
puede hacer
• Para generar en documento en formato ODT,
sin embargo, NO es necesario ni siquiera tener
instalado OpenOffice.
Hola, Mundo
Primero creamos un documento con
OpenOffice/LibreOffice. Vamos a incluir una variable
que definiremos por programa. Para incluir la variable
en el texto del documento:
Hola, Mundo
Primero creamos un documento con
OpenOffice/LibreOffice. Vamos a incluir una
variable que definiremos por programa. Para
incluir la variable en el texto del documento:
1) Seleccionamos “grabar cambios” (Menú
Editar->Cambios->Grabar)
Hola, Mundo
Primero creamos un documento con
OpenOffice/LibreOffice. Vamos a incluir una
variable que definiremos por programa. Para
incluir la variable en el texto del documento:
1) Seleccionamos “grabar cambios” (Menú
Editar->Cambios->Grabar)
2) Escribimos el nombre de la variable
Hola, Mundo
Primero creamos un documento con
OpenOffice/LibreOffice. Vamos a incluir una
variable que definiremos por programa. Para
incluir 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 misma
opción del menú.
Quedaría algo así
Fusionar plantilla con datos
#!/usr/bin/env python
from appy.pod.renderer import Renderer
import datetime
hora = datetime.datetime.now()
renderer = Renderer(
'ex_01.odt', # Plantilla
{'hora':hora}, # Contexto
'out_01.odt' # Salida
)
renderer.run()
No solo variables
Podemos incluir otras cosas, además de
variables:
• Valores retornados por funciones
• Expresiones
• Valores retornados por métodos de objetos
• Estructuras de datos complejas
Plantilla con funciones/expresiones
Fusionar con funciones/expresiones
#!/usr/bin/env python
from appy.pod.renderer import Renderer
import datetime
hora = datetime.datetime.now()
def to_upper(s):
return s.upper()
renderer = Renderer(
'ex_02.odt',
globals(),
'out_02.odt'
)
renderer.run()
Plantilla con métodos/estructuras de datos
#!/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
Estructuras de control
• Las estructuras de control se realizan mediante
notas (En LibreOffice: Insertar -> Comentarios
[Ctrl-Shift-C])
• El código va dentro de la nota
• Solo hay dos estructuras de control: IF y FOR
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
La sentencia IF
Después del IF, puede venir cualquier expresión
en Python, que se evaluará como un valor
booleano. Si es verdadero, el área afectada
aparecerá en el documento generado, si es
falsa, no aparecerá.
La sentencia IF
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()
La sentencia FOR
La sentencia for tiene la siguiente forma:
do <área afectada> for <variable> in <iterador>
• En variable podemos usar cualquier nombre que
sea válido en Python
• Servirá como la variable de la iteración, es decir, el
valor que cambia en cada ciclo. Se inserta en el
contexto para que sea accesible.
• En iterador nos servirá cualquier variable iterable
en Python: listas, texto, tuplas, etc...
• El área de actuación es igual que en el if.
La sentencia FOR
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()
Insertar contenido arbitrario
• Existe una clausula especial from, que se puede
añadir a las sentencias if/for
• Permite sustituir el área afectada por el
resultado de la cláusula from
• La cláusula from debe empezar en una nueva
línea (Si no, pensará que es parte de la
sentencia y probablemente de error)
• La cláusula debe ser una expresión válida en
Python, que debe devolver un fragmento
correctamente formateado en ODT.
Para usar la cláusula from
Ejemplo de uso de la cláusula from
do text
from '<text:p>Hola, mundo</text:p>'
Ejemplo con un if
Ejemplo con un for
do text for i in range(3)
from '<text:p>Hola, mundo %d</text:p>' % i
La pega: Hay que conocer el formato interno
de ODT (El resumen tiene 303 páginas)
Por eso se inventó...
La función xhtml
• Esta función nos permite convertir de Html a
formato ODT, preparado para ser incrustado con la
cláusula from.
• Si utilizamos clases en nuestro Html, y existe un
estilo con el mismo nombre en la plantilla, se usará
ese estilo.
• Los tags h1..h6 se mapean a los estilos
Heading1..Heading6.
Ejemplo 6 ~ Uso de from/xhtml ~ Plantilla
Ejemplo 6 ~ Uso de from/xhtml ~ Programa
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from appy.pod.renderer import Renderer
ejemplo = '''
<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()
la función document
• La función document permite integrar dentro
del 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 que
estén en memoria (porque los recuperamos de
una base de datos, por ejemplo) o que estén en
el sistema de ficheros.
la función document para contenidos en memoria
Si el contenido está en memoria:
• content puede ser o una variable cuyo valor son
los datos binarios, o un objeto de tipo file, abierto
• format puede ser o un tipo MIME o un extensión
de fichero (sin punto) de alguno de los formatos
aceptables: Un documento ODT, un documento
PDF, una imagen PNG, una imagen JPEG o una
imagen GIF
Si el contenido está en un fichero:
• El parámetro at indica la ruta dentro del sistema
de ficheros de la imagen o documento a incrustar.
• los parámetros content y format no son
necesarios.
la función document para contenidos en ficheros
El parámetro anchor de la función document
Este parámetro se usa solo para las imágenes, y
determina la forma en que la imagen se ancla
en el documento resultante. Los posibles
valores son:
Valor del parámetro Descripción
page
Al párrafo
char
A la página
paragrap
as-char
Al carácter
Como un carácter
El código de los ejemplos está disponible
El contenido de esta presentación, tanto en pdf
como en su fuente original para scribus, los
ficheros auxiliares, documentos y scripts de
ejemplo están disponibles públicamente en:
Con licencia Creative-commons reconocimiento (Attribution)
hg clone https://bitbucket.org/euribates/presentacion-appy
Créditos y agradecimientos
La fotografía usada en el fondo es de:
Luke Robinson
(mortalcoil)
http://www.flickr.com/photos/mortalcoil/

Más contenido relacionado

La actualidad más candente

Introducción a Python / Django
Introducción a Python / DjangoIntroducción a Python / Django
Introducción a Python / Djangobetabeers
 
Instalar Python 2.7 y 3 en Windows (Anaconda)
Instalar Python 2.7 y 3 en Windows (Anaconda)Instalar Python 2.7 y 3 en Windows (Anaconda)
Instalar Python 2.7 y 3 en Windows (Anaconda)
CAChemE
 
Taller PyGTK
Taller PyGTKTaller PyGTK
Taller PyGTK
Tomás Vírseda
 
Trabajo digital.
Trabajo digital.Trabajo digital.
Trabajo digital.
edwin-c
 
San Luis Oct 2008
San Luis Oct 2008San Luis Oct 2008
San Luis Oct 2008guest02b440
 
Php Con Postgres
Php Con PostgresPhp Con Postgres
Php Con Postgres
Jorge Arevalo
 
3 curso php
3 curso php3 curso php
3 curso php
Jesus Luque Medina
 
Manual de php con ejercicios
Manual de php con ejerciciosManual de php con ejercicios
Manual de php con ejercicios
william kozisck
 
Manual de la conexión de php con sqlserver 2012
Manual de la conexión de php con sqlserver 2012Manual de la conexión de php con sqlserver 2012
Manual de la conexión de php con sqlserver 2012
Gustavo Inocente Chacón
 
4.Programación con PHP y MySQL
4.Programación con PHP y MySQL4.Programación con PHP y MySQL
4.Programación con PHP y MySQL
Ramiro Estigarribia Canese
 
Curso Php
Curso PhpCurso Php
Curso Php
larasaregune
 
Iniciación PHP 5. PHP y MySQL
Iniciación PHP 5. PHP y MySQLIniciación PHP 5. PHP y MySQL
Iniciación PHP 5. PHP y MySQL
Rightster
 
02 introduccion a python
02 introduccion a python02 introduccion a python
02 introduccion a python
José Luis Villalpando Aguilar
 
Introducción a recaptcha 3.0
Introducción a recaptcha 3.0Introducción a recaptcha 3.0
Introducción a recaptcha 3.0
Jesús Ayús
 
Find File Servlet DB
Find File Servlet DBFind File Servlet DB
Find File Servlet DB
jubacalo
 
Tutorial consumir DLL C++ en C#
Tutorial consumir DLL C++ en C#Tutorial consumir DLL C++ en C#
Tutorial consumir DLL C++ en C#
Desarrollo Escuintla
 

La actualidad más candente (20)

Introducción a Python / Django
Introducción a Python / DjangoIntroducción a Python / Django
Introducción a Python / Django
 
Instalar Python 2.7 y 3 en Windows (Anaconda)
Instalar Python 2.7 y 3 en Windows (Anaconda)Instalar Python 2.7 y 3 en Windows (Anaconda)
Instalar Python 2.7 y 3 en Windows (Anaconda)
 
Viernes Tecnicos DTrace
Viernes Tecnicos DTraceViernes Tecnicos DTrace
Viernes Tecnicos DTrace
 
Taller PyGTK
Taller PyGTKTaller PyGTK
Taller PyGTK
 
Trabajo digital.
Trabajo digital.Trabajo digital.
Trabajo digital.
 
San Luis Oct 2008
San Luis Oct 2008San Luis Oct 2008
San Luis Oct 2008
 
Php Con Postgres
Php Con PostgresPhp Con Postgres
Php Con Postgres
 
3 curso php
3 curso php3 curso php
3 curso php
 
Manual de php con ejercicios
Manual de php con ejerciciosManual de php con ejercicios
Manual de php con ejercicios
 
Manual de la conexión de php con sqlserver 2012
Manual de la conexión de php con sqlserver 2012Manual de la conexión de php con sqlserver 2012
Manual de la conexión de php con sqlserver 2012
 
Curso php y_mysql
Curso php y_mysqlCurso php y_mysql
Curso php y_mysql
 
Curso php y_my_sql
Curso php y_my_sqlCurso php y_my_sql
Curso php y_my_sql
 
4.Programación con PHP y MySQL
4.Programación con PHP y MySQL4.Programación con PHP y MySQL
4.Programación con PHP y MySQL
 
Curso Php
Curso PhpCurso Php
Curso Php
 
Iniciación PHP 5. PHP y MySQL
Iniciación PHP 5. PHP y MySQLIniciación PHP 5. PHP y MySQL
Iniciación PHP 5. PHP y MySQL
 
02 introduccion a python
02 introduccion a python02 introduccion a python
02 introduccion a python
 
Introducción a recaptcha 3.0
Introducción a recaptcha 3.0Introducción a recaptcha 3.0
Introducción a recaptcha 3.0
 
Find File Servlet DB
Find File Servlet DBFind File Servlet DB
Find File Servlet DB
 
Práctica no 9
Práctica no 9Práctica no 9
Práctica no 9
 
Tutorial consumir DLL C++ en C#
Tutorial consumir DLL C++ en C#Tutorial consumir DLL C++ en C#
Tutorial consumir DLL C++ en C#
 

Destacado

Django avanzado: Dia 2
Django avanzado: Dia 2Django avanzado: Dia 2
Django avanzado: Dia 2Esau Rodriguez
 
Desarrollo rápido de apps web con laravel - DevAcademy
Desarrollo rápido de apps web con laravel - DevAcademyDesarrollo rápido de apps web con laravel - DevAcademy
Desarrollo rápido de apps web con laravel - DevAcademy
Jorge Antonio Linares Vera
 
Tienda virtual php_mysql
Tienda virtual php_mysqlTienda virtual php_mysql
Tienda virtual php_mysqljubacalo
 
Curso de Magento 1.9: Unidad Didáctica 08 Estructura de un Tema
Curso de Magento 1.9: Unidad Didáctica 08 Estructura de un TemaCurso de Magento 1.9: Unidad Didáctica 08 Estructura de un Tema
Curso de Magento 1.9: Unidad Didáctica 08 Estructura de un Tema
David Vaquero
 
¡A todo Kanban! ~ Introducción a kanban
¡A todo Kanban! ~ Introducción a kanban¡A todo Kanban! ~ Introducción a kanban
¡A todo Kanban! ~ Introducción a kanban
Juan Rodríguez
 
Desarrollo de aplicaciones web con PHP y symfony
Desarrollo de aplicaciones web con PHP y symfonyDesarrollo de aplicaciones web con PHP y symfony
Desarrollo de aplicaciones web con PHP y symfony
Juan Eladio Sánchez Rosas
 
CRUD básico con Symfony
CRUD básico con SymfonyCRUD básico con Symfony
CRUD básico con Symfony
Symfony Zaragoza
 

Destacado (9)

Django Avanzado: Dia3
Django Avanzado: Dia3Django Avanzado: Dia3
Django Avanzado: Dia3
 
Django avanzado: Dia 2
Django avanzado: Dia 2Django avanzado: Dia 2
Django avanzado: Dia 2
 
Django avanzado: Dia1
Django avanzado: Dia1Django avanzado: Dia1
Django avanzado: Dia1
 
Desarrollo rápido de apps web con laravel - DevAcademy
Desarrollo rápido de apps web con laravel - DevAcademyDesarrollo rápido de apps web con laravel - DevAcademy
Desarrollo rápido de apps web con laravel - DevAcademy
 
Tienda virtual php_mysql
Tienda virtual php_mysqlTienda virtual php_mysql
Tienda virtual php_mysql
 
Curso de Magento 1.9: Unidad Didáctica 08 Estructura de un Tema
Curso de Magento 1.9: Unidad Didáctica 08 Estructura de un TemaCurso de Magento 1.9: Unidad Didáctica 08 Estructura de un Tema
Curso de Magento 1.9: Unidad Didáctica 08 Estructura de un Tema
 
¡A todo Kanban! ~ Introducción a kanban
¡A todo Kanban! ~ Introducción a kanban¡A todo Kanban! ~ Introducción a kanban
¡A todo Kanban! ~ Introducción a kanban
 
Desarrollo de aplicaciones web con PHP y symfony
Desarrollo de aplicaciones web con PHP y symfonyDesarrollo de aplicaciones web con PHP y symfony
Desarrollo de aplicaciones web con PHP y symfony
 
CRUD básico con Symfony
CRUD básico con SymfonyCRUD básico con Symfony
CRUD básico con Symfony
 

Similar a Presentación appy/pod

Software para el aprendizaje de la programación EC 2. Presentación 3: Python
 Software para el aprendizaje de la programación EC 2. Presentación 3: Python Software para el aprendizaje de la programación EC 2. Presentación 3: Python
Software para el aprendizaje de la programación EC 2. Presentación 3: Python
UCC_Elearning
 
Aprendizaje de Lenguaje de Programación Python
Aprendizaje de Lenguaje de Programación PythonAprendizaje de Lenguaje de Programación Python
Aprendizaje de Lenguaje de Programación Python
Cesar Oswaldo Osorio Agualongo
 
Investigacion de Python.pptx
Investigacion de Python.pptxInvestigacion de Python.pptx
Investigacion de Python.pptx
SelTrejo
 
Estructura basica para_c_
Estructura basica para_c_Estructura basica para_c_
Estructura basica para_c_
HUGOJAREDSANCHEZMARTINEZ
 
Estructura basica para c++
Estructura basica para c++Estructura basica para c++
Estructura basica para c++
claravianeybadillodelangel
 
Gestión Remota de Equipos con Python
Gestión Remota de Equipos con PythonGestión Remota de Equipos con Python
Gestión Remota de Equipos con Python
Juan Manuel Rodriguez Burgos
 
Introducción a PHP5
Introducción a PHP5Introducción a PHP5
Introducción a PHP5
Open University, KMi
 
Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_
Maztherprozh
 
Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)
Maztherprozh
 
Cursillos e-ghost Septiembre 2010. Open ERP como software de gestión contable
Cursillos e-ghost Septiembre 2010. Open ERP como software de gestión contableCursillos e-ghost Septiembre 2010. Open ERP como software de gestión contable
Cursillos e-ghost Septiembre 2010. Open ERP como software de gestión contable
Alex Rayón Jerez
 
Open ERP e-Ghost-03-cursillo e-ghost 2010 - open erp como sw de gestion contable
Open ERP e-Ghost-03-cursillo e-ghost 2010 - open erp como sw de gestion contableOpen ERP e-Ghost-03-cursillo e-ghost 2010 - open erp como sw de gestion contable
Open ERP e-Ghost-03-cursillo e-ghost 2010 - open erp como sw de gestion contableOpen ERP Finanzas
 
Estructura básica de un programa en C++
Estructura básica de un programa en C++Estructura básica de un programa en C++
Estructura básica de un programa en C++
Rosbelia Balza
 
python-para-todos.pdf
python-para-todos.pdfpython-para-todos.pdf
python-para-todos.pdf
JaviMartin21
 
Python para todos
Python para todosPython para todos
Python para todos
Erik Gur
 
Python para Todos
Python para TodosPython para Todos
Python_para_todos.pdf
Python_para_todos.pdfPython_para_todos.pdf
Python_para_todos.pdf
charles requena
 
Python_para_todos.pdf
Python_para_todos.pdfPython_para_todos.pdf
Python_para_todos.pdf
ssuser626fe4
 
Python para todos
Python para todosPython para todos
Python para todos
sebas145713
 

Similar a Presentación appy/pod (20)

Software para el aprendizaje de la programación EC 2. Presentación 3: Python
 Software para el aprendizaje de la programación EC 2. Presentación 3: Python Software para el aprendizaje de la programación EC 2. Presentación 3: Python
Software para el aprendizaje de la programación EC 2. Presentación 3: Python
 
Aprendizaje de Lenguaje de Programación Python
Aprendizaje de Lenguaje de Programación PythonAprendizaje de Lenguaje de Programación Python
Aprendizaje de Lenguaje de Programación Python
 
Investigacion de Python.pptx
Investigacion de Python.pptxInvestigacion de Python.pptx
Investigacion de Python.pptx
 
Estructura basica para_c_
Estructura basica para_c_Estructura basica para_c_
Estructura basica para_c_
 
Estructura basica para c++
Estructura basica para c++Estructura basica para c++
Estructura basica para c++
 
Gestión Remota de Equipos con Python
Gestión Remota de Equipos con PythonGestión Remota de Equipos con Python
Gestión Remota de Equipos con Python
 
Introducción a PHP5
Introducción a PHP5Introducción a PHP5
Introducción a PHP5
 
Welcome to Django
Welcome to DjangoWelcome to Django
Welcome to Django
 
Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_
 
Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)
 
Presentacion Python
Presentacion  Python Presentacion  Python
Presentacion Python
 
Cursillos e-ghost Septiembre 2010. Open ERP como software de gestión contable
Cursillos e-ghost Septiembre 2010. Open ERP como software de gestión contableCursillos e-ghost Septiembre 2010. Open ERP como software de gestión contable
Cursillos e-ghost Septiembre 2010. Open ERP como software de gestión contable
 
Open ERP e-Ghost-03-cursillo e-ghost 2010 - open erp como sw de gestion contable
Open ERP e-Ghost-03-cursillo e-ghost 2010 - open erp como sw de gestion contableOpen ERP e-Ghost-03-cursillo e-ghost 2010 - open erp como sw de gestion contable
Open ERP e-Ghost-03-cursillo e-ghost 2010 - open erp como sw de gestion contable
 
Estructura básica de un programa en C++
Estructura básica de un programa en C++Estructura básica de un programa en C++
Estructura básica de un programa en C++
 
python-para-todos.pdf
python-para-todos.pdfpython-para-todos.pdf
python-para-todos.pdf
 
Python para todos
Python para todosPython para todos
Python para todos
 
Python para Todos
Python para TodosPython para Todos
Python para Todos
 
Python_para_todos.pdf
Python_para_todos.pdfPython_para_todos.pdf
Python_para_todos.pdf
 
Python_para_todos.pdf
Python_para_todos.pdfPython_para_todos.pdf
Python_para_todos.pdf
 
Python para todos
Python para todosPython para todos
Python para todos
 

Más de Juan Rodríguez

Estados imposibles y como evitarlos
Estados imposibles y como evitarlosEstados imposibles y como evitarlos
Estados imposibles y como evitarlos
Juan Rodríguez
 
Introduction to BDD (Behavior-Driven Development)
Introduction to BDD (Behavior-Driven Development)Introduction to BDD (Behavior-Driven Development)
Introduction to BDD (Behavior-Driven Development)
Juan Rodríguez
 
Vue.js: El framework javascript para muggles
Vue.js: El framework javascript para mugglesVue.js: El framework javascript para muggles
Vue.js: El framework javascript para muggles
Juan Rodríguez
 
Introducción a jupyter (antes i python notebook)
Introducción a jupyter (antes i python notebook)Introducción a jupyter (antes i python notebook)
Introducción a jupyter (antes i python notebook)
Juan Rodríguez
 
Acceder a C desde Python (O viceversa)
Acceder a C desde Python (O viceversa)Acceder a C desde Python (O viceversa)
Acceder a C desde Python (O viceversa)
Juan Rodríguez
 
Viaje al centro de la locura con Javascript
Viaje al centro de la locura con JavascriptViaje al centro de la locura con Javascript
Viaje al centro de la locura con Javascript
Juan Rodríguez
 
Una imagen vale más que mil mentiras
Una imagen vale más que mil mentirasUna imagen vale más que mil mentiras
Una imagen vale más que mil mentiras
Juan Rodríguez
 
Introducción a DSL (Lenguajes Específicos de Dominios) con Python
Introducción a DSL (Lenguajes Específicos de Dominios) con PythonIntroducción a DSL (Lenguajes Específicos de Dominios) con Python
Introducción a DSL (Lenguajes Específicos de Dominios) con Python
Juan Rodríguez
 
Presentación estetoscopio
Presentación estetoscopioPresentación estetoscopio
Presentación estetoscopio
Juan Rodríguez
 
Charla introducción a RaspberryPI
Charla introducción a RaspberryPICharla introducción a RaspberryPI
Charla introducción a RaspberryPI
Juan Rodríguez
 
Guia (breve) de supervivencia a python 3
Guia (breve) de supervivencia a python 3Guia (breve) de supervivencia a python 3
Guia (breve) de supervivencia a python 3
Juan Rodríguez
 
02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional
Juan Rodríguez
 
01 el lenguaje Python
01 el lenguaje Python01 el lenguaje Python
01 el lenguaje Python
Juan Rodríguez
 
Presentacion Google Mini Adeje 16 Oct 2008
Presentacion Google Mini Adeje 16 Oct 2008Presentacion Google Mini Adeje 16 Oct 2008
Presentacion Google Mini Adeje 16 Oct 2008
Juan Rodríguez
 
Algunos recursos para desarrollo Web
Algunos recursos para desarrollo WebAlgunos recursos para desarrollo Web
Algunos recursos para desarrollo Web
Juan Rodríguez
 
Hojas de estilo CSS (Cascade Style Sheets)
Hojas de estilo CSS (Cascade Style Sheets)Hojas de estilo CSS (Cascade Style Sheets)
Hojas de estilo CSS (Cascade Style Sheets)
Juan Rodríguez
 

Más de Juan Rodríguez (17)

Estados imposibles y como evitarlos
Estados imposibles y como evitarlosEstados imposibles y como evitarlos
Estados imposibles y como evitarlos
 
Introduction to BDD (Behavior-Driven Development)
Introduction to BDD (Behavior-Driven Development)Introduction to BDD (Behavior-Driven Development)
Introduction to BDD (Behavior-Driven Development)
 
Vue.js: El framework javascript para muggles
Vue.js: El framework javascript para mugglesVue.js: El framework javascript para muggles
Vue.js: El framework javascript para muggles
 
Introducción a jupyter (antes i python notebook)
Introducción a jupyter (antes i python notebook)Introducción a jupyter (antes i python notebook)
Introducción a jupyter (antes i python notebook)
 
Acceder a C desde Python (O viceversa)
Acceder a C desde Python (O viceversa)Acceder a C desde Python (O viceversa)
Acceder a C desde Python (O viceversa)
 
Viaje al centro de la locura con Javascript
Viaje al centro de la locura con JavascriptViaje al centro de la locura con Javascript
Viaje al centro de la locura con Javascript
 
Una imagen vale más que mil mentiras
Una imagen vale más que mil mentirasUna imagen vale más que mil mentiras
Una imagen vale más que mil mentiras
 
Introducción a DSL (Lenguajes Específicos de Dominios) con Python
Introducción a DSL (Lenguajes Específicos de Dominios) con PythonIntroducción a DSL (Lenguajes Específicos de Dominios) con Python
Introducción a DSL (Lenguajes Específicos de Dominios) con Python
 
Presentación estetoscopio
Presentación estetoscopioPresentación estetoscopio
Presentación estetoscopio
 
Charla introducción a RaspberryPI
Charla introducción a RaspberryPICharla introducción a RaspberryPI
Charla introducción a RaspberryPI
 
Guia (breve) de supervivencia a python 3
Guia (breve) de supervivencia a python 3Guia (breve) de supervivencia a python 3
Guia (breve) de supervivencia a python 3
 
02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional02 python Programación orientada a objetos y funcional
02 python Programación orientada a objetos y funcional
 
01 el lenguaje Python
01 el lenguaje Python01 el lenguaje Python
01 el lenguaje Python
 
Presentacion Google Mini Adeje 16 Oct 2008
Presentacion Google Mini Adeje 16 Oct 2008Presentacion Google Mini Adeje 16 Oct 2008
Presentacion Google Mini Adeje 16 Oct 2008
 
Algunos recursos para desarrollo Web
Algunos recursos para desarrollo WebAlgunos recursos para desarrollo Web
Algunos recursos para desarrollo Web
 
Hojas de estilo CSS (Cascade Style Sheets)
Hojas de estilo CSS (Cascade Style Sheets)Hojas de estilo CSS (Cascade Style Sheets)
Hojas de estilo CSS (Cascade Style Sheets)
 
Extranet Parlamento
Extranet ParlamentoExtranet Parlamento
Extranet Parlamento
 

Último

Projecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdf
Projecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdfProjecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdf
Projecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdf
Festibity
 
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
AMADO SALVADOR
 
Estructuras básicas_ conceptos de programación (1).docx
Estructuras básicas_ conceptos de programación  (1).docxEstructuras básicas_ conceptos de programación  (1).docx
Estructuras básicas_ conceptos de programación (1).docx
SamuelRamirez83524
 
Informació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdfInformació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdf
Festibity
 
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
sarasofiamontezuma
 
Trabajo tecnología sobre Conceptos Básicos De Programación
Trabajo tecnología sobre Conceptos Básicos De ProgramaciónTrabajo tecnología sobre Conceptos Básicos De Programación
Trabajo tecnología sobre Conceptos Básicos De Programación
SofiaCollazos
 
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial ValenciaCatalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
AMADO SALVADOR
 
Todo sobre Minirobotica. Revista Saber Electronica
Todo sobre  Minirobotica. Revista Saber ElectronicaTodo sobre  Minirobotica. Revista Saber Electronica
Todo sobre Minirobotica. Revista Saber Electronica
Carlos Carlosnoemi
 
Sitios web 3.0 funciones ventajas y desventajas
Sitios web 3.0 funciones ventajas y desventajasSitios web 3.0 funciones ventajas y desventajas
Sitios web 3.0 funciones ventajas y desventajas
paulroyal74
 
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
marianabz2403
 
actividad 2 tecnologia (3).pdf junto con mis compañeros
actividad 2 tecnologia (3).pdf junto con mis compañerosactividad 2 tecnologia (3).pdf junto con mis compañeros
actividad 2 tecnologia (3).pdf junto con mis compañeros
aljitagallego
 
trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
zoecaicedosalazar
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdf
cristianrb0324
 
SISTESIS RETO4 Grupo4 co-creadores .ppsx
SISTESIS RETO4 Grupo4 co-creadores .ppsxSISTESIS RETO4 Grupo4 co-creadores .ppsx
SISTESIS RETO4 Grupo4 co-creadores .ppsx
tamarita881
 
algebra de boole teoria.pdf texto guia.1
algebra de boole teoria.pdf texto guia.1algebra de boole teoria.pdf texto guia.1
algebra de boole teoria.pdf texto guia.1
yuki22434
 
MANUAL DEL DECODIFICADOR DVB S2. PARA VSAT
MANUAL DEL DECODIFICADOR DVB  S2. PARA VSATMANUAL DEL DECODIFICADOR DVB  S2. PARA VSAT
MANUAL DEL DECODIFICADOR DVB S2. PARA VSAT
Ing. Julio Iván Mera Casas
 
TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....
TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....
TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....
bendezuperezjimena
 
IA en entornos rurales aplicada a la viticultura
IA en entornos rurales aplicada a la viticulturaIA en entornos rurales aplicada a la viticultura
IA en entornos rurales aplicada a la viticultura
Miguel Rebollo
 
absorcion de gases y practicas de laboratorios
absorcion de gases y practicas de laboratoriosabsorcion de gases y practicas de laboratorios
absorcion de gases y practicas de laboratorios
JuanAlvarez413513
 
Informació Projecte Iniciativa TIC SOPRA STERIA.pdf
Informació Projecte Iniciativa TIC SOPRA STERIA.pdfInformació Projecte Iniciativa TIC SOPRA STERIA.pdf
Informació Projecte Iniciativa TIC SOPRA STERIA.pdf
Festibity
 

Último (20)

Projecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdf
Projecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdfProjecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdf
Projecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdf
 
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
Catalogo General Electrodomesticos Teka Distribuidor Oficial Amado Salvador V...
 
Estructuras básicas_ conceptos de programación (1).docx
Estructuras básicas_ conceptos de programación  (1).docxEstructuras básicas_ conceptos de programación  (1).docx
Estructuras básicas_ conceptos de programación (1).docx
 
Informació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdfInformació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdf
 
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
 
Trabajo tecnología sobre Conceptos Básicos De Programación
Trabajo tecnología sobre Conceptos Básicos De ProgramaciónTrabajo tecnología sobre Conceptos Básicos De Programación
Trabajo tecnología sobre Conceptos Básicos De Programación
 
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial ValenciaCatalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
Catalogo Buzones BTV Amado Salvador Distribuidor Oficial Valencia
 
Todo sobre Minirobotica. Revista Saber Electronica
Todo sobre  Minirobotica. Revista Saber ElectronicaTodo sobre  Minirobotica. Revista Saber Electronica
Todo sobre Minirobotica. Revista Saber Electronica
 
Sitios web 3.0 funciones ventajas y desventajas
Sitios web 3.0 funciones ventajas y desventajasSitios web 3.0 funciones ventajas y desventajas
Sitios web 3.0 funciones ventajas y desventajas
 
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
 
actividad 2 tecnologia (3).pdf junto con mis compañeros
actividad 2 tecnologia (3).pdf junto con mis compañerosactividad 2 tecnologia (3).pdf junto con mis compañeros
actividad 2 tecnologia (3).pdf junto con mis compañeros
 
trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdf
 
SISTESIS RETO4 Grupo4 co-creadores .ppsx
SISTESIS RETO4 Grupo4 co-creadores .ppsxSISTESIS RETO4 Grupo4 co-creadores .ppsx
SISTESIS RETO4 Grupo4 co-creadores .ppsx
 
algebra de boole teoria.pdf texto guia.1
algebra de boole teoria.pdf texto guia.1algebra de boole teoria.pdf texto guia.1
algebra de boole teoria.pdf texto guia.1
 
MANUAL DEL DECODIFICADOR DVB S2. PARA VSAT
MANUAL DEL DECODIFICADOR DVB  S2. PARA VSATMANUAL DEL DECODIFICADOR DVB  S2. PARA VSAT
MANUAL DEL DECODIFICADOR DVB S2. PARA VSAT
 
TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....
TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....
TODO SOBRE LA INFORMÁTICA, HISTORIA, ¿QUE ES?, IMPORTANCIA Y CARACTERISTICAS....
 
IA en entornos rurales aplicada a la viticultura
IA en entornos rurales aplicada a la viticulturaIA en entornos rurales aplicada a la viticultura
IA en entornos rurales aplicada a la viticultura
 
absorcion de gases y practicas de laboratorios
absorcion de gases y practicas de laboratoriosabsorcion de gases y practicas de laboratorios
absorcion de gases y practicas de laboratorios
 
Informació Projecte Iniciativa TIC SOPRA STERIA.pdf
Informació Projecte Iniciativa TIC SOPRA STERIA.pdfInformació Projecte Iniciativa TIC SOPRA STERIA.pdf
Informació Projecte Iniciativa TIC SOPRA STERIA.pdf
 

Presentación appy/pod

  • 1. Generación dinámica de documentos con Appy/POD Juan Ignacio Rodríguez de León ~ @jileon en twitter ~ euribates@gmail.com
  • 2. ¿Qué es POD? POD (Python Open Document) es una librería python que permite generar documentos con contenidos dinámicos. Es parte de un framework llamando Appy (Applications in python)
  • 3. ¿Cómo funciona? 1) Se crea una plantilla en formato ODF (Open Document Format)
  • 4. ¿Cómo funciona? 1) Se crea una plantilla en formato ODF (Open Document Format) 2) Insertamos código dentro
  • 5. ¿Cómo funciona? 1) Se crea una plantilla en formato ODF (Open Document Format) 2) Insertamos código dentro 3) Llamamos a pod con la plantilla y un conjunto de objetos Python, obteniendo un documento ODF con el resultado deseado
  • 6. Otros formatos • Se puede usar el LibreOffice en modo de servidor para convertir el ODT resultante en cualquier formato que LibreOffice pueda exportar: RTF, Documentos Word, PDF, etc... • No lo veremos en esta presentación, pero se puede hacer • Para generar en documento en formato ODT, sin embargo, NO es necesario ni siquiera tener instalado OpenOffice.
  • 7. Hola, Mundo Primero creamos un documento con OpenOffice/LibreOffice. Vamos a incluir una variable que definiremos por programa. Para incluir la variable en el texto del documento:
  • 8. Hola, Mundo Primero creamos un documento con OpenOffice/LibreOffice. Vamos a incluir una variable que definiremos por programa. Para incluir la variable en el texto del documento: 1) Seleccionamos “grabar cambios” (Menú Editar->Cambios->Grabar)
  • 9. Hola, Mundo Primero creamos un documento con OpenOffice/LibreOffice. Vamos a incluir una variable que definiremos por programa. Para incluir la variable en el texto del documento: 1) Seleccionamos “grabar cambios” (Menú Editar->Cambios->Grabar) 2) Escribimos el nombre de la variable
  • 10. Hola, Mundo Primero creamos un documento con OpenOffice/LibreOffice. Vamos a incluir una variable que definiremos por programa. Para incluir 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 misma opción del menú.
  • 12. Fusionar plantilla con datos #!/usr/bin/env python from appy.pod.renderer import Renderer import datetime hora = datetime.datetime.now() renderer = Renderer( 'ex_01.odt', # Plantilla {'hora':hora}, # Contexto 'out_01.odt' # Salida ) renderer.run()
  • 13. No solo variables Podemos incluir otras cosas, además de variables: • Valores retornados por funciones • Expresiones • Valores retornados por métodos de objetos • Estructuras de datos complejas
  • 15. Fusionar con funciones/expresiones #!/usr/bin/env python from appy.pod.renderer import Renderer import datetime hora = datetime.datetime.now() def to_upper(s): return s.upper() renderer = Renderer( 'ex_02.odt', globals(), 'out_02.odt' ) renderer.run()
  • 17. #!/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
  • 18. Estructuras de control • Las estructuras de control se realizan mediante notas (En LibreOffice: Insertar -> Comentarios [Ctrl-Shift-C]) • El código va dentro de la nota • Solo hay dos estructuras de control: IF y FOR
  • 19. 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
  • 20. La sentencia IF Después del IF, puede venir cualquier expresión en Python, que se evaluará como un valor booleano. Si es verdadero, el área afectada aparecerá en el documento generado, si es falsa, no aparecerá.
  • 22. 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()
  • 23. La sentencia FOR La sentencia for tiene la siguiente forma: do <área afectada> for <variable> in <iterador> • En variable podemos usar cualquier nombre que sea válido en Python • Servirá como la variable de la iteración, es decir, el valor que cambia en cada ciclo. Se inserta en el contexto para que sea accesible. • En iterador nos servirá cualquier variable iterable en Python: listas, texto, tuplas, etc... • El área de actuación es igual que en el if.
  • 25. 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()
  • 26. Insertar contenido arbitrario • Existe una clausula especial from, que se puede añadir a las sentencias if/for • Permite sustituir el área afectada por el resultado de la cláusula from
  • 27. • La cláusula from debe empezar en una nueva línea (Si no, pensará que es parte de la sentencia y probablemente de error) • La cláusula debe ser una expresión válida en Python, que debe devolver un fragmento correctamente formateado en ODT. Para usar la cláusula from
  • 28. Ejemplo de uso de la cláusula from do text from '<text:p>Hola, mundo</text:p>' Ejemplo con un if Ejemplo con un for do text for i in range(3) from '<text:p>Hola, mundo %d</text:p>' % i La pega: Hay que conocer el formato interno de ODT (El resumen tiene 303 páginas) Por eso se inventó...
  • 29. La función xhtml • Esta función nos permite convertir de Html a formato ODT, preparado para ser incrustado con la cláusula from. • Si utilizamos clases en nuestro Html, y existe un estilo con el mismo nombre en la plantilla, se usará ese estilo. • Los tags h1..h6 se mapean a los estilos Heading1..Heading6.
  • 30. Ejemplo 6 ~ Uso de from/xhtml ~ Plantilla
  • 31. Ejemplo 6 ~ Uso de from/xhtml ~ Programa #!/usr/bin/env python # -*- coding: utf-8 -*- from appy.pod.renderer import Renderer ejemplo = ''' <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()
  • 32. la función document • La función document permite integrar dentro del 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 que estén en memoria (porque los recuperamos de una base de datos, por ejemplo) o que estén en el sistema de ficheros.
  • 33. la función document para contenidos en memoria Si el contenido está en memoria: • content puede ser o una variable cuyo valor son los datos binarios, o un objeto de tipo file, abierto • format puede ser o un tipo MIME o un extensión de fichero (sin punto) de alguno de los formatos aceptables: Un documento ODT, un documento PDF, una imagen PNG, una imagen JPEG o una imagen GIF
  • 34. Si el contenido está en un fichero: • El parámetro at indica la ruta dentro del sistema de ficheros de la imagen o documento a incrustar. • los parámetros content y format no son necesarios. la función document para contenidos en ficheros
  • 35. El parámetro anchor de la función document Este parámetro se usa solo para las imágenes, y determina la forma en que la imagen se ancla en el documento resultante. Los posibles valores son: Valor del parámetro Descripción page Al párrafo char A la página paragrap as-char Al carácter Como un carácter
  • 36. El código de los ejemplos está disponible El contenido de esta presentación, tanto en pdf como en su fuente original para scribus, los ficheros auxiliares, documentos y scripts de ejemplo están disponibles públicamente en: Con licencia Creative-commons reconocimiento (Attribution) hg clone https://bitbucket.org/euribates/presentacion-appy
  • 37. Créditos y agradecimientos La fotografía usada en el fondo es de: Luke Robinson (mortalcoil) http://www.flickr.com/photos/mortalcoil/