associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

PythonUno

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

   1 import uno
   2 import unohelper
   3 import os
   4 
   5 # Abre o OpenOffice.org usando os parametros para que fique ouvindo na porta 2002 por novas
   6 # conexões. O parâmetro accept é usado para que clientes tenham acesso a API do
   7 # OO.org através da rede, seja interna ou internet.
   8 os.system('soffice "-accept=socket,host=localhost,port=2002;urp;"')
   9 
  10 # Retorna o componente context do PyUNO runtime
  11 localContext = uno.getComponentContext()
  12 
  13 # Cria o UnoUrlResolver 
  14 resolver = localContext.ServiceManager.createInstanceWithContext(
  15     'com.sun.star.bridge.UnoUrlResolver', localContext)
  16 
  17 # Conecta ao OO.org em execução
  18 ctx = resolver.resolve(
  19     'uno:socket,host=localhost,port=2002;'
  20     'urp;StarOffice.ComponentContext')
  21 smgr = ctx.ServiceManager
  22 
  23 # Retorna o objeto central do desktop
  24 desktop = smgr.createInstanceWithContext(
  25     'com.sun.star.frame.Desktop', ctx)
  26 
  27 # Carrega o documento
  28 cwd = os.getcwd()
  29 path = os.path.join(cwd, 'modelo.sxw')
  30 url = unohelper.systemPathToFileUrl(path)
  31 doc = desktop.loadComponentFromURL(url, '_blank', 0, ())
  32 
  33 # Procura e substituicao
  34 # Lista dos dados a alterar
  35 # No arquivo modelo.sxw existe dois campos chamados {{nome}} e 
  36 # {{sobrenome}}. Estes campos serão substituídos pelo conteúdo das
  37 # tuplas abaixo
  38 
  39 L = [('{{nome}}', 'Elton', ),
  40      ('{{sobrenome}}', 'Minetto', ),
  41      ]
  42 # busca e troca
  43 for search, replace in L:
  44     rd = doc.createReplaceDescriptor()
  45     rd.setSearchString(search)
  46     rd.setReplaceString(replace)
  47     doc.replaceAll(rd)
  48 
  49 # Imprime
  50 uno.invoke(doc, "print", ((), ))
  51 # O arquivo não pode ser fechado enquando a impressão não finalizar
  52 # Testa para verificar se a impressão acabou
  53 res = doc.getPrinter()
  54 while res[4].Value == 1:
  55         res = doc.getPrinter()
  56         print "Esperando a impressão"
  57 
  58 # Fecha o arquivo sem salvar
  59 try:
  60     doc.close(True)
  61 except com.sun.star.util.CloseVetoException:
  62     pass
  63 
  64 #Fecha o OO.org
  65 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


EltonLuisMinetto