Convertendo softwares utilizando OpenOffice e Java

Você verá como capturar documentos, substituir strings e gerar novos documentos a partir de documentos iniciais utilizando Java e OpenOffice.

[ Hits: 26.134 ]

Por: Diogo G. Zanetti em 28/07/2006 | Blog: http://exadmax.googlepages.com


Classe de exemplo



import com.sun.star.bridge.XUnoUrlResolver;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.uno.XComponentContext;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XStorable;
import com.sun.star.beans.PropertyValue;
import com.sun.star.beans.XPropertySet;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;



public class DocumentConverter {

  static XComponentLoader xcomponentloader = null;

  static String stringConvertType = "MS Word 97";

  static String stringExtension = "doc";

  static String indent = "";
  
/**
* Metodo recursivo de localização e modificação de arquivos do formato sxw para
* doc
*/
static void traverse( File fileDirectory ) {

    if ( !fileDirectory.isDirectory() ) {
      throw new IllegalArgumentException(
      "nao é um diretório: " + fileDirectory.getName()
      );
    }
    
    System.out.println(indent + "[" + fileDirectory.getName() + "]");
    indent += "  ";
    

    File[] entries = fileDirectory.listFiles(
    new FileFilter() {
      public boolean accept( File pathname ) {
        return pathname.getName().endsWith("sxw");
      }
    }
    );
    
    // Iteração que é realizada em cada pasta
    for ( int i = 0; i < entries.length; ++i ) {

      if ( entries[ i ].isDirectory() ) {

        traverse( entries[ i ] );
      } else {
        // abaixo inicia-se a conversao
        try {
          // o OOo precisa que esteja no formato Url
          String stringUrl = "file:///"
          + entries[ i ].getAbsolutePath().replace( '\', '/' );
System.out.println(entries[i] + ":" + stringUrl);
          // Loading the wanted document
          Object objectDocumentToStore =
          DocumentConverter.xcomponentloader.loadComponentFromURL(
          stringUrl, "_blank", 0, new PropertyValue[0] );
          

          XStorable xstorable =
          ( XStorable ) UnoRuntime.queryInterface( XStorable.class,
          objectDocumentToStore );
          

          PropertyValue propertyvalue[] = new PropertyValue[ 2 ];

          propertyvalue[ 0 ] = new PropertyValue();
          propertyvalue[ 0 ].Name = "Overwrite";
          propertyvalue[ 0 ].Value = new Boolean(true);

          propertyvalue[ 1 ] = new PropertyValue();
          propertyvalue[ 1 ].Name = "FilterName";
          propertyvalue[ 1 ].Value = DocumentConverter.stringConvertType;
          

          int index = stringUrl.lastIndexOf(".");
          stringUrl = stringUrl.substring(0, index + 1) + DocumentConverter.stringExtension;
          

System.out.println(stringUrl + ":" +  propertyvalue);        
          xstorable.storeToURL( stringUrl, propertyvalue );
          

          XComponent xcomponent =
          ( XComponent ) UnoRuntime.queryInterface( XComponent.class,
          xstorable );
          
          // Closing the converted document
          xcomponent.dispose();
        }
        catch( Exception exception ) {
          exception.printStackTrace();
        }
        
        System.out.println(indent + entries[ i ].getName());
      }
    }
    
    indent = indent.substring(2);
  }
  

  public static void main( String args[] ) {
    try {
      XComponentContext xComponentContext =
      com.sun.star.comp.helper.Bootstrap.createInitialComponentContext( null );
      
      /* Gets the service manager instance to be used (or null). This method has
         been added for convenience, because the service manager is a often used
         object. */
      XMultiComponentFactory xMultiComponentFactory =
      xComponentContext.getServiceManager();

      Object objectUrlResolver = xMultiComponentFactory.createInstanceWithContext(
      "com.sun.star.bridge.UnoUrlResolver", xComponentContext );
      
      // Create a new url resolver
      XUnoUrlResolver xurlresolver = ( XUnoUrlResolver )
      UnoRuntime.queryInterface( XUnoUrlResolver.class,
      objectUrlResolver );
      //abaixo a conexão é realizada na porta 2002
      Object objectInitial = xurlresolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ServiceManager" );
      

      xMultiComponentFactory = ( XMultiComponentFactory )
      UnoRuntime.queryInterface( XMultiComponentFactory.class, objectInitial );
      
      XPropertySet xpropertysetMultiComponentFactory = ( XPropertySet )
      UnoRuntime.queryInterface( XPropertySet.class, xMultiComponentFactory );
      

      Object objectDefaultContext =
      xpropertysetMultiComponentFactory.getPropertyValue( "DefaultContext" );
      

      xComponentContext = ( XComponentContext ) UnoRuntime.queryInterface(
      XComponentContext.class, objectDefaultContext );
      

      xcomponentloader = ( XComponentLoader )
      UnoRuntime.queryInterface( XComponentLoader.class,
      xMultiComponentFactory.createInstanceWithContext(
      "com.sun.star.frame.Desktop", xComponentContext ) );
      
      //modifique a linha abaixo para uma pasta contendo o seu arquivo
      File file = new File("/home/{coloca a sua home aqui}/Teste");
      
      traverse( file );
      
      System.exit(0);
    }
    catch( Exception e ) {
      e.printStackTrace();
    }
  }
}
Página anterior    

Páginas do artigo
   1. Introdução ao API OpenOffice
   2. Criando o ambiente
   3. Classe de exemplo
Outros artigos deste autor

Catalogando distribuições, usuários e ambientes para a melhor distribuição

Ubuntu Linux - Visão Geral

Transformando seu Windows em um quase Linux

Xoops - Um ótimo gestor de portais em PHP

Monte seu ambiente de desenvolvimento em 3 horas com Ubuntu

Leitura recomendada

Gerando logs em Java

Escrevendo aplicações com MySQL e Java

Trabalhando com a interface gráfica em Java

Programação orientada a objetos e o Java (Parte 6)

Trabalhando com a interface gráfica em Java (parte 2)

  
Comentários
[1] Comentário enviado por diogozanetti em 28/07/2006 - 16:28h

gente desculpa o termo, mas eu errei a palavra software... é pra ser documento!

[2] Comentário enviado por removido em 30/07/2006 - 17:46h

Fala Diogo. Queria saber mais sobre essas possibilidades. Não entendo nada de programação - só umas noções de Shell-, mas queria ver uma coisa mais ou menos pronta usando os recursos que vc citou no artigo.

Por exemplo, queria saber se dá pra criar uma interface com recursos de acesso a banco de dados, melhor, um aplicativo com funções básicas para uma pequena empresa. Algo que sirva por exemplo, pra cadastrar clientes, produtos, emitir recibos, notas, etc?

Agradeço por sua atenção.

[3] Comentário enviado por diogozanetti em 31/07/2006 - 09:04h

é possível sim, é possível de dois modos, ou nós fazemos uma aplicação C++/Java/Python que utilize como servidor de aplicações o OpenOffice utilizando conexões UNO ou podemos fazer isso utilizando totalmente o OpenOffice.... pelo OOo já possuir uma Base de dados interna (SQLite) é possível utilizar a dele, ou fazer com que ele se conecte a uma base de dados externa via jdbc...
no site http://api.openoffice.org procure pelo guia do desenvolvedor, um PDF de 24 megas. Nele existe toda a informação que vc procura.

[4] Comentário enviado por a.fernando em 31/07/2006 - 23:16h

muito bom !!!

não tinha a minima idéia de que era possível fazer isso com openoffice

cara, apesar de ser pequeno, é um excelente artigo

parabens

[5] Comentário enviado por eliasm em 09/08/2006 - 16:34h

Olá,
Alguém pode me tirar uma a seguinte dúvida:
Eu consigo utilizar os recursos do OpenOffice sem tê-lo instalado, ou seja usar seus recursos a partir do java???? O que é URE ??
Obrigado.

[6] Comentário enviado por diogozanetti em 11/05/2007 - 10:51h

Possibilidades imensas pense que vc consegue criar um DOCS GOOGLE utilizando o openoffice... gerar por exemplo um sistema completo de estoque com terminais que utilizam apenas openoffice e uma central em java.
as possibilidades são imensas.

[7] Comentário enviado por diogozanetti em 13/11/2008 - 08:33h

caiapó, um exemplo prático:
Temos um sistema WEB que rode por exemplo um sistema de billing ou um sistema de pagamentos de funcionários, podemos usar o openoffice pra gerar PDFs e o sistema interno pra envio de e-mail por exemplo de um boleto fixo, de relatórios em planilhas, inclusive com gráficos, podemos acessar uma base do openoffice via aplicação java direto, utilizando jdbc para acessar os dados, depois ligamos ele remotamente para gerar na impressora central de um prédio a impressão de todos os impressos de planilhas que podemos gerar automáticamente com faturas disso, que não poderiamos fazer em html, apenas em planilha eletrônica.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts