
Cómo Crear un Visor PDF de Blazor Usando IronPDF
Las tareas de impresión de archivos PDF en ASP .NET a menudo implican desafíos únicos que los desarrolladores con frecuencia encuentran. Ya sea que estés generando documentos PDF para facturas, informes o etiquetas de envío, implementar una funcionalidad de impresión confiable requiere navegar por las complejidades de la arquitectura cliente-servidor.
En este artículo, te mostraremos cómo manejar tareas de impresión PDF usando la poderosa biblioteca PDF de IronPDF para .NET.
Entendiendo el reto
Las aplicaciones de escritorio tradicionales pueden acceder directamente a la impresora predeterminada, pero las aplicaciones ASP.NET Core enfrentan varios obstáculos al imprimir documentos PDF:
// This fails in ASP.NET - wrong approach
Process.Start(@"C:\Files\document.pdf"); // Works locally, crashes on server' This fails in ASP.NET - wrong approach
Process.Start("C:\Files\document.pdf") ' Works locally, crashes on serverEl código anterior ilustra un error común. El entorno del servidor carece de acceso directo a la impresora, y el sistema arroja errores debido a las restricciones de permisos de IIS. Otra cosa a recordar es que las aplicaciones web deben manejar eficazmente tanto los escenarios de impresión del lado del servidor como del lado del cliente.
Introducción a IronPDF
IronPDF proporciona una solución completa .NET Core para generar documentos PDF e imprimirlos sin dependencias externas como Adobe Reader. Vamos a instalar el paquete IronPDF usando NuGet:
Esta biblioteca .NET funciona sin problemas en todos los sistemas operativos, eliminando problemas de compatibilidad que afectan a otras bibliotecas. Esta herramienta funciona bien en Microsoft Windows y otros entornos de sistemas operativos.
Creación e impresión de documentos PDF del lado del servidor con la impresora predeterminada
Aquí te mostramos cómo generar e imprimir un documento PDF desde marcado HTML en tu controlador ASP.NET:
using IronPdf;
using Microsoft.AspNetCore.Mvc;
using System.Drawing;
public class PdfController : Controller
{
public IActionResult Index()
{
// Initialize the renderer
var renderer = new ChromePdfRenderer();
// Configure print-optimized settings
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
// Generate PDF from HTML
var pdf = renderer.RenderHtmlAsPdf("<h1>Invoice</h1><p>Total: $999</p>");
// Print to default printer
pdf.Print();
return Ok("Document sent to printer");
}
}
ChromePdfRenderer maneja la conversión manteniendo el estilo CSS y el formato de tamaño de fuente. Este ejemplo muestra la impresión básica a la impresora predeterminada sin interacción del usuario.
Resultado
Configuración de impresoras en red
Para entornos empresariales que requieren asignación específica de impresoras:
public IActionResult PrintToNetworkPrinter(string filePath)
{
// Load existing PDF file
var pdfDocument = PdfDocument.FromFile(filePath);
// Get print document for advanced settings
var printDocument = pdfDocument.GetPrintDocument();
// Specify network printer
printDocument.PrinterSettings.PrinterName = @"\\server\printer";
printDocument.PrinterSettings.Copies = 2;
// Configure page settings
printDocument.DefaultPageSettings.Landscape = false;
var renderer = printDocument.PrinterSettings.PrinterResolution;
// Execute print
printDocument.Print();
return Json(new { success = true });
}Public Function PrintToNetworkPrinter(filePath As String) As IActionResult
' Load existing PDF file
Dim pdfDocument = PdfDocument.FromFile(filePath)
' Get print document for advanced settings
Dim printDocument = pdfDocument.GetPrintDocument()
' Specify network printer
printDocument.PrinterSettings.PrinterName = "\\server\printer"
printDocument.PrinterSettings.Copies = 2
' Configure page settings
printDocument.DefaultPageSettings.Landscape = False
Dim renderer = printDocument.PrinterSettings.PrinterResolution
' Execute print
printDocument.Print()
Return Json(New With {.success = True})
End FunctionEste enfoque proporciona control total sobre la configuración de la impresora, incluyendo formato de papel y resolución, lo cual es vital para el dibujo y maquetación correctos.
Resultado

Confirmación de impresión

Estrategia de impresión del lado del cliente
Dado que los navegadores restringen el acceso directo a impresoras, implementa la impresión del lado del cliente proporcionando el archivo PDF para su descarga:
public IActionResult GetRawPrintablePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(GetInvoiceHtml());
// This header tells the browser to display the file inline.
// We use IHeaderDictionary indexer to prevent ArgumentException.
**HttpContext context**.Response.Headers["Content-Disposition"] = "inline; filename=invoice.pdf";
return File(pdf.BinaryData, "application/pdf");
}
public IActionResult PrintUsingClientWrapper()
{
var printUrl = Url.Action(nameof(GetRawPrintablePdf));
// Use a simple HTML/JavaScript wrapper to force the print dialog
var html = new StringBuilder();
html.AppendLine("<!DOCTYPE html>");
html.AppendLine("<html lang=\"en\">");
html.AppendLine("<head>");
html.AppendLine(" <title>Print Document</title>");
html.AppendLine("</head>");
html.AppendLine("<body>");
// Load the PDF from the 'GetRawPrintablePdf' action into an invisible iframe.
html.AppendLine($" <iframe src='{printUrl}' style='position:absolute; top:0; left:0; width:100%; height:100%; border:none;'></iframe>");
html.AppendLine(" <script>");
// Wait for the iframe (and thus the PDF) to load, then trigger the print dialog.
html.AppendLine(" window.onload = function() {");
html.AppendLine(" // Wait briefly to ensure the iframe content is rendered before printing.");
html.AppendLine(" setTimeout(function() {");
html.AppendLine(" window.print();");
html.AppendLine(" }, 100);");
html.AppendLine(" };");
html.AppendLine(" </script>");
html.AppendLine("</body>");
html.AppendLine("</html>");
return Content(html.ToString(), "text/html");
}
private string GetInvoiceHtml()
{
// Build HTML with proper structure
return @"
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
.header { font-weight: bold; color: #1e40af; border-bottom: 2px solid #3b82f6; padding-bottom: 5px; }
.content { padding-top: 10px; }
</style>
</head>
<body>
<div class='header'>Invoice Summary (Client View)</div>
<div class='content'>
<p>Document content: This file is optimized for printing.</p>
<p>Total Amount: <b>$999.00</b></p>
</div>
</body>
</html>";
}
El documento PDF se abre en el navegador donde los usuarios pueden activar la impresión a través de su impresora predeterminada usando los cuadros de diálogo de impresión estándar del navegador. Este enfoque es superior a realizar una solicitud directa desde el lado del servidor para la impresión.
Resultado

Trabajar con varias entradas de código fuente
IronPDF maneja de manera flexible varias entradas de código fuente, lo cual es importante notar para los desarrolladores que buscan crear código de impresión dinámico:
public async Task<IActionResult> PrintFromMultipleSources()
{
var renderer = new ChromePdfRenderer();
// From URL
var pdfFromUrl = await renderer.RenderUrlAsPdfAsync("https://example.com");
// From HTML file path
var pdfFromFile = renderer.RenderHtmlFileAsPdf(@"Templates\report.html");
var pdfToStream = renderer.RenderHtmlAsPdf("<h2>PDF from Memory Stream</h2><p>This content was loaded into memory first.</p>");
// Now, write the valid PDF bytes to the stream
using (var stream = new MemoryStream(pdfToStream.BinaryData))
{
var pdfFromStream = new PdfDocument(stream);
// Example: Print the PDF loaded from the stream
// pdfFromStream.Print();
}
pdfFromUrl.Print();
// Logging the various files handled
var fileList = new List<string> { "URL", "File Path", "Memory Stream" };
return Ok("PDF documents processed and 'example.com' printed to default server printer.");
}Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Imports System.IO
Public Class YourController
Inherits Controller
Public Async Function PrintFromMultipleSources() As Task(Of IActionResult)
Dim renderer = New ChromePdfRenderer()
' From URL
Dim pdfFromUrl = Await renderer.RenderUrlAsPdfAsync("https://example.com")
' From HTML file path
Dim pdfFromFile = renderer.RenderHtmlFileAsPdf("Templates\report.html")
Dim pdfToStream = renderer.RenderHtmlAsPdf("<h2>PDF from Memory Stream</h2><p>This content was loaded into memory first.</p>")
' Now, write the valid PDF bytes to the stream
Using stream = New MemoryStream(pdfToStream.BinaryData)
Dim pdfFromStream = New PdfDocument(stream)
' Example: Print the PDF loaded from the stream
' pdfFromStream.Print()
End Using
pdfFromUrl.Print()
' Logging the various files handled
Dim fileList = New List(Of String) From {"URL", "File Path", "Memory Stream"}
Return Ok("PDF documents processed and 'example.com' printed to default server printer.")
End Function
End ClassLas líneas anteriores demuestran cómo crear una nueva lista de fuentes de archivos manejadas. Cada método preserva la estructura del documento y los gráficos mientras mantiene la calidad de impresión.

Manejo y registro de errores
Implementa un manejo de errores robusto para entornos de producción:
using System.Drawing.Printing; // For PrinterSettings
// ... other usings ...
public IActionResult SafePrint(string documentId)
{
try
{
var pdf = LoadPdfDocument(documentId);
// Verify printer availability
if (!PrinterSettings.InstalledPrinters.Cast<string>()
.Contains("Target Printer"))
{
// Log error and handle gracefully
return BadRequest("Printer not available");
}
pdf.Print();
// Log successful output
return Ok($"Document {documentId} printed successfully");
}
catch (Exception ex)
{
// Log error details
return StatusCode(500, "Printing failed");
}
}Imports System.Drawing.Printing ' For PrinterSettings
' ... other Imports ...
Public Function SafePrint(documentId As String) As IActionResult
Try
Dim pdf = LoadPdfDocument(documentId)
' Verify printer availability
If Not PrinterSettings.InstalledPrinters.Cast(Of String)().Contains("Target Printer") Then
' Log error and handle gracefully
Return BadRequest("Printer not available")
End If
pdf.Print()
' Log successful output
Return Ok($"Document {documentId} printed successfully")
Catch ex As Exception
' Log error details
Return StatusCode(500, "Printing failed")
End Try
End FunctionEsto asegura una impresión confiable incluso cuando los recursos del sistema no están disponibles y es una parte clave de tu servicio de impresión.
Escenarios de salida
Impresora no disponible
Si la impresora especificada en el código no está disponible, el código proporcionará este mensaje de error:

PDF impreso con éxito
Si tu PDF se imprime exitosamente, deberías ver un mensaje de confirmación como:

Configuración avanzada
La estructura de carpetas de IronPDF admite escenarios complejos. La versión de la biblioteca IronPDF que uses puede afectar estas configuraciones:
public IActionResult ConfigureAdvancedPrinting(object sender, EventArgs e)
{
var renderer = new ChromePdfRenderer();
// Configure rendering options
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.RenderDelay = 500; // Wait for dynamic content
// Generate complex PDF documents
var pdf = renderer.RenderHtmlAsPdf(GetDynamicContent());
// Apply security settings
pdf.SecuritySettings.AllowUserPrinting = true;
pdf.MetaData.Author = "Your Company";
return File(pdf.BinaryData, "application/pdf");
}Public Function ConfigureAdvancedPrinting(sender As Object, e As EventArgs) As IActionResult
Dim renderer = New ChromePdfRenderer()
' Configure rendering options
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.RenderDelay = 500 ' Wait for dynamic content
' Generate complex PDF documents
Dim pdf = renderer.RenderHtmlAsPdf(GetDynamicContent())
' Apply security settings
pdf.SecuritySettings.AllowUserPrinting = True
pdf.MetaData.Author = "Your Company"
Return File(pdf.BinaryData, "application/pdf")
End FunctionEl comando para imprimir es simplemente pdf.Print() una vez que el documento ha sido generado.
Alternativa a IronPrint
Para requisitos de impresión especializados, Iron Software también ofrece IronPrint, una biblioteca de impresión .NET dedicada con soporte mejorado multiplataforma. Puedes encontrar un enlace a más información en su sitio web. El parámetro principal es simplemente la ruta del archivo. La descripción del producto está disponible en su sitio web.
Conclusión
IronPDF transforma la impresión de PDF en ASP.NET de un desafío complejo a una implementación sencilla. Sin requerir Adobe Reader o dependencias externas, puedes generar e imprimir archivos PDF con un código mínimo. La biblioteca PDF maneja todo desde la conversión de HTML hasta la configuración de la impresora, haciéndola ideal para escenarios de automatización del lado del servidor e impresión del lado del cliente.
¿Listo para optimizar tu flujo de trabajo de impresión de PDF? Comienza hoy de forma gratuita con la prueba gratuita y experimenta cómo IronPDF simplifica el procesamiento de documentos en tus aplicaciones ASP.NET. Con documentación completa y soporte de ingeniería directo, tendrás la impresión de PDF lista para producción en minutos.

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 estructurados y visualmente atractivos.
Artículos Relacionados


