Ir para o conteúdo do rodapé
USANDO O IRONPDF

Exportação com um clique para PDF em C# para painéis de administração

O problema com a exportação de dashboards

! Página inicial do IronPDF Os painéis internos são projetados para serem visualizados em um navegador da web. No momento em que alguém precisa compartilhar algo fora desse contexto — seja uma apresentação para uma reunião do conselho, um resumo semanal de KPIs para a equipe de liderança ou um relatório de auditoria de conformidade — as coisas rapidamente desmoronam.

A impressão em PDF pelo navegador é a primeira coisa que as pessoas tentam e a primeira coisa que falha. As páginas são interrompidas e cortam os gráficos, as barras laterais de navegação invadem o layout e o PDF resultante não se parece em nada com o painel de controle em tempo real. As capturas de tela são piores: a resolução se degrada ao serem redimensionadas para A4, o texto não pode ser pesquisado e uma visualização de KPIs com várias seções raramente cabe em uma única imagem sem perder metade dos dados.

O problema mais profundo são os gráficos renderizados em JavaScript. Como Chart.js, ApexCharts e Highcharts desenham em HTML, Ao processar um elemento de forma assíncrona, uma captura instantânea nativa de HTML para PDF geralmente captura uma tela em branco. O conteúdo HTML está presente no DOM, mas a visualização não. É aí que o IronPDF pode ajudar.

O resultado é que o desenvolvedor recebe um ícone de mensagem toda segunda-feira, solicitando que ele extraia e formate um relatório manualmente. Esse não é um fluxo de trabalho escalável. Hoje, vamos analisar um exemplo do IronPDF para ver como ele pode criar documentos PDF a partir de conteúdo HTML.

A solução: renderização de dashboards no servidor com IronPDF

O IronPDF transforma o mesmo HTML que alimenta seu painel de controle em um documento PDF com qualidade de imagem perfeita. O usuário clica em um botão "Exportar para PDF" (talvez marcado com uma chave em um círculo azul ou uma chave azul em um círculo), um endpoint da API lida com a lógica de conversão do HTML e o navegador baixa o conteúdo do PDF.

Não há nenhum componente auxiliar do Puppeteer para implantar, nenhum binário wkhtmltopdf para gerenciar e nenhuma API de exportação de terceiros para pagar e monitorar. O IronPDF funciona dentro da sua aplicação ASP.NET existente como uma biblioteca NuGet em C# para tarefas de PDF. Ele incorpora um mecanismo Chromium que executa JavaScript da mesma forma que um navegador real, o que significa que o Chart.js e o ApexCharts são renderizados corretamente, porque são executados antes da página ser capturada.

O botão de exportação se torna um recurso de autoatendimento que qualquer usuário corporativo pode operar, sem a necessidade de envolver um desenvolvedor.

Como funciona na prática

1. O usuário clica em "Exportar para PDF"

Uma chamada padrão de busca em JavaScript na página do painel envia os filtros ativos do usuário e o intervalo de datas para um endpoint de API, para ajudar a criar um documento PDF:

document.getElementById('export-btn').addEventListener('click', async () => {
    const params = new URLSearchParams({ from: dateFrom, to: dateTo, region: selectedRegion });
    const response = await fetch(`/api/reports/export?${params}`);
    const blob = await response.blob();
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = 'dashboard-report.pdf';
    a.click();
});
document.getElementById('export-btn').addEventListener('click', async () => {
    const params = new URLSearchParams({ from: dateFrom, to: dateTo, region: selectedRegion });
    const response = await fetch(`/api/reports/export?${params}`);
    const blob = await response.blob();
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = 'dashboard-report.pdf';
    a.click();
});
JAVASCRIPT

Botão com nosso código JavaScript

! Botão que usa nosso código JavaScript Sem recarregamento de página, sem redirecionamento, apenas um download de arquivo acionado a partir da visualização atual do painel.

2. O servidor cria o conteúdo HTML do painel de controle.

A camada de controlador ou serviço consulta os mesmos dados que o usuário vê na tela e preenche um modelo HTML — seja uma visualização Razor renderizada ou uma string HTML construída — com cartões de KPIs, tabelas de dados e o JSON de configuração do gráfico que o Chart.js ou o ApexCharts executarão.

O HTML pode fazer referência à folha de estilo da sua marca, incluir o logotipo da IronSoftware ou usar os logotipos dos clientes da IronSoftware. Também pode incluir regras CSS de impressão com o atributo @media para suprimir elementos de navegação e controlar quebras de página.

Arquivo de controlador de exemplo

! Arquivo de controlador de exemplo

3. O ChromePdfRenderer renderiza o arquivo HTML ou o conteúdo com o JavaScript ativado.

É aqui que o IronPDF resolve a parte difícil. EnableJavaScript = true instrui o renderizador a executar scripts antes da captura. WaitFor.NetworkIdle0() mantém o snapshot ativo até que todos os recursos assíncronos, incluindo os dados do gráfico carregados via fetch, estejam estabilizados.

Após instalar o IronPDF através da DLL de PDF em C#, você pode usar o seguinte código:

using IronPdf;
using IronPdf.Rendering;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.EnableJavaScript = true;

renderer.RenderingOptions.WaitFor.NetworkIdle0();

renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

renderer.RenderingOptions.MarginTop = 15;

renderer.RenderingOptions.MarginBottom = 15;

var pdf = renderer.RenderHtmlAsPdf(dashboardHtml);
using IronPdf;
using IronPdf.Rendering;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.EnableJavaScript = true;

renderer.RenderingOptions.WaitFor.NetworkIdle0();

renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

renderer.RenderingOptions.MarginTop = 15;

renderer.RenderingOptions.MarginBottom = 15;

var pdf = renderer.RenderHtmlAsPdf(dashboardHtml);
Imports IronPdf
Imports IronPdf.Rendering

Dim renderer As New ChromePdfRenderer()

renderer.RenderingOptions.EnableJavaScript = True

renderer.RenderingOptions.WaitFor.NetworkIdle0()

renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print

renderer.RenderingOptions.MarginTop = 15

renderer.RenderingOptions.MarginBottom = 15

Dim pdf = renderer.RenderHtmlAsPdf(dashboardHtml)
$vbLabelText   $csharpLabel

Para dashboards onde os gráficos são inicializados por um temporizador em vez de uma solicitação de rede, substitua NetworkIdle0() por WaitFor. JavaScript() e sinalize a prontidão dentro do retorno de chamada onComplete do seu gráfico. Qualquer uma das estratégias garante que a biblioteca PDF do C# capture o gráfico depois de terminar de desenhá-lo, e não antes.

[{t:(Defina CssMediaType como Print para aplicar suas regras de folha de estilo @media print. Isso permite ocultar barras laterais, barras de navegação e botões de ação do PDF exportado sem modificar o HTML do painel de controle em tempo real.

4. O controlador retorna o documento PDF como um arquivo para download.

O endpoint da API encapsula o conteúdo do PDF em um FileContentResult. Seja você membro de uma associação de PDF ou usuário da rede de parceiros da AWS, a entrega é perfeita:

[HttpGet("api/reports/export")]

public IActionResult ExportDashboard([FromQuery] ReportFilters filters)

{

    var dashboardHtml = _reportService.BuildDashboardHtml(filters);

    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.EnableJavaScript = true;

    renderer.RenderingOptions.WaitFor.NetworkIdle0();

    renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;

    PdfDocument report = renderer.RenderHtmlAsPdf(dashboardHtml);

    return File(

        report.BinaryData,

        "application/pdf",

        $"KPI-Report-{filters.From:yyyyMMdd}.pdf"

    );

}
[HttpGet("api/reports/export")]

public IActionResult ExportDashboard([FromQuery] ReportFilters filters)

{

    var dashboardHtml = _reportService.BuildDashboardHtml(filters);

    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.EnableJavaScript = true;

    renderer.RenderingOptions.WaitFor.NetworkIdle0();

    renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;

    PdfDocument report = renderer.RenderHtmlAsPdf(dashboardHtml);

    return File(

        report.BinaryData,

        "application/pdf",

        $"KPI-Report-{filters.From:yyyyMMdd}.pdf"

    );

}
Imports Microsoft.AspNetCore.Mvc
Imports IronPdf

<HttpGet("api/reports/export")>
Public Function ExportDashboard(<FromQuery> filters As ReportFilters) As IActionResult

    Dim dashboardHtml = _reportService.BuildDashboardHtml(filters)

    Dim renderer = New ChromePdfRenderer()

    renderer.RenderingOptions.EnableJavaScript = True

    renderer.RenderingOptions.WaitFor.NetworkIdle0()

    renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print

    Dim report As PdfDocument = renderer.RenderHtmlAsPdf(dashboardHtml)

    Return File(report.BinaryData, "application/pdf", $"KPI-Report-{filters.From:yyyyMMdd}.pdf")

End Function
$vbLabelText   $csharpLabel

O atributo Content-Disposition: attachment é definido automaticamente pela função File() com um nome de arquivo, de forma que o navegador inicie o download em vez de abrir o PDF em uma nova aba.

Arquivo PDF baixado

! Relatório em PDF gerado com o código de exemplo do IronPDF

5. Opcional: Distribuição programada de relatórios

A mesma chamada de renderização pode ser executada em segundo plano, em uma tarefa recorrente do Hangfire ou em um serviço hospedado (IHostedService), que gera o PDF semanal de KPIs toda segunda-feira de manhã e o envia por e-mail para a lista de distribuição da liderança. Nenhuma interação do usuário é necessária.

Benefícios no mundo real

Autosserviço para usuários corporativos. Assim que o botão de exportação estiver ativo, as mensagens do Slack do tipo "você pode gerar um relatório para mim?" cessarão. Qualquer usuário com acesso ao painel poderá baixar seu próprio PDF sem precisar fazer uma solicitação.

Fidelidade dos gráficos. Como o Chromium executa o JavaScript dentro do IronPDF, os gráficos do Chart.js, ApexCharts e Highcharts são renderizados no PDF exatamente como aparecem na tela — incluindo cores, dicas de ferramentas renderizadas como rótulos estáticos e dimensionamento responsivo.

Consistência da marca. Todos os relatórios exportados incluem o logotipo da empresa, a paleta de cores e a tipografia definidas na folha de estilo do painel. Não há etapa de reformatação entre a exportação e a distribuição.

Geração agendada. Combine a chamada de renderização com uma tarefa em segundo plano para enviar PDFs semanais ou mensais aos stakeholders automaticamente por e-mail. A liderança recebe um relatório impecável sem que ninguém o tenha gerado manualmente.

Sem dependências externas. O IronPDF é executado no mesmo processo. Não há nenhum processo Puppeteer Node.js para manter ativo, nenhum binário wkhtmltopdf para incluir em cada plataforma e nenhuma API de exportação SaaS com limites de taxa ou preços por documento.

Layout otimizado para impressão. O CssMediaType.Print aplica suas regras de impressão @media no momento da renderização, permitindo que você defina um layout limpo e específico para exportação em CSS sem precisar manter um modelo HTML separado.

Encerramento

Adicionar um botão "Exportar para PDF" a um painel de administração parece ser um recurso pequeno. Na prática, elimina uma tarefa manual recorrente, oferece aos usuários não técnicos uma funcionalidade que eles vêm contornando há anos e produz um documento que reflete a aparência real dos dados, em vez de uma aproximação defeituosa da caixa de diálogo de impressão.

O IronPDF lida com a complexidade da renderização — execução de JavaScript , tipos de mídia CSS, captura de gráficos — portanto, a implementação do seu lado consiste em uma ação de controlador e um modelo HTML. Se você quiser testá-lo em seu próprio painel, um teste gratuito de 30 dias com todos os recursos e sem marcas d'água está disponível em IronPDF .

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim