ASP .NET - Exportando um GridView para PDF


Existem muitas opções e maneiras de exportar uma página para o formato PDF. Basta fazer uma busca no Google que você vai encontrar centenas.

Neste artigo eu vou apresentar como podemos exportar o conteúdo de um controle GridView em uma página ASP .NET para o formato PDF usando a biblioteca  iTextSharp que é gratuita e pode ser obtida no seguinte endereço: http://sourceforge.net/projects/itextsharp/.

Então primeiro faça o download da library para poder referenciá-la em seu projeto web. Eu fiz o download da library e a descompactei na pasta: C:\Program Files (x86)\itextsharp-all-5.1.2\itextsharp-dll-core-5.1.2

Para demonstrar como usar este recurso eu vou usar o Visual Web Developer 2010 Express Edition e criar um novo web site (New Web Site) usando o template ASP .NET Web Site chamado Grid_Pdf usando a linguagem Visual Basic.(poderíamos ter usado a linguagem C#)

Abra o Visual Web Developer e no menu File -> New Web Site (você sabe a diferença entre New Project e New Web Site ?) ;

A seguir selecione o template ASP .NET Web Site e informe o nome Grid_Pdf e clique em OK;

Usei o template ASP .NET Web Site para aproveitar a estrutura que já é criada neste projeto. Eu vou fazer pequenos ajustes na Master Page e excluir a pasta Account e Scripts pois não iremos usá-las neste artigo.

Abra a página Default.aspx e inclua nela um controle GridView com o ID igual a gdvDados e um controle Button com ID igual a btnExportarPDF conforme o leiaute da figura abaixo:

Vamos preencher os GridView com dados de uma fonte de dados selecionando a opção <New data source>;

Veja que temos muitas opções e você pode usar qualquer uma que achar mais conveniente. Eu vou usar a opção SQL DataBase, aceitar o nome padrão e clicar em OK;

A seguir selecionei uma conexão usando o banco de dados Northwind.mdf e clicando em Next>;

A seguir clique novamente em Next> e escolha a tabela Customers selecionando alguns campos conforme a figura a seguir:

Clique em Next> e em Finish para encerrar esta etapa onde teremos uma fonte de dados vinculada ao nosso controle GridView.

Exportando o GridView para PDF - I

Vamos agora incluir uma referência a biblioteca iTextSharp  em nosso projeto clicando com o botão direito sobre o nome do projeto e selecionando a opção Add Reference;

A seguir na janela Add Reference, clique na guia Browse e selecione a biblioteca itextsharp.dll do local onde você a instalou;

Feito isso vamos selecione a página Default.aspx e clique duas vezes no botão de comando para abrir a janela de código no arquivo Default.aspx.vb:

Inclua no início do arquivo as seguintes declarações:

Imports System.IO

Imports iTextSharp.text

Imports iTextSharp.text.html.simpleparser

Imports iTextSharp.text.pdf

A seguir defina o código abaixo no evento Click do botão de comando - Gerar PDF:

 Protected Sub btnExportarPDF_Click(sender As Object, e As System.EventArgs) Handles btnExportarPDF.Click

        Response.ContentType = "application/pdf"
        Response.AddHeader("content-disposition", "attachment;filename=Macoratti_Grid_Pdf.pdf")
        Response.Cache.SetCacheability(HttpCacheability.NoCache)
        Dim sw As New StringWriter()
        Dim hw As New HtmlTextWriter(sw)
        gdvDados.AllowPaging = False
        gdvDados.DataBind()
        gdvDados.RenderControl(hw)
        Dim sr As New StringReader(sw.ToString())
        Dim pdfDoc As New Document(PageSize.A4, 10.0F, 10.0F, 10.0F, 0.0F)
        Dim htmlparser As New HTMLWorker(pdfDoc)
        PdfWriter.GetInstance(pdfDoc, Response.OutputStream)
        pdfDoc.Open()
        htmlparser.Parse(sr)
        pdfDoc.Close()
        Response.Write(pdfDoc)
        Response.End()

    End Sub

O código acima irá gerar o arquivo Macoratti_Grid_Pdf.pdf com o conteúdo do controle GridView.

Para encerrar e podermos executar o projeto sem erros temos que incluir o seguinte código no arquivo code-behind Default.aspx.vb

Public Overrides Sub VerifyRenderingInServerForm(control As Control)
End
Sub

Mas por quê ????

A ASP.NET chama o evento VerifyRenderingInServerForm para garantir que cada controle de servidor único está sendo processado dentro de uma tag <form runat="server">.  O que faz sentido para uma página web. Mas não faz sentido para um arquivo PDF. Uma vez que queremos enviar o conteúdo Gridview para o cliente e não a tag Form. Dessa forma o GridView é processado antes de ser exportado.

Se você não fizer isso vai obter o erro: "....Control of type 'GridView' must be placed inside a form tag with runat=server...."

Executando o web site e clicando no botão de comando iremos obter:

Abrindo o arquivo PDF gerado teremos:

Exportando o GridView para PDF - II

Vamos agora mostrar outra opção onde escrevemos um parágrafo no documento PDF.

Inclua um novo botão de comando no formulário web com id igual btnGerarPDF2 e texto : Gerar PDF - outra opção;

A seguir no evento Click deste botão inclua o código abaixo:

 Protected Sub btnGerarPDF2_Click(sender As Object, e As System.EventArgs) Handles btnGerarPDF2.Click
        'No codigo eu a criei de um novo HtmlForm e adicionei o controle gridview 
        'a ele, então criei uma instância das classe  StringWriter e HtmlTextWriter 
        'para escrever strings e a seguir  renderizei o form criado.
        Dim form As New HtmlForm()
        form.Controls.Add(gdvDados)
        Dim sw As New StringWriter()
        Dim hTextWriter As New HtmlTextWriter(sw)
        form.Controls(0).RenderControl(hTextWriter)
        Dim html As String = sw.ToString()
        'cria uma instãncia do documento pdf
        Dim Doc As New Document()
        Dim sr As New StringReader(sw.ToString())
        Dim htmlparser As New HTMLWorker(Doc)
        'se quiser salvar o arquivo pdf na raiz da aplicação use esta linha de codigo
        'PdfWriter.GetInstance(Doc, new FileStream(Request.PhysicalApplicationPath + "\\Macoratti.pdf", FileMode.Create));
        'salvando o pdf na área de trabalho do usuário
        PdfWriter.GetInstance(Doc, New FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\Macoratti.pdf", FileMode.Create))
        Doc.Open()
        'definindo um paragrafo para servir como cabeçalho
        Dim texto1 As New Chunk("Exportando GridView para PDF usando iTextSharp  " & vbLf, FontFactory.GetFont("Verdana", 20))
        Dim p As New Paragraph()
        p.Alignment = Element.ALIGN_CENTER
        p.Add(texto1)
        'incluindo um novo texto ao parágrafo
        Dim chunk1 As New Chunk("Macoratti.net , http://www.macoratti.net " & vbLf, FontFactory.GetFont("Verdana", 15))
        Dim p1 As New Paragraph()
        p1.Alignment = Element.ALIGN_RIGHT
        p1.Add(chunk1)
        'adicionando o parágrafo ao documento
        Doc.Add(p)
        Doc.Add(p1)
        'gerando o pdf
        PdfWriter.GetInstance(Doc, Response.OutputStream)
        Doc.Open()
        htmlparser.Parse(sr)
        'fecha o arquivo e prepara para exibir
        Doc.Close()
        Dim Path As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\Macoratti.pdf"
        exibirPDF(Path)
    End Sub

A rotina exibirPDF() recebe o caminho e nome do arquivo PDF gerado e exibe-o. O seu código é dado a seguir:

  Private Sub exibirPDF(ByVal caminho As String)
        Response.ClearContent()
        Response.ClearHeaders()
        Response.ContentType = "application/pdf"
        Response.AddHeader("Content-Disposition", "attachment; filename=" & caminho)
        Response.TransmitFile(caminho)
        Response.End()
        Response.Flush()
        Response.Clear()
    End Sub

Executando o web site iremos obter o arquivo PDF gerado com o parágrafo que escrevemos no arquivo:

Usar a biblioteca iTextSharp para gerar PDF é muito simples.

Pegue o projeto completo aqui: Grid_Pdf.zip

"Pensai nas coisas que são de cima, e não nas que são da terra; Porque já estais mortos, e a vossa vida esta escondida com Cristo em Deus." Colossenses 3:2-3

Referências:


José Carlos Macoratti