Renderizando uma View em PDF


É muito comum precisarmos gerar PDFs em nossas aplicações, e muitas vezes, estes PDFs são referentes à conteúdos baseados em HTML. Há uma porção de componentes que são capazes de receber uma string como conteúdo HTML e gerar o respectivo PDF. Entre estes componentes, temos o Evo PDF, que possui uma API de fácil utilização. Para fazer uso do mesmo, basta utilizar o Nuget para instalar na aplicação que deseja fazer uso:

PM> Install-Package EvoPDF

O conteúdo a ser extraído está acessível através de uma URL, e utilizando a classe WebClient ou até mesmo o ASP.NET Web API (se quisermos um controle mais refinado), é possível realizar o download e na sequência, encaminhar o resultado para este componente gerar o PDF. Para o nosso exemplo, suponhamos que queremos renderizar o conteúdo de uma view (MVC/Razor) em formato PDF, e isso irá nos obrigar a criar um código que dado o caminho até a view, ele é capaz de criar o contexto necessário, indicando inclusive as informações necessárias (dados) para que ela seja exibida, e o ASP.NET faz o trabalho de executar e disponibilizar em um objeto do tipo StringWriter, todo o HTML gerado.

protected string RenderViewToString(string viewPath)
{
    using (var writer = new StringWriter())
    {
        var controllerContext = this.ControllerContext;

        var viewContext =
            new ViewContext(
                controllerContext,
                new RazorView(controllerContext, viewPath, null, false, null),
                new ViewDataDictionary(),
                new TempDataDictionary(),
                writer);

        viewContext.View.Render(viewContext, writer);
        return writer.ToString();
    }
}

Depois do conteúdo HTML já gerado, vamos recorrer ao método GetPdfBytesFromHtmlString da classe PdfConverter (parte do componente Evo PDF), que dado o conteúdo HTML, retorna um array de bytes com todo o documento PDF já gerado. Note que além do HTML, este método também recebe um endereço HTTP(s), que é a URL base para que seja possível resolver as imagens, arquivos CSS, JavaScripts, etc. E, por fim, submetemos o resultado deste método para o método File exposto pela classe Controller, indicando que trata-se de um arquivo do tipo PDF. A marca d’água é por conta de que eu estou utilizando a versão de avaliação deste componente.

public class TesteController : Controller
{
    public ActionResult Index()
    {
        return File(
            new PdfConverter().GetPdfBytesFromHtmlString(
                RenderViewToString(“~/Views/Teste/Conteudo.cshtml”), “http://localhost:1891/”),
            “application/pdf”);
    }

    [HttpGet]
    public ActionResult Conteudo()
    {
        return View();
    }
}

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s