Saltar al pie de página
USANDO IRONPDF

Cómo abrir un PDF en una nueva pestaña en Blazor

Abrir documentos PDF en una nueva pestaña del navegador es un requisito común para las aplicaciones web de Blazor. Este tutorial muestra cómo generar archivos PDF utilizando IronPDF y mostrarlos en nuevas pestañas utilizando JavaScript interop, proporcionando a los usuarios una experiencia de visualización de documentos sin fisuras. Este ejemplo se centra en una versión de Blazor Server.

Requisitos previos y configuración

Comienza creando un nuevo proyecto de Blazor Server en Visual Studio 2022. Instala IronPDF a través de la Consola del Administrador de Paquetes NuGet:

Install-Package IronPdf

Configura tu licencia IronPDF en Program.cs para habilitar la funcionalidad completa:

License.LicenseKey = "YOUR-LICENSE-KEY";
License.LicenseKey = "YOUR-LICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Entendiendo el reto

Las aplicaciones de Blazor Server no pueden manipular directamente las pestañas del navegador desde el código C# en el servidor. La tarea de Blazor de abrir un PDF en una nueva pestaña requiere JavaScript interop (JS interop) para unir la generación de PDF del lado del servidor con la gestión de ventanas del lado del cliente.

IronPDF permite a los desarrolladores generar documentos PDF de alta calidad en el servidor, que luego pueden mostrarse utilizando la funcionalidad window.open() de JavaScript. Este enfoque significa resolver un problema común cliente-servidor en una aplicación .NET.

Implementación de funciones JavaScript en su aplicación web Blazor

Añade este código JavaScript a tu archivo _Host.cshtml para manejar la visualización de PDF en nuevas pestañas del navegador. Este es el módulo responsable de la gestión de ventanas del lado del 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>
HTML

La función JavaScript window.openPdfInNewTab es crucial para resolver el desafío de abrir una nueva pestaña desde el servidor. Acepta los datos PDF como una cadena Base64 del servidor Blazor y el código del lado del cliente los convierte en un objeto binario Blob.

Este blob se utiliza luego para crear una URL temporal, que finalmente se pasa a window.open(blobUrl, '_blank') para forzar al navegador a abrir el PDF en una nueva pestaña.

Creación del componente Blazor

Crea un nuevo componente Razor que genere PDFs y los abra en nuevas pestañas. Esto sirve como la plantilla principal para la solución:

@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
            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;
        }
    }
}

Este bloque de código define la página interactiva principal. El marcado Razor crea una interfaz de usuario simple con un campo de entrada de URL y un botón. El bloque C# @code maneja la lógica: cuando se hace clic en el botón, utiliza una instancia de ChromePdfRenderer para generar el PDF desde la URL proporcionada por el usuario.

Luego convierte el arreglo de bytes resultante del PDF en una cadena Base64 y utiliza @inject IJSRuntime JS para llamar a la función JavaScript, abriendo el documento para el usuario.

Resultado de la interfaz de usuario

Cómo abrir un PDF en una nueva pestaña en Blazor: Figura 1 - Ejemplo de interfaz de usuario básica

Salida con PDF abierto en una nueva pestaña

Cómo abrir un PDF en una nueva pestaña en Blazor: Figura 2 - Primer PDF abierto en nueva pestaña

Trabajar con contenido HTML dinámico

Para generar PDFs a partir de contenido dinámico en lugar de URLs, modifica tu enfoque 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");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

El método GenerateFromHtml demuestra cómo IronPDF puede generar un PDF a partir de marcas HTML generadas dinámicamente en lugar de una URL existente. Construye una cadena de HTML completa que contiene un encabezado, contenido y datos dinámicos. La solución para la generación de contenido dinámico es el método RenderHtmlAsPdf.

Ubicación actualizada del servidor Blazor

Cómo abrir un PDF en una nueva pestaña en Blazor: Figura 3 - Ejemplo de interfaz de usuario actualizada para tu proyecto de Servidor

PDF abierto en una nueva pestaña del navegador

Cómo abrir un PDF en una nueva pestaña en Blazor: Figura 4 - Ejemplo de PDF dinámico creado y luego abierto en nueva pestaña

Cómo resolver problemas comunes

Compatibilidad entre navegadores

Diferentes navegadores manejan los URLs de blob de manera diferente. Prueba tu implementación en Chrome, Firefox, Edge y Safari para asegurar un comportamiento consistente.

Archivos pesados

Para documentos PDF grandes, considera implementar almacenamiento en caché del lado del servidor para mejorar el rendimiento:

services.AddMemoryCache();
// Cache generated PDFs to avoid regeneration
services.AddMemoryCache();
// Cache generated PDFs to avoid regeneration
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Alternativas de navegación

Además de la interoperabilidad con JavaScript, puede servir archivos PDF a través de un middleware de archivos estáticos y utilizar etiquetas de anclaje HTML estándar para una opción de navegación alternativa:

<a href="/pdfs/document.pdf" target="_blank">Open PDF</a>
<a href="/pdfs/document.pdf" target="_blank">Open PDF</a>
HTML

Este enfoque funciona bien para PDF pregenerados, pero carece de las capacidades de generación dinámica del método de interoperabilidad JS.

Mejores prácticas

  1. Manejo de errores: Siempre envuelve la generación de PDFs en bloques try-catch y proporciona mensajes de error significativos a los usuarios cuando ocurre un problema.

  2. Rendimiento: Utiliza patrones async/await para prevenir el bloqueo de la interfaz de usuario durante la generación de PDFs.

  3. Experiencia del usuario: Muestra indicadores de carga durante la generación y maneja los escenarios de bloqueadores de ventanas emergentes de manera adecuada.

  4. Manipulación del DOM: Recuerda que C# en el servidor no puede manipular el DOM del cliente directamente; por eso es esencial la interoperabilidad con JS. No necesitas establecer manualmente la altura o el ancho de la nueva ventana, ya que el navegador maneja al visor de PDF.

  5. Seguridad: Valida y sanitiza la entrada del usuario antes de generar PDFs.

Conclusión

La combinación de las potentes capacidades de generación de PDF de IronPDF con la interoperabilidad JavaScript de Blazor proporciona una solución sólida para abrir PDF en nuevas pestañas del navegador. Este enfoque permite a los desarrolladores crear documentos PDF dinámicos y profesionales que se integran perfectamente con las aplicaciones modernas de Blazor construidas sobre la tecnología .NET de Microsoft.

¿Listo para implementar la funcionalidad de PDF en tu proyecto de Blazor? Comience su prueba gratuita de IronPDF hoy mismo. La prueba incluye funcionalidad completa sin marcas de agua y soporte integral para asegurar tu éxito.

Preguntas Frecuentes

¿Cómo puedo abrir un PDF en una nueva pestaña usando Blazor?

Puedes abrir un PDF en una nueva pestaña en Blazor usando IronPDF para generar el PDF y la interoperabilidad con JavaScript para mostrarlo en una nueva pestaña del navegador.

¿Cuál es el papel de IronPDF en las aplicaciones Blazor?

IronPDF se utiliza en aplicaciones Blazor para generar documentos PDF, permitiendo a los desarrolladores crear y manipular PDFs programáticamente dentro de sus aplicaciones.

¿Por qué se utiliza interoperabilidad con JavaScript en Blazor para abrir PDFs?

La interoperabilidad con JavaScript se utiliza en Blazor para interactuar con funcionalidades del navegador, como abrir una nueva pestaña, lo cual es necesario para mostrar PDFs generados por IronPDF de manera amigable para el usuario.

¿Puedo implementar visualización de PDF en una aplicación Blazor Server?

Sí, puedes implementar visualización de PDF en una aplicación Blazor Server usando IronPDF para generar el PDF y la interoperabilidad con JavaScript para abrirlo en una nueva pestaña para una experiencia de usuario fluida.

¿Cuáles son los beneficios de abrir PDFs en una nueva pestaña en aplicaciones Blazor?

Abrir PDFs en una nueva pestaña mejora la experiencia del usuario al permitir que los usuarios vean documentos sin navegar fuera de la página actual, manteniendo intacto el estado de la aplicación.

¿Es posible personalizar la salida de PDF en Blazor usando IronPDF?

Sí, IronPDF te permite personalizar la salida de PDF en aplicaciones Blazor, incluyendo establecer encabezados, pies de página y aplicar estilos para cumplir con requisitos de diseño específicos.

¿Qué versión de Blazor se utiliza en el tutorial para abrir PDFs?

El tutorial se centra en una versión de Blazor Server para demostrar cómo abrir PDFs en una nueva pestaña usando IronPDF e interoperabilidad con JavaScript.

¿Cómo mejora IronPDF el manejo de documentos en Blazor?

Usar IronPDF en Blazor mejora el manejo de documentos al proporcionar capacidades robustas de generación y manipulación de PDF, facilitando la creación de PDFs de calidad profesional directamente desde tu aplicación.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más