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

Blazor: Abra um PDF em uma nova aba com o IronPDF: Um tutorial para desenvolvedores

Abrir documentos PDF em uma nova aba do navegador é um requisito comum para aplicações web Blazor . Este tutorial demonstra como gerar PDFs usando o IronPDF e exibi-los em novas abas utilizando a interoperabilidade com JavaScript , proporcionando aos usuários uma experiência de visualização de documentos perfeita. Este exemplo se concentra na versão Blazor Server.

Pré-requisitos e configuração

Comece criando um novo projeto Blazor Server no Visual Studio 2022. Instale o IronPDF através do Console do Gerenciador de Pacotes NuGet :

Install-Package IronPdf

Configure sua licença do IronPDF no arquivo Program.cs para habilitar todas as funcionalidades:

License.LicenseKey = "YOUR-LICENSE-KEY";
License.LicenseKey = "YOUR-LICENSE-KEY";
License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Entendendo o Desafio

Os aplicativos Blazor Server não podem manipular diretamente as abas do navegador a partir do código C# no servidor. A tarefa de abrir um PDF em uma nova aba no Blazor requer o JavaScript InterOp (JS interop) para fazer a ponte entre a geração de PDFs no servidor e o gerenciamento de janelas no lado do cliente.

O IronPDF permite que os desenvolvedores gerem documentos PDF de alta qualidade no servidor , que podem então ser exibidos usando a funcionalidade window.open() do JavaScript. Essa abordagem significa resolver um problema comum de cliente-servidor em uma aplicação de rede.

Implementando funções JavaScript em seu aplicativo web Blazor

Adicione este código JavaScript ao seu arquivo _Host.cshtml para gerenciar a exibição de PDFs em novas abas do navegador. Este é o módulo responsável pelo gerenciamento de janelas do lado do cliente:

<script>
    window.openPdfInNewTab = function (pdfData, fileName) {
        // Convert base64 to blob
        const byteCharacters = atob(pdfData);
        const byteNumbers = new Array(byteCharacters.length);
        for (let i = 0; i < byteCharacters.length; i++) {
            byteNumbers[i] = byteCharacters.charCodeAt(i);
        }
        const byteArray = new Uint8Array(byteNumbers);
        // The type is 'application/pdf', not 'image/png' or 'image/jpg'
        const blob = new Blob([byteArray], { type: 'application/pdf' });
        // Create URL and open in new tab
        const blobUrl = URL.createObjectURL(blob);
        const newWindow = window.open(blobUrl, '_blank');
        if (newWindow) {
            newWindow.document.title = fileName || 'PDF Document';
        }
        // Clean up
        setTimeout(() => URL.revokeObjectURL(blobUrl), 100);
        return newWindow !== null;
    };
</script>
<script>
    window.openPdfInNewTab = function (pdfData, fileName) {
        // Convert base64 to blob
        const byteCharacters = atob(pdfData);
        const byteNumbers = new Array(byteCharacters.length);
        for (let i = 0; i < byteCharacters.length; i++) {
            byteNumbers[i] = byteCharacters.charCodeAt(i);
        }
        const byteArray = new Uint8Array(byteNumbers);
        // The type is 'application/pdf', not 'image/png' or 'image/jpg'
        const blob = new Blob([byteArray], { type: 'application/pdf' });
        // Create URL and open in new tab
        const blobUrl = URL.createObjectURL(blob);
        const newWindow = window.open(blobUrl, '_blank');
        if (newWindow) {
            newWindow.document.title = fileName || 'PDF Document';
        }
        // Clean up
        setTimeout(() => URL.revokeObjectURL(blobUrl), 100);
        return newWindow !== null;
    };
</script>
The provided code is JavaScript, not C#. However, I can help you convert it into VB.NET code that would perform a similar function if executed in a VB.NET environment with a web browser control or similar setup. Here's how you might implement similar functionality in VB.NET:



Note: This VB.NET code assumes you are working in a desktop application environment where you can use the `Process.Start` method to open a PDF file with the default PDF viewer. If you are working in a web environment, you would need to adapt this code to fit the web context, possibly using a web server to serve the PDF file to the client.
$vbLabelText   $csharpLabel

A função JavaScript window.openPdfInNewTab é crucial para resolver o desafio de abrir uma nova aba a partir do servidor. Ele aceita os dados do PDF como uma string Base64 do servidor Blazor e o código do lado do cliente os converte em um objeto Blob binário.

Esse blob é então usado para criar uma URL temporária, que é finalmente passada para window.open (blobUrl, '_blank') para forçar o navegador a abrir o PDF em uma nova aba.

Criando o componente Blazor

Crie um novo componente Razor que gere PDFs e os abra em novas abas. Isso serve como modelo principal para a solução:

@page "/pdf-viewer"
@using IronPDF @inject IJSRuntime JS
<h3>Open PDF in New Tab</h3>
<div class="mb-3">
    <label>Enter URL:</label>
</div>
<button class="btn btn-primary" @onclick="GenerateAndOpenPdf"
        disabled="@isProcessing">
    @if (isProcessing)
    {
        <span>Generating PDF...</span>
    }
    else
    {
        <span>Generate and Open PDF</span>
    }
</button>
@if (!string.IsNullOrEmpty(errorMessage))
{
    <div class="alert alert-danger mt-3">@errorMessage</div>
}
@code {
    private string targetUrl = "https://ironpdf.com";
    private bool isProcessing = false;
    private string errorMessage = "";
    private async Task GenerateAndOpenPdf()
    {
        isProcessing = true;
        errorMessage = "";
        try
        {
            // Configure Chrome PDF renderer. Note the rendering details
            var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    MarginTop = 10,
                    MarginBottom = 10,
                    MarginLeft = 10,
                    MarginRight = 10,
                    EnableJavaScript = true,
                    RenderDelay = 500
                }
            };
            // Generate PDF from URL
            var pdfDocument = await Task.Run(() =>
                renderer.RenderUrlAsPdf(targetUrl));
            // Convert to base64
            byte[] pdfBytes = pdfDocument.BinaryData;
            string base64Pdf = Convert.ToBase64String(pdfBytes);
            // Open in new tab via JS interop. We run this call to open the PDF
            bool success = await JS.InvokeAsync<bool>("openPdfInNewTab",
                base64Pdf, $"Document_{DateTime.Now:yyyyMMdd_HHmmss}.pdf");
            if (!success)
            {
                // Giving the user an understandable error is key
                errorMessage = "Pop-up blocked. Please allow pop-ups for this site.";
            }
        }
        catch (Exception ex)
        {
            errorMessage = $"Error: {ex.Message}";
        }
        finally
        {
            isProcessing = false;
        }
    }
}
@page "/pdf-viewer"
@using IronPDF @inject IJSRuntime JS
<h3>Open PDF in New Tab</h3>
<div class="mb-3">
    <label>Enter URL:</label>
</div>
<button class="btn btn-primary" @onclick="GenerateAndOpenPdf"
        disabled="@isProcessing">
    @if (isProcessing)
    {
        <span>Generating PDF...</span>
    }
    else
    {
        <span>Generate and Open PDF</span>
    }
</button>
@if (!string.IsNullOrEmpty(errorMessage))
{
    <div class="alert alert-danger mt-3">@errorMessage</div>
}
@code {
    private string targetUrl = "https://ironpdf.com";
    private bool isProcessing = false;
    private string errorMessage = "";
    private async Task GenerateAndOpenPdf()
    {
        isProcessing = true;
        errorMessage = "";
        try
        {
            // Configure Chrome PDF renderer. Note the rendering details
            var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    MarginTop = 10,
                    MarginBottom = 10,
                    MarginLeft = 10,
                    MarginRight = 10,
                    EnableJavaScript = true,
                    RenderDelay = 500
                }
            };
            // Generate PDF from URL
            var pdfDocument = await Task.Run(() =>
                renderer.RenderUrlAsPdf(targetUrl));
            // Convert to base64
            byte[] pdfBytes = pdfDocument.BinaryData;
            string base64Pdf = Convert.ToBase64String(pdfBytes);
            // Open in new tab via JS interop. We run this call to open the PDF
            bool success = await JS.InvokeAsync<bool>("openPdfInNewTab",
                base64Pdf, $"Document_{DateTime.Now:yyyyMMdd_HHmmss}.pdf");
            if (!success)
            {
                // Giving the user an understandable error is key
                errorMessage = "Pop-up blocked. Please allow pop-ups for this site.";
            }
        }
        catch (Exception ex)
        {
            errorMessage = $"Error: {ex.Message}";
        }
        finally
        {
            isProcessing = false;
        }
    }
}
Imports IronPDF
Imports Microsoft.JSInterop

@page "/pdf-viewer"
@inject IJSRuntime JS

<h3>Open PDF in New Tab</h3>
<div class="mb-3">
    <label>Enter URL:</label>
</div>
<button class="btn btn-primary" @onclick="GenerateAndOpenPdf" disabled="@isProcessing">
    @If isProcessing Then
        <span>Generating PDF...</span>
    Else
        <span>Generate and Open PDF</span>
    End If
</button>
@If Not String.IsNullOrEmpty(errorMessage) Then
    <div class="alert alert-danger mt-3">@errorMessage</div>
End If

@Code
    Private targetUrl As String = "https://ironpdf.com"
    Private isProcessing As Boolean = False
    Private errorMessage As String = ""

    Private Async Function GenerateAndOpenPdf() As Task
        isProcessing = True
        errorMessage = ""
        Try
            ' Configure Chrome PDF renderer. Note the rendering details
            Dim renderer As New ChromePdfRenderer With {
                .RenderingOptions = New ChromePdfRenderOptions With {
                    .MarginTop = 10,
                    .MarginBottom = 10,
                    .MarginLeft = 10,
                    .MarginRight = 10,
                    .EnableJavaScript = True,
                    .RenderDelay = 500
                }
            }
            ' Generate PDF from URL
            Dim pdfDocument = Await Task.Run(Function() renderer.RenderUrlAsPdf(targetUrl))
            ' Convert to base64
            Dim pdfBytes As Byte() = pdfDocument.BinaryData
            Dim base64Pdf As String = Convert.ToBase64String(pdfBytes)
            ' Open in new tab via JS interop. We run this call to open the PDF
            Dim success As Boolean = Await JS.InvokeAsync(Of Boolean)("openPdfInNewTab", base64Pdf, $"Document_{DateTime.Now:yyyyMMdd_HHmmss}.pdf")
            If Not success Then
                ' Giving the user an understandable error is key
                errorMessage = "Pop-up blocked. Please allow pop-ups for this site."
            End If
        Catch ex As Exception
            errorMessage = $"Error: {ex.Message}"
        Finally
            isProcessing = False
        End Try
    End Function
End Code
$vbLabelText   $csharpLabel

Este bloco de código define a página interativa principal. A linguagem de marcação Razor cria uma interface de usuário simples com um campo de entrada de URL e um botão. O bloco de código C# @code lida com a lógica: quando o botão é clicado, ele usa uma instância de ChromePdfRenderer para gerar o PDF a partir da URL fornecida pelo usuário.

Em seguida, converte a matriz de bytes PDF resultante em uma string Base64 e usa @inject IJSRuntime JS para chamar a função JavaScript , abrindo o documento para o usuário.

Saída da interface do usuário

 Blazor: Abrir PDF em nova aba com IronPDF: Um tutorial para desenvolvedores: Imagem 1 - Exemplo de interface básica

Saída com PDF aberto em nova aba

 Blazor: Abrir PDF em nova aba com IronPDF: Um tutorial para desenvolvedores: Imagem 2 - Primeiro PDF aberto em nova aba

Trabalhando com conteúdo HTML dinâmico

Para gerar PDFs a partir de conteúdo dinâmico em vez de URLs, modifique sua abordagem para usar RenderHtmlAsPdf:

private async Task GenerateFromHtml()
{
    // Define CSS styles inside the HTML string for structure and appearance.
    string htmlContent = $@"
        <!DOCTYPE html>
        <html>
        <head>
            <style>
                body {{ font-family: Arial; padding: 20px; }}
                h1 {{ color: #2c3e50; }}
            </style>
        </head>
        <body>
            <h1>{documentTitle}</h1>
            <p>{documentContent}</p>
            <div>Generated: {DateTime.Now}</div>
        </body>
        </html>";
    var renderer = new ChromePdfRenderer();
    var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
    byte[] pdfBytes = pdfDocument.BinaryData;
    await JS.InvokeVoidAsync("openPdfInNewTab",
        Convert.ToBase64String(pdfBytes), "dynamic.pdf");
}
private async Task GenerateFromHtml()
{
    // Define CSS styles inside the HTML string for structure and appearance.
    string htmlContent = $@"
        <!DOCTYPE html>
        <html>
        <head>
            <style>
                body {{ font-family: Arial; padding: 20px; }}
                h1 {{ color: #2c3e50; }}
            </style>
        </head>
        <body>
            <h1>{documentTitle}</h1>
            <p>{documentContent}</p>
            <div>Generated: {DateTime.Now}</div>
        </body>
        </html>";
    var renderer = new ChromePdfRenderer();
    var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
    byte[] pdfBytes = pdfDocument.BinaryData;
    await JS.InvokeVoidAsync("openPdfInNewTab",
        Convert.ToBase64String(pdfBytes), "dynamic.pdf");
}
Private Async Function GenerateFromHtml() As Task
    ' Define CSS styles inside the HTML string for structure and appearance.
    Dim htmlContent As String = $"
        <!DOCTYPE html>
        <html>
        <head>
            <style>
                body {{ font-family: Arial; padding: 20px; }}
                h1 {{ color: #2c3e50; }}
            </style>
        </head>
        <body>
            <h1>{documentTitle}</h1>
            <p>{documentContent}</p>
            <div>Generated: {DateTime.Now}</div>
        </body>
        </html>"
    Dim renderer = New ChromePdfRenderer()
    Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
    Dim pdfBytes As Byte() = pdfDocument.BinaryData
    Await JS.InvokeVoidAsync("openPdfInNewTab", Convert.ToBase64String(pdfBytes), "dynamic.pdf")
End Function
$vbLabelText   $csharpLabel

O método GenerateFromHtml demonstra como o IronPDF pode gerar um PDF a partir de marcação HTML gerada dinamicamente em vez de uma URL existente. Constrói uma string HTML completa contendo um cabeçalho, conteúdo e dados dinâmicos. A resposta para a geração de conteúdo dinâmico é o método RenderHtmlAsPdf.

Interface do usuário do Blazor Server atualizada

 Blazor: Abrir PDF em nova aba com IronPDF: Um tutorial para desenvolvedores: Imagem 3 - Exemplo de interface de usuário atualizada para o seu projeto de servidor

PDF aberto em nova aba do navegador

 Blazor: Abrir PDF em nova aba com IronPDF: Um tutorial para desenvolvedores: Imagem 4 - Exemplo de PDF dinâmico criado e aberto em nova aba

Lidando com problemas comuns

Compatibilidade entre navegadores

Diferentes navegadores lidam com URLs de blobs de maneiras diferentes. Teste sua implementação no Chrome, Firefox, Edge e Safari para garantir um comportamento consistente.

Arquivos grandes

Para documentos PDF grandes, considere implementar o cache no servidor para melhorar o desempenho:

services.AddMemoryCache();
// Cache generated PDFs to avoid regeneration
services.AddMemoryCache();
// Cache generated PDFs to avoid regeneration
services.AddMemoryCache()
' Cache generated PDFs to avoid regeneration
$vbLabelText   $csharpLabel

Alternativas de navegação

Além da interoperabilidade com JavaScript , você pode disponibilizar PDFs por meio de middleware de arquivos estáticos e usar tags de âncora HTML padrão como opção alternativa de navegação:

<a href="/pdfs/document.pdf" target="_blank">Open PDF</a>
<a href="/pdfs/document.pdf" target="_blank">Open PDF</a>
The provided input is HTML, not C# code. Please provide valid C# code for conversion to VB.NET.
$vbLabelText   $csharpLabel

Essa abordagem funciona bem para PDFs pré-gerados, mas não possui os recursos de geração dinâmica do método JS InterOp.

Melhores práticas

  1. Tratamento de erros: Sempre envolva a geração de PDF em blocos try-catch e forneça mensagens de erro significativas aos usuários quando ocorrer um problema.
  2. Desempenho: Utilize padrões async/await para evitar o bloqueio da interface do usuário durante a geração do PDF.
  3. Experiência do usuário: Exibir indicadores de carregamento durante a geração e lidar adequadamente com bloqueadores de pop-up.
  4. Manipulação do DOM : Lembre-se de que o C# no servidor não pode manipular o DOM do cliente diretamente; É por isso que a interoperabilidade com JavaScript é essencial. Não é necessário definir manualmente a altura ou a largura da nova janela, pois o navegador gerencia o visualizador de PDF.
  5. Segurança: Validar e higienizar a entrada do usuário antes de gerar PDFs.

Conclusão

A combinação dos poderosos recursos de geração de PDF do IronPDF com a interoperabilidade JavaScript do Blazor oferece uma solução robusta para abrir PDFs em novas abas do navegador. Essa abordagem permite que os desenvolvedores criem documentos PDF dinâmicos e profissionais que se integram perfeitamente com aplicativos Blazor modernos, desenvolvidos com a tecnologia .NET da Microsoft.

Pronto para implementar a funcionalidade de PDF no seu projeto Blazor ? Comece hoje mesmo seu teste gratuito do IronPDF . A versão de avaliação inclui todas as funcionalidades sem marcas d'água e suporte completo para garantir o seu sucesso.

Perguntas frequentes

Como posso abrir um PDF em uma nova aba usando Blazor?

Você pode abrir um PDF em uma nova aba usando Blazor, gerando o PDF com o IronPDF e utilizando a interoperabilidade com JavaScript para exibi-lo em uma nova aba. Essa abordagem garante uma experiência de usuário fluida ao visualizar documentos.

O que é interoperabilidade JavaScript em Blazor?

A interoperabilidade com JavaScript no Blazor permite que aplicativos Blazor chamem funções JavaScript a partir de código .NET e vice-versa. Isso é útil para tarefas como abrir PDFs em uma nova aba, onde o JavaScript pode lidar com operações específicas do navegador.

Por que devo usar o IronPDF para gerar PDFs em Blazor?

IronPDF é uma ferramenta eficiente para gerar PDFs em aplicações Blazor. Oferece recursos robustos que permitem a criação e manipulação de PDFs de forma integrada, podendo ser facilmente incorporado à interoperabilidade JavaScript do Blazor para um melhor gerenciamento de documentos.

O IronPDF é compatível com o Blazor Server?

Sim, o IronPDF é totalmente compatível com o Blazor Server. Ele pode ser usado para gerar e gerenciar PDFs, que podem ser abertos em novas abas usando a interoperabilidade com JavaScript.

Quais são os benefícios de abrir PDFs em uma nova aba em aplicativos Blazor?

Abrir PDFs em uma nova aba melhora a experiência do usuário, permitindo que ele visualize os documentos sem sair da página atual. Esse método, compatível com IronPDF e interoperabilidade com JavaScript, garante uma sessão de navegação mais interativa e ininterrupta.

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