Você está na página 1de 3

A PROGRAMAR

Produzir ficheiros no formato ODF Open Document Format em .NET


2.

Introduo
Um dos desafios com que os programadores se deparam
com alguma frequncia a criao de documentos de forma
automtica, de modo a optimizar e a reduzir o trabalho manual
em aplicaes de produtividade.
Quando o programador tem sua disposio aplicaes
Microsoft Office, o seu trabalho est mais facilitado, especialmente se conjugado com tecnologia .NET. Mas, se quiser produzir documentos num formato aberto, como o ODF Open
Document Format , a documentao existente muito escassa e as bibliotecas disponveis so quase nulas e muito fracas.
Foi a necessidade de produzir documentos de texto ODF
(ODT) em grande nmero, a partir de informao em bases de
dados, que me levou a conhecer melhor este formato de ficheiros. A partir do conhecimento do formato ODF, foi possvel
desenvolver um mecanismo simples para o preenchimento de
modelos de documentos de texto.
O intuito deste artigo demonstrar como podemos preencher documentos atravs de um modelo j existente. O desenvolvimento foi feito em ASP.NET, mas o conceito pode ser
extrapolado para qualquer linguagem de programao.
O Formato ODT (ODF para texto)
Para melhor entendermos este processo, necessitamos
compreender a estrutura de ficheiro do documento ODT. Este
documento no mais do que um arquivo ZIP com uma estrutura definida, vrias pastas e ficheiros, a maior parte em XML.
Mais precisamente, trata-se de um ficheiro JAR (Java Archive).
Podemos explorar o contedo de um ficheiro ODT de uma forma simples. Comece por criar o seu modelo de documento
numa aplicao compatvel, por exemplo, no LibreOffice. Experimente fazer o unZIP desse ODT, alterando previamente a
extenso ODT para ZIP, se necessrio. Repare que existem
muitos ficheiros dentro do ZIP. No entanto, para o preenchimento dos modelos, vamos necessitar de utilizar apenas um
desses ficheiros, que poder explorar num editor de texto do
tipo notepad, o ficheiro content.xml.
Este ficheiro contm muitas meta tags, definies de formatao e, bem visvel, o contedo do texto que escreveu no modelo. Facilmente percebemos que, ao alterar o contedo do
content.xml, estamos a alterar o texto do documento ODT. S
teremos que colocar o ficheiro dentro do ZIP, novamente.
H, no entanto, dois critrios a ter em conta, na construo do
ficheiro ZIP:
1.

O ficheiro mimetype dever ser o primeiro ficheiro


do ndice do ZIP.

Com estas duas condies, o ZIP com extenso ODT


um ficheiro vlido.
Requisitos
Em .NET, este processo requer uma biblioteca de compactao ZIP. Neste caso, utilizei a biblioteca DotNetZip
Ionic.Zip.dll para efetuar a compresso do ficheiro ODT. Os
restantes componentes so os nativos de uma framework .NET 3.5 ou superior.
No caso prtico que utilizei, recorri a um HTTP handler
para invocar todo o processo at efetuar o download do ficheiro ODT final e o mostrar no browser. No entanto, para
no estender demasiado o artigo, podemos omitir esta parte
do cdigo e mostrar apenas o processo de criao do ficheiro ZIP. O ficheiro pode ser criado sem um handler, ou at
mesmo em VB/C#, numa aplicao de consola, por exemplo.
Processos
Para este caso prtico de alterao do contedo do documento, no necessitamos de criar o arquivo ZIP de raiz.
Vamos criar um modelo no editor de texto e, programaticamente, apenas necessitamos de recolocar o ficheiro
content.xml dentro do arquivo ZIP.
Sabendo agora que um documento ODT um ZIP com
vrios ficheiros, podemos definir todo o processo do seguinte
modo:
1. Criar o
modelo
ODT no
LibreOffice

2. Descompactar o
ficheiro context.xml de
dentro do
ODT para

3. Ler o
content.xml
para uma
string

6. Colocar o

5. Guardar o
content.xml
numa pasta temporria

4. Substituir
as tags com
dados provenientes
do data
source

novo
content.xml
dentro do ZIP
e apresentlo como ODT

a.

Criar o documento modelo no LibreOffice

O modelo dever ser criado num editor totalmente compatvel com o formato ODF. um processo simples, sem

O ficheiro mimetype no dever estar compactado;

22

A PROGRAMAR
PRODUZIR FICHEIROS NO FORMATO ODF OPEN DOCUMENT FORMAT EM .NET
recurso a qualquer conhecimento tcnico, onde poderemos
formatar o documento a gosto. Deveremos colocar tags nas
partes que pretendemos que sejam substitudas por campos
da base de dados (exemplo: [lb_nome_proprio], onde queremos que aparea o nome prprio constante na base de dados).
Chamemos a este ficheiro, modelo.odt.
De seguida, necessrio descompactar o ficheiro
content.xml de dentro do modelo ODT previamente criado.
Este ficheiro vai ser lido pela nossa aplicao para a substituio das tags pelos valores corretos.
Tanto o modelo.odt como o ficheiro content.xml vo ser
acedidos pela aplicao para gerar o novo documento, pelo
que devero estar acessveis no .NET.

fileContents = fileContents.Replace("[tag_nome]", r
(4).ToString)
c)

Guardar o novo ficheiro content.xml numa rea temporria:

Dim content_xml_generated_folder As String =


System.Web.HttpContext.Current.Server.MapPath
("modelos\tmp\")
Dim content_xml_generated_file As String =
content_xml_generated_folder & "content.xml"
My.Computer.FileSystem.WriteAllText
(content_xml_generated_file, fileContents, False)
c.

Gerar o ficheiro ZIP/ODT

Depois de criado o ficheiro com o novo contedo do documento, necessrio coloc-lo novamente dentro do arquivo ZIP com extenso ODT. Vamos clonar o modelo.odt,
carregando-o em memria, substituir pelo novo content.xml
e gravar o modelo com outro nome.
Exemplifica-se com um procedimento bsico que dever
ser personalizado para criar ficheiros com sequncia numrica, por exemplo, para que no se substituam sempre que
invocado o procedimento:

b.

Ler e processar o content.xml

A partir desta etapa, vamos meter as mos na massa e


comear a programar. A partir do .NET, vamos criar um procedimento para ler o content.xml para uma string e alter-la ao
nosso gosto, de modo a preencher o documento final com os
dados necessrios.
a)

Criar uma funo para ler o ficheiro content.xml

Dim content_xml As String =


System.Web.HttpContext.Current.Server.MapPath
("modelos\content.xml")
Dim fileContents As String =
My.Computer.FileSystem.ReadAllText(content_xml)
b)

e efetuar uma string.Replace das tags pelos dados provenientes da base de dados:

23

Private Sub atualizar_odt(ByVal content_xml_file _


As String, ByVal modelo_odt_file As String)
Dim tmp_folder As String = _
System.Web.HttpContext.Current.Server.MapPath _
("modelos\tmp\")
Dim modelo_file_generated As String = _
tmp_folder & ""
Using zip As ZipFile = Ionic.Zip.ZipFile.Read _
(modelo_odt_file)
'Cria um novo objeto do tipo ZipFile, cpia
'do modelo.odt'
'Atualiza o novo ficheiro content.xml no
'zip modelo.odt'
.zip.UpdateItem(content_xml_file, "")
Dim filePerm As New FileIOPermission _
(PermissionState.Unrestricted, tmp_folder)
.filePerm.Assert()
'Stream do contedo do zip para memria'
Dim msZippedContent As New MemoryStream
.zip.UseZip64WhenSaving = Zip64Option.Never
.zip.TempFileFolder = tmp_folder
'Escreve o stram de memria em filesystem'
.zip.Save(msZippedContent)
'Mtodo para fazer download automtico,
'opcional'
.HttpContext.Current.Response.ClearContent()
.HttpContext.Current.Response.Clear()
.HttpContext.Current.Response.ContentType = _
"application/zip"
.System.Web.HttpContext.Current.Response.AddHeader_
("Content-Disposition", "attachment; _
filename=NOVO_DOC.odt")
.msZippedContent.WriteTo _
(HttpContext.Current.Response.OutputStream)
.HttpContext.Current.Response.End()
.HttpContext.Current.ApplicationInstance. _
CompleteRequest()
End Using
End Sub

A PROGRAMAR
PRODUZIR FICHEIROS NO FORMATO ODF OPEN DOCUMENT FORMAT EM .NET
Concluso
O processo de criao de um documento ODT no complexo. No entanto, cri-lo de raiz um trabalho moroso. J
existem algumas bibliotecas para o efeito mas, mesmo assim,

() o programador tem sua disposio aplicaes Microsoft Office, o seu


trabalho est mais facilitado,
especialmente
se conjugado com tecnologia .NET. () se
quiser produzir documentos num formato
aberto, como o ODF
Open Document Format , a documentao
existente muito escassa e as bibliotecas
disponveis so quase
nulas e muito fracas
()

gerar todo o documento programaticamente continua a ser


demorado e exige muito cdigo.
Para o preenchimento de documentos com base num
modelo, encontrei esta soluo prtica. A criao de um modelo no LibreOffice extremamente rpida. A alterao do
modelo simples. Se criarmos um procedimento comum na
nossa biblioteca de cdigo para invocar a criao do ODT
com base num modelo, podemos criar relatrios, formulrios,
cartas, etc., com extrema facilidade e muito rapidamente.
Bibliografia recomendada
Estrutura do documento
odbook/book.html

ODT:

http://books.evc-cit.info/

O ficheiro JAR: http://en.wikipedia.org/wiki/JAR_(file_format)


DotNetZip Library: http://dotnetzip.codeplex.com/

AUTOR
Escrito por Ricardo Trindade
actualmente o responsvel pela rea informtica dos Servios Sociais da Cmara Municipal de Lisboa onde efectua, desde
administrao de sistemas, at programao em .NET. Est tambm ligado ao projecto N-Ideias na rea da consultoria,
webdesign e software, trabalhando essencialmente com BD's Oracle, PostgreSQL e SQL Server.

24

Você também pode gostar