miércoles, julio 19, 2006

OpenDocument Format y GeneXus

Hace unos meses tuve la necesidad de poder leer desde GeneXus archivos de OpenOffice, no me quedo otra que salir a investigar como poder hacerlo ya que no tenia la menor idea. Lo primero que hice fue buscar que significaban las extensiones odt, ods y odp ya que eran los archivos que tenia que leer para extraer el texto y luego procesar ese texto.

Las extensiones pertenecían a:

OpenOffice.org Writer (.odt) - Procesador de Texto
OpenOffice.org Calc (.ods) - Planilla de Calculos
OpenOffice.org Impress (.odp) - Presentaciones

Después de tener esto claro comencé a buscar como hacer para leer estos formatos desde GX y lamentablemente no tenia forma de hacerlo desde GX, por lo menos con los conocimientos que tenia hasta ese momento.

Cuando ya estaba por darme por vencido descubrí que el OpenOffice trabaja con un formato abierto llamado OpenDocument, cuando comprendí que los archivos que yo tenia que leer estaban en un formato abierto no me quedaba otra que estudiar el OpenDocument para poder interpretar ese formato.

OpenDocument es un estándar abierto que pretende ser una alternativa a los formatos cerrados de Microsoft Office. Este formato está basado en un esquema XML. Por mas información consultar el siguiente link:

http://es.wikipedia.org/wiki/OpenDocument

Después que estudie el estándar del OpenDocument Format todo me quedo mas claro ya que alcanza con descomprimir el contenido de los archivos de OpenOffice y acceder a los diferentes XMLS:

content.xml
meta.xml
settings.xml
styles.xml

De esos xml para acceder al contenido de un documento alcanza con leer el content.xml, después que llegue a tener él conocimiento necesario para interpretar el OpenDocument me di cuenta que desde GX alcanzaba con hacer un programa que lea un xml y extraiga el texto.

El procedimiento me quedo de la siguiente manera:

//**********************************************************************************
/*
Autor : Cristhian Gómez (urulinux@adinet.com.uy)
Start Date : 02-03-2006
Last Update: 02-03-2006
Versión : 1.0.01
*/

&NombreArchivo = &NombreArchivoExterno

// El primer parámetro es el nombre del Archivo de OpenOffice o de StarOffice
// El procedimiento me devuelve el nombre del XML que tengo
// que leer (content.xml)

&Archivo.Source = &NombreArchivo

if &Archivo.Exists()
call('unzipjava', &NombreArchivo, &Nombre_Content)
&readfile.open(&Nombre_Content)
&readfile.ReadType(1, 'office:body')
&readfile.read()
do while &readfile.name <> 'office:body'
&Auxiliar = trim(&readfile.value)
if &Auxiliar <> NullValue(&Auxiliar)
&txtBody = &txtBody + newline() + &Auxiliar
endif
&readfile.read()
enddo
&readfile.close()
&OutText = &txtBody
else
&OutText = "No existe un archivo en el servidor para leer...."
endif

//**********************************************************************************

Como pueden ver en el código con muy pocas líneas de código puedo leer desde GX archivos de OpenOffice, lo único externo a GX es el programa que se encarga de descomprimir el archivo de OpenOffice (unzipjava).

Esto me demostró que los problemas en informática van a depender del conocimiento del programador ya que en mi caso alcanzo con dedicarle un tiempo a investigar el OpenDocument como para poder cumplir mi objetivo.

Los que quieran ver un ejemplo de esto funcionando pueden entrar a:

http://www.gxopen.com:8080/gxotf_odf/servlet/hopenofficetest

Está aplicación sube el documento al servidor y lo abre mostrando el texto plano en pantalla extraído del documento de OpenOffice.

2 comentarios:

Unknown dijo...

y como obtengo el programa para descomprimir?

urulinux dijo...

En su momento baje un código de ejemplo en java para descomprimir zip que es muy sencillo de obtener.