ASP .NET Core MVC - Gerando arquivos PDF

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

Para gerar arquivos PDF na ASP .NET Core temos que apelar para plugins de terceiros e neste artigo eu vou usar o biblioteca Rotativa.AspNetCore para gerar PDFs a partir da Views.

Essa ferramenta foi criada pelo italiano Giorgio Bozio, e a história você pode conferir neste link: http://letsfollowtheyellowbrickroad.blogspot.com.br/.

Para fazer esse trabalho podemos usar na linha de comando as ferramentas : wkhtmltopdf  e wkhtmltoimage  que são open-source. (veja o link: https://wkhtmltopdf.org/ )

Para usar na ASP .NET Core MVC vamos instalar o pacote Rotativa.AspNetCore em nosso projeto via Nuget.

A base de funcionamento deste plugin esta baseada no wkhtmltopdf que vai converter o HTML renderizado para PDF usando o motor WebKit, conforme explica o seu autor.

Então, si embora pro exemplo....

Recursos usados:

Criando o projeto no VS 2017

Abra o VS 2017 Community e crie um novo projeto ASP .NET Core usando o template Web Application(Model-View-Controller).

  • Create New Project;
  • Visual C# -> Web -> ASP .NET Core Web Application;
  • Informe o nome AspCore_PDF
  • Selecione o template Web Application(Model-View-Controller) , marque ASP .NET Core 2.0;

Após criar o projeto já podemos incluir a referência à biblioteca Rotativa.AspNetCore.

Incluindo o pacote Rotativa.AspNetCore

No menu Tools -> Nuget Package Manager clique em Manage Nuget Packages for solution;

Localize o pacote Rotativa.AspNetCore e instale no projeto clicando em Install:

Criando a pasta Rotativa no projeto

Vamos criar uma pasta chamada Rotativa no interior da pasta wwwroot.

A seguir nesta pasta vamos copiar os seguinte arquivos: help-wkhtmltoimage.txt, help-whhtmltopdf.txt, whhtmltopdf.exe, whhtmltoimage.exe

Alterando o arquivo de leiaute

Vamos agora abrir o arquivo _Layout.cshml na pasta /Views/Shared e incluir o código em azul mostrado abaixo substituindo o código original:
   
...

<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
<li><a asp-area="" asp-controller="GeraPDF" asp-action="VisualizarComoPDF">Gerar PDF</a></li>

</ul>
</div>

...

Agora vamos alterar o código da view Index.cshtml da pasta Views/Home :

@{
    ViewData["Title"] = "Home Page";
}
<br />
<div>
    <h3>Gerar arquivos PDF</h3>
</div>

 

Fizemos isso somente para exibir um link para Gerar PDF na página inicial.

Definindo a configuração no arquivo Startup

Precisamos definir no método Configure da classe Startup uma configuração para acessar o arquivo wkhtmltopdf.exe. Para isso inclua o código abaixo:
   
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseBrowserLink();
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
            app.UseStaticFiles();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
            RotativaConfiguration.Setup(env);
        }

Criando o controlador e view

Clique com o botão direito do mouse sobre a pasta Controllers e a seguir clique em Add -> Controller e escolha a opção MVC Controller Empty e clique Add;

Informe o nome GeraPDFController e a seguir defina o código abaixo neste controlador :

using Microsoft.AspNetCore.Mvc;
using Rotativa.AspNetCore;
namespace AspCore_PDF.Controllers
{
    public class GeraPDFController : Controller
    {
        public IActionResult VisualizarComoPDF()
        {
            return new ViewAsPdf("VisualizarComoPDF");
        }
    }
}

Neste código usamos a classe ViewAsPdf() passando o nome da View a partir da qual será gerado o arquivo PDF.

Para criar a view clique com o botão direito sobre o método Action VisualizarComoPDF e a seguir clique em Add View;

Aceite as definições conforme mostra a figura abaixo e clique em Add;

A seguir vamos definir o código na view para gerar o nosso arquivo PDF.

Definindo o código na view para gerar o PDF

Aqui colocamos o código do arquivo PDF que queremos gerar. Como exemplo eu vou criar alguns textos e exibir uma imagem:

@{
    Layout = null;
}
<html>
<head>
    <meta charset="utf-8">
    <title>Gerar PDF</title>
</head>
<body>
    <header>
        <h1>Pedido</h1>
        <address>
            <p>Jose Carlos Macoratti</p>
            <p>Rua Projetada , 100 - Centro<br>São Paulo - 03254-850</p>
            <p>Telefone - (011) 555-1234</p>
        </address>
        <span>
            <img src="~/images/maco10.gif" />
        </span>
    </header>
    <article>
        <address>
            <p>JcmSoft<br> a/c - Macoratti</p>
        </address>
        <table class="meta">
            <tr>
                <th><span>Pedido</span></th>
                <td><span>000001</span></td>
            </tr>
            <tr>
                <th><span>Data</span></th>
                <td><span>10, de Fevereiro, 2018</span></td>
            </tr>
            <tr>
                <th><span>Valor</span></th>
                <td><span>R$ 600,00</span></td>
            </tr>
        </table>
        <br />
        <table class="Estoque" border="1">
            <thead>
                <tr>
                    <th><span>Item</span></th>
                    <th><span>Descrição</span></th>
                    <th><span>Quantidade</span></th>
                    <th><span>Preço</span></th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td><span>Super DVD .NET</span></td>
                    <td><span>Recursos de aprendizagem para .NET</span></td>
                    <td><span>4</span></td>
                    <td><span>100.00</span></td>
                </tr>
            </tbody>
        </table>
        <br />
        <table class="Saldo">
            <tr>
                <th><span>Total</span></th>
                <td><span>600.00</span></td>
            </tr>
            <tr>
                <th><span>Pago</span></th>
                <td><span>0.00</span></td>
            </tr>
            <tr>
                <th><span>Saldo</span></th>
                <td><span>600.00</span></td>
            </tr>
        </table>
    </article>
    <aside>
        <h1><span>Notas Adicionais</span></h1>
        <div>
            <p>Macoratti .net - Quase tudo para .NET</p>
        </div>
    </aside>
</body>
</html>  
 

 

Agora é só alegria...

Executando projeto iremos obter o seguinte resultado:

Na segunda parte do artigo veremos como gerar pdfs usando uma view fortemente tipada e definindo outras configurações.

Pegue o código do projeto aqui: AspCore_PDF.zip (sem as referências)

(Disse Jesus)"Mas a hora vem, e agora é, em que os verdadeiros adoradores adorarão o Pai em espírito e em verdade; porque o Pai procura a tais que assim o adorem."
João 4:23


 

Referências:


José Carlos Macoratti