terça-feira, 19 de outubro de 2010

Python para macros do OpenOffice Parte 2

Como prometido no último post, vamos falar sobre python em macros do OpenOffice.

Vamos começar explicando como fazer uma macro que fique vinculada a um documento específico.

O exemplo que faremos colocará algum texto num documento do writer.

Vamos começar?

Para tanto precisamos primeiro entender um pouco do formato odf: os arquivos odf são literalmente um pacote zip contendo arquivos xml de configuração e de conteúdo.

Para acrescentarmos uma macro python a um arquivo odt, precisamos então alterar esta estrutura, pois o OpenOffice não oferece edição nativa das macros python.

Comece criando um arquivo odt vazio.

Em seguida, descompacte este arquivo com sua ferramenta preferida e dê uma olhada na estrutura de arquivos.

Nosso script python ficará na pasta python dentro da pasta Scripts, e como você deve ter reparado, elas não existe aí.

Crie então um diretório chamado Scripts e dentro dele outro chamado python. Tenha atenção à capitalização dos nomes destes diretórios.

Agora, detro do diretório python, crie um arquivo chamado macro.py. Será neste arquivo que colocaremos o script.

Agora está quase pronto. Volte ao diretório raiz do documento e entre em META-INF. Ali há um arquivo chamado manifest.xml.

A este arquivo devem ser acrescentadas as seguintes linhas em negrito:

<?xml version="1.0" encoding="UTF-8"?>
<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0">
<manifest:file-entry manifest:media-type="application/vnd.oasis.opendocument.text" manifest:version="1.2" manifest:full-path="/"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/statusbar/"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/accelerator/current.xml"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/accelerator/"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/floater/"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/popupmenu/"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/progressbar/"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/menubar/"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/toolbar/"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/images/Bitmaps/"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Configurations2/images/"/>
<manifest:file-entry manifest:media-type="application/vnd.sun.xml.ui.configuration" manifest:full-path="Configurations2/"/>
<manifest:file-entry manifest:media-type="text/xml" manifest:full-path="Dialogs/dialog-lc.xml"/>
<manifest:file-entry manifest:media-type="text/xml" manifest:full-path="Dialogs/Standard/dialog-lb.xml"/>
<manifest:file-entry manifest:media-type="text/xml" manifest:full-path="Dialogs/Standard/Dialog1.xml"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Dialogs/Standard/"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Dialogs/"/>
<manifest:file-entry manifest:media-type="text/xml" manifest:full-path="content.xml"/>
<manifest:file-entry manifest:media-type="application/rdf+xml" manifest:full-path="manifest.rdf"/>
<manifest:file-entry manifest:media-type="text/xml" manifest:full-path="styles.xml"/>
<manifest:file-entry manifest:media-type="text/xml" manifest:full-path="meta.xml"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Thumbnails/thumbnail.png"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Thumbnails/"/>
<manifest:file-entry manifest:media-type="text/xml" manifest:full-path="settings.xml"/> 
 <manifest:file-entry manifest:media-type="" manifest:full-path="Scripts/python/macro.py"/>
<manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/python/"/>
<manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/"/>

</manifest:manifest>
O arquivo manifest.xml é muito importante pois guarda dados sobre a estrutura do arquivo, indicando para o programa quais os recursos que o arquivo disponibiliza.

Vamos então à macro própriamente dita.

Abra seu arquivo macro.py no seu editor predileto e escreva o seguinte código:

# -*- coding:utf8 -*-

#importa a biblioteca UNO do OpenOffice
import uno

def HelloWorld():
    #cria um objeto documento a partir do contexto do documento local
    documento = XSCRIPTCONTEXT.getDocument()
    texto = documento.getText()
    dadosTexto = texto.getEnd()
    dadosTexto.CharHeight = 16.0
    dadosTexto.CharPosture = uno.getConstantByName(
                                        "com.sun.star.awt.FontSlant.ITALIC")
    dadosTexto.setString('Olá esta é minha primeira macro com python!')
    return None

Após salvar o arquivo, verifique se não há arquivos ocultos ou de backup nas pastas que contenham arquivos que você modificou, volte para a pasta onde se encontra o diretório META-INF e selecione todos os arquivos e pastas.

Empacote tudo em um arquivo zip e renomeie para teste.odt, por exemplo.

É importante salientar que os arquivos não devem ser colocados em uma só pasta para empacotar, e o método de empacotamento TEM QUE SER ZIP.

Abra no OpenOffice/BrOffice o arquivo odt gerado.

Você pode executar sua macro abrinco o menu Ferramentas >> Macros >> Executar macros...

Isto deve abrir um diálogo para escolher a macro que será executada.
Clique então sobre macro e depois HelloWorld, então Executar e pronto! Sua macro irá executar perfeitamente!

Assim está pronta sua primeira macro em python!

Abaixo você encontrará links para mais informações a respeito!

Um grande abraço e até a próxima, com mais python no OpenOffice!

Gostou do Post?

Deixe seu comentário!


Mais informações sobre macros em Python para o OpenOffice

http://wiki.services.openoffice.org/wiki/Python
http://wiki.services.openoffice.org/wiki/Python_as_a_macro_language

***
Clique aqui para ler a última parte
***

5 comentários:

  1. Olá,

    muito interessante a dica. Estou me iniciando em Python e OpenOffice e tenho uma dúvida básica.

    Como saber quais as funções um objeto suporta? Algum manual?

    Obrigado.

    ResponderExcluir
  2. Olá Escafandrista! Na realidade é muito simples. Existe em python o comando dir que lista os métodos de um obeto, então se vc tem um objeto lista x e usar dir(x) você terá uma lista dos métodos que os obetos lista suportam.

    Para o caso de objetos da biblioteca padrão, você pode verificar a documentação oficial em http://python.org já se for objeto de uma biblioteca específica, vai precisar acessar a documentação dela.

    Espero ter ajudado! Outras dúvidas, entre é só perguntar!

    Abraço!

    ResponderExcluir
  3. Oi Julio, tudo bem?

    estou começando a fazer essas macros agora também e estou uma dúvida:
    - é possível eu usar funções do SciPy ou NumPy (por exemplo) nos códigos a macro?

    Se sim, como fazer essa importação desses módulos?

    Obrigado!

    ResponderExcluir
    Respostas
    1. Olá lcs!

      Nunca usei bubliotecas que não sejam as padrão do python...
      Experimente importar estes módulos normalmente! Se estiverem instaladas no sistema, creio que vá funcionar sim!

      Fique à vontade pra comentar aqui os resultados que ficarei feliz em ajudar mais!

      Abraço!

      Excluir