La realización de informes puede ser una tarea tediosa y repetitiva, la cual puede ser automatizada. Después de aparecer varias preguntas relacionadas con este tema en la Lista de Usuarios y visto que podía ser de utilidad para la comunidad, hemos desarrollado un script en el que mostraremos un camino para realizar esta automatización.
En este caso vamos a utilizar la librería jOpenDocument, una librería que nos permitirá editar ficheros de texto (odt) y hojas de cálculo (ods) de LibreOffice desde nuestro código.
Vamos a utilizar una plantilla y un script ya preparados para mostrar lo que sería el objetivo final de esta automatización. En este ejemplo tenemos un script que saca información de las parcelas que tengamos seleccionadas en una capa determinada. Para ello, accede a la información de varios campos de la entidad, y saca dos imágenes de nuestra Vista, una de la capa completa y otra sobre la entidad seleccionada. La escala que se aplicará a la imagen centrada sobre la entidad será la escala que tengamos en ese momento sobre la Vista.
El resultado que buscamos es este:

Para realizar la prueba, he preparado un fichero .zip que contiene todo lo necesario. Podéis descomprimir este fichero quedándose así en C:\gvsig_informes\. El script está preparado para esta ruta, si es otra, deberéis modificarlas al inicio del script.
Lo primero será instalar la librería jOpenDocument. En su web podéis encontrar documentación de ejemplos y su API. Para este ejemplo he utilizado jOpenDocument 1.3 que es la última versión estable. Lo podemos descargar, o copiar desde el zip que os habéis descargado. Es un fichero .jar (el facilitado en el .zip sería jOpenDocument-1.3.jar), el cual deberemos copiar a la carpeta \gvSIG\extensiones\org.gvsig.scripting.app.extension\lib de la carpeta de instalación de gvSIG. Normalmente será:
- Win: C:\Program Files (x86)\gvSIG desktop 2.2.0\gvSIG\extensiones\org.gvsig.scripting.app.extension\lib
- Linux: \home\[usuario]\gvsig-desktop\gvSIG_2.2.0_final\gvSIG\extensiones\org.gvsig.scripting.app.extension\lib
Para el ejemplo, ya en gvSIG, debemos de tener abierta en una Vista la capa de manzanas_valencia.shp que adjunto en el zip, y tener esta capa seleccionada en la Tabla de Contenidos (ToC) de la Vista (debe de aparecer en negrita). Además tenemos que seleccionar las entidades de las cuales queremos generar el informe.
Una vez esto, solo quedaría cargar nuestro script en el Módulo de Scripting, modificar las cuatro rutas que aparecen en él en caso de que fuera necesario, y ejecutarlo:
from gvsig import *
import sys
from geom import *
from java.io import File
from org.jopendocument.dom.template import JavaScriptFileTemplate
from org.jdom import Namespace
from com.sun.jimi.core import Jimi
from org.gvsig.app import ApplicationLocator
import time
def main(*args):
#Input
pathTemplate = "C:\\gvsig_informes\\plantilla_informe_test2.odt"
#Output
# Utilizar este formato con una unica barra
pathOutputFile = r"C:/gvsig_informes/resultado/test_parcela%02d"
pathEnvelope = r"C:/gvsig_informes/resultado/envelope.png"
pathImageOut = r"C:/gvsig_informes/resultado/img%02d.png"
#Inicio
print "Informe parcelario"
application = ApplicationLocator.getManager()
layer = currentLayer()
docvista = currentView()
docwin = application.getDocumentWindow(docvista())
#Get scale
gsv = currentView().getMapContext().getScaleView()
#Envelope global
envelope = currentView().getMap().getLayers().getMapContext().getFullEnvelope()
currentView().getMapContext().getViewPort().setEnvelope(envelope)
time.sleep(2)
img = docwin.getMapControl().getImage()
Jimi.putImage(img,pathEnvelope)
#Create images and odt
n=0
for f in layer.getSelection():
print f.MASA, f.geometry()
#Center view and set same scale
geomf = f.geometry()
centerView(geomf)
currentView().getMapContext().setScaleView(gsv)
time.sleep(2)
#Imagen
img = docwin.getMapControl().getImage()
pathImage = pathImageOut % n
Jimi.putImage(img,pathImage)
# Create odt
pathOutFile = pathOutputFile % n
templateFile = pathTemplate #File(pathTemplate)
outFile = File(pathOutFile)
bcFile = pathImage
template = JavaScriptFileTemplate(templateFile)
values = f.getValues()
template.setField("hoja", str(values['HOJA']))
template.setField("area", str(values['AREA']))
template.setField("coorx", f.COORX)
template.setField("coory", f.COORY)
ddoc = template.createDocument()
ddoc.getDescendantByName("draw:frame","Imagen2").setAttribute("href", "file:///" + bcFile,Namespace.getNamespace("xlink", "http://www.w3.org/1999/xlink"))
ddoc.getDescendantByName("draw:frame","Imagen1").setAttribute("href", "file:///" + pathEnvelope,Namespace.getNamespace("xlink", "http://www.w3.org/1999/xlink"))
ddoc.saveAs(outFile)
#template.saveAs(outFile)
n += 1
def centerView(geomi):
envelope = geomi.getEnvelope()
currentView().getMapContext().getViewPort().setEnvelope(envelope)
time.sleep(2)
Resumen de los pasos a seguir:
- Descomprimir fichero del zip quedando el contenido en C:/gvsig_informes (en caso de que sea otra ruta se debe indicar en el script).
- Copiar el fichero jOpenDocument-1.3.jar a la carpeta \gvSIG\extensiones\org.gvsig.scripting.app.extension\lib de la carpeta de instalación de gvSIG
- Cargar capa manzanas_valencia.shp en gvSIG
- Teniendo la capa activa en negrita en la Tabla de Contenido de la Vista
- Seleccionar varias entidades de la capa
- Ejecutar el script
Sin embargo, este script aún tiene un par de limitaciones:
- Las imágenes en la plantilla solo pueden ser remplazadas, esto es, la imagen que cogemos en gvSIG tiene la forma del recuadro de la Vista, si es de diferente tamaño se deformará en la plantilla. Tiene solución si editamos la plantilla con imágenes adaptadas al tamaño que tengamos adecuado, o mediante programación se podrían hacer recortes en la imagen creada.
- Las imágenes aparecen como enlaces relativos a ficheros de imágenes, por tanto, la imagen no queda realmente dentro de la plantilla, sino es un enlace a ella.
- Si la plantilla contiene caracteres especiales como tildes me aparece error a la hora de crear el documento. No se seguro por qué aparece este error, tal vez un problema en la codificación o de la plantilla o de la librería.
Si el post resulta de interés para vosotros, publicaremos otros nuevos explicando los pasos seguidos en este para que comprendáis cómo poder modificarlo, y ejemplos de otros tipos como la edición de hojas de cálculo ods o mirar su exportación a PDF.
La librería jOpenDocument abre muchas posibilidades. Cualquier ayuda o aportación será bienvenida.
Espero que les sea de su interés.
Actualización para la versión gvSIG 2.3:
He realizado una actualización del script para la nueva versión de gvSIG. Adjunto el código abajo, pero también podéis descargos directamente el paquete de aquí e instalarlo desde el Administrador de Complementos. Después de instalarlo os aparecerá dentro de la carpeta Addons desde el Scripting Composer. El único requisito será tener asignada una carpeta output (se puede modificar), en este script aparece como “C:/gvsig_informes/resultados”. El jar y la plantilla lo coge de forma relativa, haciendo referencia a la propia carpeta del plugin.