ASP .NET MVC 3 - Gerando PDF (C#)


Neste artigo eu vou mostrar como podemos gerar arquivos PDF usando a library iTextSharp em uma aplicação ASP .NET MVC.

A library iTextSharp é 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

Abra o Visual Web Developer 2010 Express Edition e no menu File->New Project crie um novo projeto do tipo ASP .NET MVC 3 Web Application; informe o nome GerandoPDF e clique em OK;

Selecione o template Internet Application e o View Engine ASPX e clique em OK;

Será exibida na janela Solution Explorer a estrutura do projeto criado conforme a figura abaixo:

Vamos aproveitar a estrutura criada e alterar alguns arquivos para realizar a tarefa proposta.

Vamos também incluir uma referência a library itextSharp em nosso projeto.

Clique no menu Project -> Add Reference e na janela Add Reference selecione a aba Browse e localiza a dll do itextsharp na pasta onde você instalou o arquivo:

Definindo o Model

Vamos criar um novo arquivo chamado PDFResult que herda de ActionResult na pasta Model que irá permitir a geração dos arquivos PDF.

Clique com o botão direito do mouse sobre a pasta Models e selecione Add->Class; A seguir informe o nome PDFResult.cs e clique em OK;

Digite o código abaixo no arquivo criado:

using System.IO;
using System.Web;
using System.Web.Mvc;
using iTextSharp.text;

namespace PdfResult.Models
{
    public class PdfResult : ActionResult
    {
        public override void ExecuteResult(ControllerContext context)
        {
            HtmlToPdfBuilder builder = new HtmlToPdfBuilder(PageSize.LETTER);

            HtmlPdfPage page1 = builder.AddPage();
            page1.AppendHtml("<h1>Super DVD .NET 2012</h1>");
            page1.AppendHtml("<p>A sua porta de entrada na plataforma .NET<br>");
            page1.AppendHtml("Projetos completos abertos para estudo<br>");
            page1.AppendHtml("Livros, Apostilas, Exemplos, Utilitários CA</p>");
            page1.AppendHtml("<table><tr><td><b>Produto</b></td><td><b>Preço</b></td></tr>");
            page1.AppendHtml("<tr><td>SUPER DVD .NET</td><td>R$ 70,00</td></tr></table>");

            byte[] file = builder.RenderPdf();
            byte[] buffer = new byte[4096];

            HttpResponseBase response = context.HttpContext.Response;
            response.ContentType = "application/pdf";
            MemoryStream pdfStream = new MemoryStream(file);

            while (true)
            {
                int read = pdfStream.Read(buffer, 0, buffer.Length);
                if (read == 0)
                    break;
                response.OutputStream.Write(buffer, 0, read);
            }
            response.End();
        }
    }
}

No código acima temos :

O método ExecuteResult onde primeiro estamos criando uma instância da classe HtmlToPdfBuilder. Esta classe foi desenvolvida por Hugo Bonacci e esta sendo usada para criar uma página no arquivo PDF. Convertemos o PDF em um array de bytes para ser alavancado para o navegador; definimos o tamanho do buffer declaramos o tipo de conteúdo do nosso stream e criamos um stream que será enviado a requisição.

Definindo o Controller

Vamos aproveitar a classe HomeController e vamos criar um novo método chamado GetPdf. Essa Action será uma PdfResult. Como nós codificamos a geração do PDF diretamente no ActionResult, tudo o que precisamos fazer é declarar o método.

Vamos aproveitar o arquivo HomeController existente na pasta Controller e incluir o método GetPdf() neste arquivo conforme abaixo:

using System.Web.Mvc;
using Gerando_PDF.Models;

namespace Gerando_PDF.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Gerando PDF com ASP .NET MVC";
            return View();
        }

     
  public PdfResult GetPdf()
        {
            return new PdfResult();
        }


        public ActionResult About()
        {
            return View();
        }
    }
}

O método criado retorna um PDF;

Definindo a View

Com a nossa nova Action declarada, podemos tratar da visualização e para isso vamos simplesmente criar um link para a Action que irá gerar um PDF para nós.

Para definir a visualização vamos aproveitar o arquivo Index.aspx existente na pasta Views->Home e alterar o seu conteúdo conforme abaixo:


<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2><%: ViewBag.Message %></h2>
    <p>
     Clique aqui  <%= Html.ActionLink("Super DVD .NET","GetPdf", "Home") %> para obter o arquivo PDF!
    </p>
</asp:Content>

Estamos usando um ActionLink para criar um link que chama o método GetPdf o qual irá gerar o arquivo PDF e exibir no navegador:

Executando o projeto iremos obter o resultado abaixo onde vemos a imagem exibida na página:

Clicando no link - Super DVD .NET - o arquivo PDF será gerado e exibido conforme figura a seguir:

É claro que você pode digitar na url o comando /Home/GetPdf para obter o mesmo resultado.

Pegue o projeto completo aqui: Gerando_PDF.zip

Gál 5:22 Mas o fruto do Espírito é: o amor, o gozo, a paz, a longanimidade, a benignidade, a bondade, a fidelidade.
Gál 5:23
a mansidão, o domínio próprio; contra estas coisas não há lei.
Gál 5:24
E os que são de Cristo Jesus crucificaram a carne com as suas paixões e concupiscências.

Gál 5:25
Se vivemos pelo Espírito, andemos também pelo Espírito.

Referências:


José Carlos Macoratti