Incorporar o LibreOffice em um Form é uma alternativa interessante no desenvolvimento de sistemas onde é necessário manipular documentos no padrão ODF. É possível fazer isso em várias linguagens de programação e, dependendo da complexidade do código, o resultado pode ser muito bom.
Verificando a configuração do LibreOffice
O componente EmbeddedOpenOffice depende do arquivo so_activex.dll no diretório indicado em EmbeddedOpenOffice1.OpenOfficePath (normalmente, C:Arquivos de programasLibreOffice 3.6program).
Esse arquivo só é instalado através da instalação personalizada do LibreOffice (recomendamos a versão 3.6.4):
Configuração do controle EmbeddedOpenOffice
EmbeddedOpenOfficenet.dll
Por fim, o componente estará disponível na Toolbox de controles:
EmbeddedOpenOffice1.OpenOfficePath = “C:Arquivos de programasLibreOffice 3.6program”
EmbeddedOpenOffice1.TempFolder = “c:TEMP”
‘definição do caminho do arquivo e da abertura como somente leitura (true) ou não (false).
EmbeddedOpenOffice1.LoadDocument(“C:teste2.odt”, false)
Obtendo o controle do documento via código
O controle EmbeddedOpenOffice funciona apenas como um frame de exibição de uma janela componente do LibreOffice. Ou seja, o controle não fornece métodos e propriedades para o acesso ao conteúdo do documento. É, de fato, uma lacuna no desenvolvimento do controle.
Há no entanto, um meio poderoso para obtermos o controle do documento. Fazemos isso através da conexão VB.NET com a instância local do LibreOffice. A partir da conexão (mais especificamente a partir do objeto objDesktop), é possível descobrir o frame do documento através do seu título:
Private Sub listarFrames_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click
‘**************************
‘* Procedimento para a prova de conceito de uso do controle EmpeddedOpenOffice
‘* Gustavo Buzzatti Pacheco – gbpacheco@prodesk.com.br
‘* Projeto: ODF
‘* 3 de janeiro de 2013
‘************************** ‘
Dim objServiceManager As Object
Dim objCoreReflection As Object
Dim objDesktop As Object
Dim vFrames As Object ‘coleção dos frames
Dim objModel As Object ‘modelo do frame
Dim i As Integer ‘índice dos frames
Dim s As String ‘string com o título e o caminho do arquivo
‘Criação da conexão com a instância local do LibreOffice
objServiceManager = CreateObject(“com.sun.star.ServiceManager”)
objCoreReflection = objServiceManager.createInstance(“com.sun.star.reflection.CoreReflection”)
objDesktop = objServiceManager.createInstance(“com.sun.star.frame.Desktop”)
REM queryFrames(4) da interface XFrames busca todos os frames filhos do desktop
s = “”
vFrames = objDesktop.getFrames().queryFrames(4) ‘com.sun.star.frame.FrameSearchFlag.CHILDREN – http://www.openoffice.org/api/docs/common/ref/com/sun/star/frame/FrameSearchFlag.html#CHILDREN
For i = LBound(vFrames) To UBound(vFrames)
objModel = vFrames(i).getController().getModel()
s = s & vFrames(i).Title & ” ” & objModel.getURL() & ” ” & Chr(10) ‘coloca o título e a URL na variável s
Next (i)
MsgBox(s, 0, “Frame Titles”) ‘ mostra o conteúdo da variável s
End Sub
Atenção para os detalhes…
Caso o código com o componente EmbeddedOpenOffice seja executado sem que o LibreOffice tenha sido inicializado antes (via manual ou via quickstart), é possível que você obtenha o seguinte erro:
https://bugs.freedesktop.org/show_bug.cgi?id=57203
Como contingência (e, também como forma de melhorar o desempenho da inicialização do LibreOffice embutido no código VB.NET), podemos executar o quickstart do LibreOffice via código antes da inicialização do controle EmbeddedOpenOffice em:
C:Arquivos de programasLibreOffice 3.6programquickstart.exe
O quickstart é um pequeno aplicativo que roda no IconTray do Windows com o objetivo de abrir rapidamente documentos no LibreOffice. Ou seja, uma pré-execução do aplicativo.
Executar o quickstart (mesmo que seja via código) melhorará o desempenho do seu código e evitará a mensagem de erro em versões anteriores à 3.6.5.
Gostei bastante do artigo. Tem alguma ideia de como poderia ser feito o libre office embarcado em um form delphi?
Olá! Nunca tentei fazer algo parecido em Delphi (ter o LibreOffice embarcado), no entanto, o uso da API com Delphi é muito fácil. Veja exemplos de uso neste post do meu blog:
http://www.opendocument.com.br/gbpacheco/searchandreplaceinwriterwithdelphi
Note que o link atualizado para o Delphi OOo é
http://sourceforge.net/projects/ooomacros/files/Delphi%20OOo/
Ok, muito obrigado.
Teria como integrar o libreoffice com uma aplicação .net para que seja possível editar, criar, imprimir, …, relatórios?
Sim, para fazer isso você deve fazer a conexão do seu código .NET com o LibreOffice local e controlá-lo via código para preencher os dados em um documento. A forma de conexão é ilustrada na seção “Obtendo o controle do documento via código” do post acima. Mais detalhes você pode encontrar no Developer’s Guide do OpenOffice, cuja maior parte do conteúdo serve também para o LibreOffice.
http://wiki.openoffice.org/w/images/d/d9/DevelopersGuide_OOo3.1.0.pdf
Como integrar no Delphi, desejo que dentro de um form eu possa abrir o writer e depois salvar esse conteúdo em um campo do BD Oracle