Desenvolvimento - Python

Automatização de tarefas do OpenOffice usando o Python

O projeto OpenOffice.org possui uma característica muito útil e pouco utilizada que é a capacidade de integrar seu funcionamento com outros aplicativos...

por Elton Luís Minetto



O projeto OpenOffice.org possui uma característica muito útil e pouco utilizada que é a capacidade de integrar seu funcionamento com outros aplicativos. Isto é possível através do UNO (Universal Network Objects), que é um modelo de componentes do OO.org. UNO oferece interoperabilidade entre diferentes linguagens de programação, diferentes modelos de objetos, diferentes arquiteturas e processos, em uma rede local ou mesmo através da internet. Seus componentes podem ser implementados e acessados por qualquer linguagem de programação que possua acesso aos bindings do UNO.

Atualmente existem bindings para as seguintes linguagens:

  • C
  • C++
  • Java
  • Python

A utilização do UNO na linguagem python é possível usando-se o Python-UNO (pyUNO). Desde a versão OpenOffice1.1RC4 o pyUNO é incluído por padrão nas instalações do OO.org. No diretório program existe uma versão do python(2.2.2) com acesso ao pyUNO. Neste exemplo é demonstrado um script que executa o OO.org, abre um arquivo de texto com campos específicos, faz a mesclagem (substitui os campos por valores), imprime e fecha o arquivo.

import uno
import unohelper
import os

# Abre o OpenOffice.org usando os parametros para que fique ouvindo na porta 2002 por novas
# conexões. O parametro accept é usado para criar uma que clientes tenham acesso a API do
# OpenOffice.org através da rede, seja interna ou internet.
os.system("soffice "-accept=socket,host=localhost,port=2002;urp;"")

# Retorna o componente context do PyUNO runtime
localContext = uno.getComponentContext()

# Cria o UnoUrlResolver 
resolver = localContext.ServiceManager.createInstanceWithContext(
    "com.sun.star.bridge.UnoUrlResolver", localContext)

# Conecta ao OO.org em execução
ctx = resolver.resolve(
    "uno:socket,host=localhost,port=2002;"
    "urp;StarOffice.ComponentContext")
smgr = ctx.ServiceManager

# Retorna o objeto central do desktop
desktop = smgr.createInstanceWithContext(
    "com.sun.star.frame.Desktop", ctx)

# Carrega o documento
cwd = os.getcwd()
path = os.path.join(cwd, "modelo.sxw")
url = unohelper.systemPathToFileUrl(path)
doc = desktop.loadComponentFromURL(url, "_blank", 0, ())

# Procura e substituicao
# Lista dos dados a alterar
# No arquivo modelo.sxw existe dois campos chamados {{{nome}}} e 
# {{{sobrenome}}}. Estes campos serão substituídos pelo conteúdo das
# tuplas abaixo

L = [("{{{nome}}}", "Elton", ),
     ("{{{sobrenome}}}", "Minetto", ),
     ]
# busca e troca
for search, replace in L:
    rd = doc.createReplaceDescriptor()
    rd.setSearchString(search)
    rd.setReplaceString(replace)
    doc.replaceAll(rd)

# Imprime
uno.invoke(doc, "print", ((), ))
res = doc.getPrinter()
print res[4]

# Fecha o arquivo sem salvar
try:
    doc.close(True)
except com.sun.star.util.CloseVetoException:
    pass

#Fecha o OO.org
desktop.terminate()

Referências

http://goldenspud.com/blog/2004/Feb/10#build_and_export
http://udk.openoffice.org/python/python-bridge.html

Elton Luís Minetto

Elton Luís Minetto - UnoChapecó - Universidade Comunitária Regional de Chapecó
http://www.eltonminetto.net