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