Manejar presentaciones con UNO

0
7684

Manejar presentaciones con UNO

Introducción

En un tutorial anterior
hemos visto cómo usar el API de Java UNO para extraer texto de diferentes tipos de documento de MS Office.
En dicho tutorial se pasa un poco por encima del manejo de presentaciones, usando PDFBox para covertir el conjunto
de diapositivas en un fichero del que poder leer todo el «chorro» de texto.

En este artículo vamos a aprender a usar el API UNO para manejar presentaciones, aunque usaremos el formato
propio de Open Office en lugar del formato Power Point

El formato Open Document

Open Document es el formato (se ha convertido en un estándar) que utiliza Open Office para almacenar los distintos
tipos de archivos. Podéis encontrar más información
en la Wikipedia
, pero como breve resumen hay que reseñar que se trata de un archivo comprimido en formato ZIP,
en cuyo interior se encuentra el contenido del documento en un fichero XML, al igual que los estilos (el formato de los textos)
y una carpeta que contiene las imágenes adjuntas al documento

Manejar una presentación

Como base para el tutorial vamos a usar (aunque con alguna modificación) el código común mostrado en el anterior tutorial de UNO:

public static void main(String[] args) {

		// Arrancar OpenOffice a traves de UNO
	    XComponentContext xContext;
	    XComponent xCompDest = null;
	    XComponent xCompSrc = null;
	    XDesktop oDesktop = null;
  try {
			xContext = Bootstrap.bootstrap();
		
	    
		    // Obtener la factoria de servicios de OpenOffice
		    XMultiComponentFactory xMCF = xContext.getServiceManager();
		    
		    // Obtener la ventana principal (Desktop) de OpenOffice
		    Object oRawDesktop = xMCF.createInstanceWithContext( "com.sun.star.frame.Desktop", xContext );
		    oDesktop = (XDesktop) UnoRuntime.queryInterface(XDesktop.class,oRawDesktop);
		    
		    // Obtener interfaz XComponentLoader del XDesktop
		    XComponentLoader xCompLoader = (XComponentLoader)
		        UnoRuntime.queryInterface(com.sun.star.frame.XComponentLoader.class, oDesktop);
		    
		    // Definir URL del fichero a cargar (de destino, o sea, el que recogera las nuevas diapositivas
		    String sUrlDestiny = "file:///c:/Proyectos/workspace/UNOPrueba/autentiaODP.odp";
		    
		    // Cargar el documento en una nueva ventana oculta del XDesktop
		    PropertyValue[] loadProps = new PropertyValue[1];
		    loadProps[0] = new PropertyValue();
		    loadProps[0].Name = "Hidden";
		    loadProps[0].Value = new Boolean(true);
		    xCompDest = xCompLoader.loadComponentFromURL(sUrlDestiny, "_blank", 0, loadProps);
		    .
		    .
		    .
		    .
  } catch (Exception e) {
			
	   e.printStackTrace();
  } finally {
	    
	   // Cerrar el documento abierto
	   xCompSrc.dispose();
	
	   // Opcionalmente, cerrar el ejecutable de OpenOffice (solo si no vamos a extraer nada mas)
		 oDesktop.terminate();
  }
}

El siguiente paso es obtener la colección de diapositivas («draw pages», como se denominan en el fichero de contenidos y en el
ámbito de UNO). La presentación que vamos a usar como ejemplo tiene una única página:

public static void main(String[] args) {

		// Arrancar OpenOffice a traves de UNO
	    XComponentContext xContext;
	    XComponent xCompDest = null;
	    XComponent xCompSrc = null;
	    XDesktop oDesktop = null;
  try {
    xContext = Bootstrap.bootstrap();
    
    
    // Obtener la factoria de servicios de OpenOffice
    XMultiComponentFactory xMCF = xContext.getServiceManager();
    
    // Obtener la ventana principal (Desktop) de OpenOffice
    Object oRawDesktop = xMCF.createInstanceWithContext( "com.sun.star.frame.Desktop", xContext );
    oDesktop = (XDesktop) UnoRuntime.queryInterface(XDesktop.class,oRawDesktop);
    
    // Obtener interfaz XComponentLoader del XDesktop
    XComponentLoader xCompLoader = (XComponentLoader)
        UnoRuntime.queryInterface(com.sun.star.frame.XComponentLoader.class, oDesktop);
    
    // Definir URL del fichero a cargar (de destino, o sea, el que recogera las nuevas diapositivas
    String sUrlDestiny = "file:///c:/Proyectos/workspace/UNOPrueba/autentiaODP.odp";
    
    // Cargar el documento en una nueva ventana oculta del XDesktop
    PropertyValue[] loadProps = new PropertyValue[1];
    loadProps[0] = new PropertyValue();
    loadProps[0].Name = "Hidden";
    loadProps[0].Value = new Boolean(true);
    xCompDest = xCompLoader.loadComponentFromURL(sUrlDestiny, "_blank", 0, loadProps);
    XDrawPagesSupplier pagesSup = (XDrawPagesSupplier) UnoRuntime.queryInterface(com.sun.star.drawing.XDrawPagesSupplier.class, xCompDest);
    XDrawPages drawPages = pagesSup.getDrawPages(); 
    //Podemos consultar el numero de transparencias de nuestra presentacion...
    int index = drawPages.getCount();
    .
    .
    .
    .
  } catch (Exception e) {
			
	   e.printStackTrace();
  } finally {
	    
	   // Cerrar el documento abierto
	   xCompSrc.dispose();
	
	   // Opcionalmente, cerrar el ejecutable de OpenOffice (solo si no vamos a extraer nada mas)
		 oDesktop.terminate();
  }
}

Ahora vamos extraer el texto de una diapositiva. Para ello, primero seleccionaremos una diapositiva, luego tenemos que extraer
la colección de formas («Shapes») que contiene dicha página y buscar las formas que contengan texto.

import com.sun.star.awt.Point;
import com.sun.star.awt.Size;
import com.sun.star.beans.Property;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.PropertyVetoException;
import com.sun.star.beans.XPropertySet;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.comp.helper.BootstrapException;
import com.sun.star.drawing.XDrawPage;
import com.sun.star.drawing.XDrawPages;
import com.sun.star.drawing.XDrawPagesSupplier;
import com.sun.star.drawing.XShape;
import com.sun.star.drawing.XShapes;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XStorable;
import com.sun.star.lang.IllegalArgumentException;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.text.XText;
import com.sun.star.text.XTextRange;
import com.sun.star.uno.Exception;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.uno.XInterface;
import com.sun.star.util.VetoException;


public class UNOTutorial {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// Arrancar OpenOffice a traves de UNO
	    XComponentContext xContext;
	    XComponent xCompDest = null;
	    XComponent xCompSrc = null;
	    XDesktop oDesktop = null;
		try {
			xContext = Bootstrap.bootstrap();
		
	    
		    // Obtener la factoria de servicios de OpenOffice
		    XMultiComponentFactory xMCF = xContext.getServiceManager();
		    
		    // Obtener la ventana principal (Desktop) de OpenOffice
		    Object oRawDesktop = xMCF.createInstanceWithContext( "com.sun.star.frame.Desktop", xContext );
		    oDesktop = (XDesktop) UnoRuntime.queryInterface(XDesktop.class,oRawDesktop);
		    
		    // Obtener interfaz XComponentLoader del XDesktop
		    XComponentLoader xCompLoader = (XComponentLoader)
		        UnoRuntime.queryInterface(com.sun.star.frame.XComponentLoader.class, oDesktop);
		    
		    // Definir URL del fichero a cargar (de destino, o sea, el que recogera las nuevas diapositivas
		    String sUrlDestiny = "file:///c:/Proyectos/workspace/UNOPrueba/autentiaODP.odp";
		    
		    // Cargar el documento en una nueva ventana oculta del XDesktop
		    PropertyValue[] loadProps = new PropertyValue[1];
		    loadProps[0] = new PropertyValue();
		    loadProps[0].Name = "Hidden";
		    loadProps[0].Value = new Boolean(true);
		    xCompDest = xCompLoader.loadComponentFromURL(sUrlDestiny, "_blank", 0, loadProps);
		    
		    XDrawPagesSupplier pagesSup = (XDrawPagesSupplier) UnoRuntime.queryInterface(com.sun.star.drawing.XDrawPagesSupplier.class, xCompDest);
		    XDrawPages drawPages = pagesSup.getDrawPages(); 
		    //empezamos a añadir detras de todo lo que hay
		    int index = drawPages.getCount();
		    
		    //Extraemos el texto de una diapositiva
		    XShapes shapesSrc = (XShapes) UnoRuntime.queryInterface(com.sun.star.drawing.XShapes.class,drawPages.getByIndex(0));
		    for (int i = 0; i

Ahora vamos a agregar una nueva página a la presentación, y a esa página le vamos a agregar una forma con un texto. Para simplificar, vamos a «copiar» las formas de la página anterior… Vamos a crear nuevas formas y vamos a agregar el texto de las formas antiguas. Además, vamos a guardar los cambios en un fichero llamado «autentiaSalida.odp»:

import com.sun.star.awt.Point;
import com.sun.star.awt.Size;
import com.sun.star.beans.Property;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.PropertyVetoException;
import com.sun.star.beans.XPropertySet;
import com.sun.star.comp.helper.Bootstrap;
import com.sun.star.comp.helper.BootstrapException;
import com.sun.star.drawing.XDrawPage;
import com.sun.star.drawing.XDrawPages;
import com.sun.star.drawing.XDrawPagesSupplier;
import com.sun.star.drawing.XShape;
import com.sun.star.drawing.XShapes;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XStorable;
import com.sun.star.lang.IllegalArgumentException;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.text.XText;
import com.sun.star.text.XTextRange;
import com.sun.star.uno.Exception;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.uno.XInterface;
import com.sun.star.util.VetoException;


public class UNOTutorial {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// Arrancar OpenOffice a traves de UNO
	    XComponentContext xContext;
	    XComponent xCompDest = null;
	    XDesktop oDesktop = null;
		try {
			xContext = Bootstrap.bootstrap();
		
	    
		    // Obtener la factoria de servicios de OpenOffice
		    XMultiComponentFactory xMCF = xContext.getServiceManager();
		    
		    // Obtener la ventana principal (Desktop) de OpenOffice
		    Object oRawDesktop = xMCF.createInstanceWithContext( "com.sun.star.frame.Desktop", xContext );
		    oDesktop = (XDesktop) UnoRuntime.queryInterface(XDesktop.class,oRawDesktop);
		    
		    // Obtener interfaz XComponentLoader del XDesktop
		    XComponentLoader xCompLoader = (XComponentLoader)
		        UnoRuntime.queryInterface(com.sun.star.frame.XComponentLoader.class, oDesktop);
		    
		    // Definir URL del fichero a cargar (de destino, o sea, el que recogera las nuevas diapositivas
		    String sUrlDestiny = "file:///c:/Proyectos/workspace/UNOPrueba/autentiaODP.odp";
		    
		    // Cargar el documento en una nueva ventana oculta del XDesktop
		    PropertyValue[] loadProps = new PropertyValue[1];
		    loadProps[0] = new PropertyValue();
		    loadProps[0].Name = "Hidden";
		    loadProps[0].Value = new Boolean(true);
		    xCompDest = xCompLoader.loadComponentFromURL(sUrlDestiny, "_blank", 0, loadProps);
		    
		    XDrawPagesSupplier pagesSup = (XDrawPagesSupplier) UnoRuntime.queryInterface(com.sun.star.drawing.XDrawPagesSupplier.class, xCompDest);
		    XDrawPages drawPages = pagesSup.getDrawPages(); 
		    //empezamos a añadir detras de todo lo que hay
		    int index = drawPages.getCount();
		    
		    //Extraemos el texto de una diapositiva
		    XShapes shapesSrc = (XShapes) UnoRuntime.queryInterface(com.sun.star.drawing.XShapes.class,drawPages.getByIndex(0));
		    for (int i = 0; i

Si después de esto abrimos la nueva presentación que hemos creado, vemos que ahora tenemos una nueva página, con el mismo texto que la primera.

Conclusiones

Ya hemos visto algo más sobre el API UNO, ahora sabemos manejar presentaciones, extraer texto de las diapostivas, crear nuevas páginas… Ahora es cosa vuestra seguir investigando para sacarle todo el partido a este API.

Y si preferís que otros investiguen por vosotros, ya sabéis que podéis contratar a Autentia para que os ayudemos en vuestros proyectos.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad