Transcript
  • A PROGRAMAR

    22

    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, especial-mente se conjugado com tecnologia .NET. Mas, se quiser pro-duzir documentos num formato aberto, como o ODF Open Document Format , a documentao existente muito escas-sa 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 fichei-ros. 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 preen-cher documentos atravs de um modelo j existente. O desen-volvimento 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 estru-tura 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 for-ma simples. Comece por criar o seu modelo de documento numa aplicao compatvel, por exemplo, no LibreOffice. Expe-rimente 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 preenchi-mento 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 forma-tao e, bem visvel, o contedo do texto que escreveu no mo-delo. 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 no dever estar compactado;

    2. 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 com-pactao 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 fra-mework .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 fi-cheiro 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 fichei-ro 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 do-cumento, no necessitamos de criar o arquivo ZIP de raiz. Vamos criar um modelo no editor de texto e, programatica-mente, 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:

    a. Criar o documento modelo no LibreOffice

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

    Produzir ficheiros no formato ODF Open Document Format em .NET

    1. Criar o modelo ODT no

    LibreOffice

    2. Descom-pactar o

    ficheiro con-text.xml de dentro do ODT para

    3. Ler o content.xml para uma

    string

    4. Substituir as tags com dados pro-venientes do data source

    5. Guardar o content.xml numa pas-ta tempor-

    ria

    6. Colocar o novo

    content.xml dentro do ZIP e apresent-lo como ODT

  • A PROGRAMAR

    23

    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 quere-mos 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 substitui-o 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.

    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 proce-dimento 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

    b) e efetuar uma string.Replace das tags pelos dados pro-venientes da base de dados:

    c) Guardar o novo ficheiro content.xml numa rea tem-porria:

    c. Gerar o ficheiro ZIP/ODT

    Depois de criado o ficheiro com o novo contedo do do-cumento, necessrio coloc-lo novamente dentro do arqui-vo 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 numri-ca, por exemplo, para que no se substituam sempre que invocado o procedimento:

    PRODUZIR FICHEIROS NO FORMATO ODF OPEN DOCUMENT FORMAT EM .NET

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

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

    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)

    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

    24

    Concluso

    O processo de criao de um documento ODT no com-plexo. No entanto, cri-lo de raiz um trabalho moroso. J existem algumas bibliotecas para o efeito mas, mesmo assim,

    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 mo-delo 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 ODT: http://books.evc-cit.info/odbook/book.html

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

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

    PRODUZIR FICHEIROS NO FORMATO ODF OPEN DOCUMENT FORMAT EM .NET

    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.

    () o programa-dor tem sua dis-

    posio aplicaes Mi-crosoft Office, o seu trabalho est mais faci-litado, especialmente se conjugado com tec-nologia .NET. () se quiser produzir docu-mentos num formato aberto, como o ODF Open Document For-mat , a documentao existente muito es-cassa e as bibliotecas disponveis so quase nulas e muito fracas()


Top Related