Rotativa PDF em ASP .Net MVC

Veja neste artigo como gerar relatórios em PDF no ASP.Net MVC de forma rápida e simples utilizando o Rotativa.

Rotativa é um biblioteca baseada no wkhtmltopdf que converte HTML para PDF usando o motor WebKit (usado pelo Chrome e Safari), como o próprio autor do Rotativa diz, o legal disso é que posso usar o meu conhecimento de HTML/CSS para gerar meus PDFs.

Como usar Rotativa

O uso do Rotativa é bem simples, para demonstrar criei um projeto em ASP.Net MVC, e em seguida adicionei o pacote do Nuget do Rotativa

1
PM> Install-Package Rotativa

Adicione um controller Home e outro Relatório, para o segundo crie um view chamada Modelo.cshtml;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
@model RelatorioPDF.Models.Usuario
<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="utf-8" />
    <title>Exemplo de Relatório em PDF</title>
 
    <!-- css -->
    <link href="~/Content/estilos-relatorio.css" rel="stylesheet" />
</head>
<body>
    <div id="container">
        <div id="cabecalho">
            <div id="nome">
                <h1>RECIBO DE DISPENSAÇÃO</h1>
            </div>
            <div id="unidade">
                <h2>Meu Sistema</h2>
                <h3>Hospital São Paulo</h3>
                <h4>Farmácia</h4>
            </div>
        </div>
        <div id="corpo">
            <div class="linha">
                <p>
                    Dispensado:<br />
                    <span>10/10/2012</span>
                </p>
                <p>
                    Cartão do SUS:<br />
                    <span>123.1232.123.123</span>
                </p>
                <p>
                    Usuario:<br />
                    <span class="bold">João da Silva Gonçalves</span>
                </p>
            </div>
            <div class="linha">
                <p>
                    Prescritor:<br />
                    <span>Jonas São João</span>
                </p>
                <p>
                    Nº Registro:<br />
                    <span>12323132</span>
                </p>
                <p>
                    Origem da Receita:<br />
                    <span>10/10/012</span>
                </p>
            </div>
            <div class="linha">
                <p>Produtos Dispensados:</p>
                <table>
                    <thead>
                        <tr>
                            <th>Produto</th>
                            <th>Atendido?</th>
                            <th>Und</th>
                            <th class="aling-right">Dispensado</th>
                            <th class="aling-right">Unitário R$</th>
                            <th class="aling-right">Total R$</th>
                        </tr>
                    </thead>
 
                    <tbody>
 
                        <tr class="odd">
                            <td class="bold" width="45%">Anador</td>
                            <td>Sim</td>
                            <td class="fonte10">FRS</td>
                            <td class="aling-right">10</td>
                            <td class="aling-right" width="100px;">1,2345</td>
                            <td class="aling-right" style="min-width: 100px">12,23</td>
                        </tr>
                        <tr class="odd">
                            <td colspan="6" class="italico">Possologia: 1 dose, 3 vez por dia, durante 5 dias</td>
                        </tr>
 
                        <tr class="">
                            <td class="bold" width="45%">Dipirona</td>
                            <td>Sim</td>
                            <td class="fonte10">FRS</td>
                            <td class="aling-right">10</td>
                            <td class="aling-right" width="100px;">1,2345</td>
                            <td class="aling-right" style="min-width: 100px">12,23</td>
                        </tr>
                        <tr class="">
                            <td colspan="6" class="italico">Possologia: 1 dose, 3 vez por dia, durante 5 dias</td>
                        </tr>
 
                    </tbody>
                    <tfoot>
                        <tr>
                            <td colspan="5" class="bold">Total</td>
                            <td class="aling-right">R$ 12,23</td>
                        </tr>
                    </tfoot>
                </table>
            </div>
            <div class="linha">
                <p>
                    Observação:<br />
                    <span>Paciente com fortes dores de cabeça</span>
                </p>
            </div>
        </div>
        <div id="rodape">
            <p>Usuário: <span>Cleyton Ferrari</span> Emitido: <span>26/10/2012</span> CleytonFerrari.com</p>
        </div>
    </div>
</body>
</html>

Crie um HTML e CSS bem simples mas que demonstra todo o poder do motor de renderização do Rotativa;

Agora vem a parte mais fácil, basta criar as actions dentro dos controllers da mesma forma como você já vem criando para mostrar suas views, só que ao invés de retornar uma View() você retorna ViewAsPdf();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using RelatorioPDF.Models;
using Rotativa;
using Rotativa.Options;
 
namespace RelatorioPDF.Controllers
{
    public class RelatoriosController : Controller
    {
        /*
         * Retorna a view simples em HTML, usada como modelo para gerar o PDF
         */
        public ActionResult ModeloHTML()
        {
            return View("Modelo");
        }
 
        /*
         * Retorna um PDF diretamente no browser com as configurações padrões
         * ViewName é setado somente para utilizar o próprio Modelo anterior
         * Caso não queira setar o ViewName, você deve gerar a view com o mesmo nome da action
         */
        public ActionResult PDFPadrao()
        {
            var pdf = new ViewAsPdf
                          {
                              ViewName = "Modelo"
                          };
            return pdf;
        }
 
        /*
         * Configura algumas propriedades do PDF, inclusive o nome do arquivo gerado,
         * Porem agora ele baixa o pdf ao invés de mostrar no browser
         */
        public ActionResult PDFConfigurado()
        {
            var pdf = new ViewAsPdf
            {
                ViewName = "Modelo",
                FileName = "NomeDoArquivoPDF.pdf",
                PageSize = Size.A4,
                IsGrayScale = true,
                PageMargins = new Margins{Bottom = 5, Left = 5, Right = 5, Top = 5},
            };
            return pdf;
        }
 
        /*
         * Pode passar um modelo para a view que vai ser utilizada para gerar o PDF
         */
        public ActionResult PDFComModel()
        {
            var modelo = new Usuario
                             {
                                 Nome = "Cleyton Ferrari", 
                                 Site = "http://cleytonferrari.com"
                             };
 
            var pdf = new ViewAsPdf
            {
                ViewName = "Modelo",
                Model = modelo
            };
 
            return pdf;
        }
 
    }
}

A criação de relatórios em PDF principalmente em aplicativos de negócios é uma necessidade, principalmente para impressão e com o Rotativa fica bem mais simples seu uso uma vez que você pode utilizar seus conhecimento em HTML/CSS para gerar os layout e passar modelos (viewModel) para as suas views e gerar relatórios bem complexos em PDF com uma simples troca no retorno da action.

Ficou alguma dúvida? Tem sugestão! Comenta ai! Vamos conversar sobre o Rotativa!

Fica a dica e até a próxima.

Comentarios

comentarios

One Response to Rotativa PDF em ASP .Net MVC
  1. […] O pacote RotativaW7 não existe mais no nuget, removemos! Agora o pacote oficial do Rotativa aceita ... cleytonferrari.com/gerando-relatorios-em-pdf-com-rotativa-w7