#pragma section-numbers off = Automatização de tarefas do OpenOffice usando o Python = O projeto OpenOffice 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. 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 !OpenOffice 1.1RC4 o pyUNO é incluído por padrão nas instalações do OO.org. No diretório program do OO, existe uma versão do python(2.2.2) com acesso ao pyUNO. Neste exemplo é demonstrado um script que executa o OO, abre um arquivo de texto com campos específicos, faz a mesclagem (substitui os campos por valores), imprime e fecha o arquivo. = Código = {{{ #!python 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 parâmetro accept é usado para que clientes tenham acesso a API do # OO.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", ((), )) # O arquivo não pode ser fechado enquando a impressão não finalizar # Testa para verificar se a impressão acabou res = doc.getPrinter() while res[4].Value == 1: res = doc.getPrinter() print "Esperando a impressão" # Fecha o arquivo sem salvar try: doc.close(True) except com.sun.star.util.CloseVetoException: pass #Fecha o OO.org desktop.terminate() }}} Este exemplo ilustra algumas possibilidades. Podemos, desta forma ler dados de uma base de dados e mesclar os campos em um documento modelo, da mesma forma que é feito no Microsoft Office, mas com a vantagem de usar ferramentas livres e poder expandir a aplicação como nossa imaginação permitir. = Links = * http://goldenspud.com/blog/2004/Feb/10#build_and_export * http://udk.openoffice.org/python/python-bridge.html [[http://www.openoffice.org/files/documents/73/1509/python_uno_bridge.htm|Versão em espanhol do link acima]] ---- EltonLuisMinetto