Pular para o conteúdo

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.
Diogo G. Zanetti diogozanetti
Hits: 27.609 Categoria: Java Subcategoria: Manipulação de Arquivos
  • Indicar
  • Impressora
  • Denunciar

Parte 3: 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();
    }
  }
}
   1. Introdução ao API OpenOffice
   2. Criando o ambiente
   3. Classe de exemplo

Xoops - Um ótimo gestor de portais em PHP

Ubuntu Linux - Visão Geral

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

GreenOS, um elegante sistema operacional para o novo mercado

Tranformando Ubuntu Breezy em Ubuntu Dapper

Gerando logs em Java

Programação orientada a objetos e o Java (parte 1)

Funções Completas - Comunicação entre aplicações Android e FTP

180 dias sem solução

Polimorfismo - Uma visão em C++ e Java

#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

Entre na sua conta para comentar.