IRONSOFTWAREHOME
USANDO IRONPDF

Fusionar matrices de bytes PDF en C# — VeriFactu, Facturae y LOPDGDD en España | IronPDF

Curtis Chau
Curtis Chau
Updated: 9 de marzo de 2026

Recuperar un archivo PDF de una base de datos en ASP.NET usando C# requiere tres pasos: consultar la tabla de la base de datos por la columna BLOB binaria, cargar los bytes en un objeto PdfDocument usando IronPDF, y devolver los bytes al navegador a través de una respuesta Contenido del archivoResult o File(). IronPDF se encarga de las funciones de renderizado, marca de agua y seguridad para que usted pueda concentrarse en la lógica de acceso a los datos.

¿Cómo instalar IronPDF para ASP.NET?

Antes de escribir cualquier código de recuperación de PDF, agregue IronPDF a su proyecto a través del Administrador de paquetes NuGet :

PM > Install-Package IronPdf

Después de la instalación, configure su clave de licencia en Program.cs o appsettings.json antes de llamar a cualquier método de IronPDF:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

IronPDF es compatible con .NET 10 , .NET 8, .NET 6 y .NET Framework 4.6.2+. Funciona en Windows, Linux y macOS sin necesidad de dependencias adicionales ni instalaciones de navegadores sin interfaz gráfica. Está disponible una licencia de prueba gratuita para evaluación.

¿Cómo se configura la tabla de base de datos de SQL Server?

El enfoque más común es almacenar archivos PDF como datos binarios en una columna VARBINARY(MAX) de SQL Server. Esto mantiene el documento y sus metadatos juntos en una sola tabla, simplifica la copia de seguridad y evita la administración de rutas del sistema de archivos.

Utilice el siguiente script SQL para crear la tabla de almacenamiento:

// SQL Server table definition (run this in SSMS or via EF migrations)
// CREATE TABLE PdfDocuments (
//     Id INT IDENTITY(1,1) PRIMARY KEY,
//     FileName NVARCHAR(255) NOT NULL,
//     FileContent VARBINARY(MAX) NOT NULL,
//     UploadedAt DATETIME2 DEFAULT GETUTCDATE()
// );

Una vez que la tabla exista, configure la cadena de conexión en appsettings.json:

// appsettings.json snippet (not C# -- shown as reference)
// "ConnectionStrings": {
//   "DefaultConnection": "Server=localhost;Database=PdfStorage;Integrated Security=True;"
// }

Registre la cadena de conexión mediante inyección de dependencias en Program.cs:

using Microsoft.Extensions.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddSingleton<IConfiguration>(builder.Configuration);

IronPdf.License.LicenseKey = builder.Configuration["IronPdf:LicenseKey"];

var app = builder.Build();
app.MapControllers();
app.Run();

¿Cómo recuperar un PDF de SQL Server en ASP.NET Core?

El patrón de recuperación sigue tres pasos: abrir una conexión, ejecutar una consulta SELECT parametrizada y leer la columna binaria en un byte[]. IronPDF luego carga esa matriz en un objeto PdfDocument para procesamiento opcional antes de enviarlo al cliente.

Construyendo el controlador de API

Cree un controlador que exponga puntos finales GET tanto para la visualización en línea como para la descarga de archivos:

using IronPdf;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.SqlClient;

[ApiController]
[Route("api/[controller]")]
public class PdfController : ControllerBase
{
    private readonly string _connectionString;

    public PdfController(IConfiguration configuration)
    {
        _connectionString = configuration.GetConnectionString("DefaultConnection")
            ?? throw new InvalidOperationException("Connection string not found.");
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> GetPdf(int id)
    {
        byte[] pdfBytes = await RetrievePdfBytesAsync(id);
        if (pdfBytes is null || pdfBytes.Length == 0)
            return NotFound("PDF document not found.");

        // Load into IronPDF for validation or optional modification
        using var pdfDocument = new PdfDocument(pdfBytes);

        // Inline display -- browser opens PDF viewer
        Response.Headers.Append("Content-Disposition", "inline; filename=\"document.pdf\"");
        return File(pdfDocument.BinaryData, "application/pdf");
    }

    private async Task<byte[]> RetrievePdfBytesAsync(int documentId)
    {
        await using var connection = new SqlConnection(_connectionString);
        await connection.OpenAsync();

        const string query = "SELECT FileContent FROM PdfDocuments WHERE Id = @Id";
        await using var command = new SqlCommand(query, connection);
        command.Parameters.AddWithValue("@Id", documentId);

        var result = await command.ExecuteScalarAsync();
        return result as byte[] ?? Array.Empty<byte>();
    }
}

Este controlador usa consultas parametrizadas para prevenir la inyección SQL y await using para desechar SqlConnection y SqlCommand correctamente. La clase PdfDocument valida la matriz de bytes y expone la propiedad BinaryData para transmisión.

Devolución de un archivo con nombre para su descarga

Cuando los usuarios necesitan guardar el documento en lugar de verlo en línea, configure el encabezado Content-Disposition a attachment y pase el nombre de archivo original:

[HttpGet("download/{id}")]
public async Task<IActionResult> DownloadPdf(int id)
{
    await using var connection = new SqlConnection(_connectionString);
    await connection.OpenAsync();

    const string query = "SELECT FileName, FileContent FROM PdfDocuments WHERE Id = @Id";
    await using var command = new SqlCommand(query, connection);
    command.Parameters.AddWithValue("@Id", documentId);

    await using var reader = await command.ExecuteReaderAsync();
    if (!await reader.ReadAsync())
        return NotFound("Document not found.");

    var fileName = reader.GetString(reader.GetOrdinal("FileName"));
    var pdfBytes = (byte[])reader["FileContent"];

    using var pdfDocument = new PdfDocument(pdfBytes);
    return File(pdfDocument.BinaryData, "application/pdf", fileName);
}

Pasar fileName como tercer argumento a File() establece automáticamente el encabezado Content-Disposition a attachment. ASP.NET Core maneja la correcta comilla de nombres de archivos que contienen espacios.

¿Cómo agregar una marca de agua a un PDF recuperado?

Una de las operaciones posteriores a la recuperación más prácticas es estampar una marca de agua en cada página antes de entregar el documento. Esto es útil para informes confidenciales, borradores de documentos o cualquier archivo que necesite una marca de seguridad visible.

Cómo aplicar una marca de agua HTML con IronPDF

La API de marca de agua de IronPDF acepta cualquier cadena HTML, lo que significa que puedes diseñar el texto de la marca de agua usando CSS en línea. Establezca la opacidad lo suficientemente baja para que el contenido subyacente permanezca legible:

[HttpGet("watermarked/{id}")]
public async Task<IActionResult> GetWatermarkedPdf(int id)
{
    byte[] pdfBytes = await RetrievePdfBytesAsync(id);
    if (pdfBytes is null || pdfBytes.Length == 0)
        return NotFound("PDF document not found.");

    using var pdfDocument = new PdfDocument(pdfBytes);

    // HTML watermark applied to every page
    string watermarkHtml = "<h2 style='color:red; opacity:0.4; font-family:Arial;'>CONFIDENTIAL</h2>";
    pdfDocument.ApplyWatermark(
        watermarkHtml,
        rotation: 30,
        verticalAlignment: VerticalAlignment.Middle,
        horizontalAlignment: HorizontalAlignment.Center
    );

    return File(pdfDocument.BinaryData, "application/pdf");
}

El método ApplyWatermark acepta HTML y CSS estándar, por lo que tienes control total sobre la fuente, el color, la opacidad y la posición. La marca de agua se aplica automáticamente a todas las páginas del documento. Para características adicionales de manipulación de PDF, incluyendo estampar imágenes, agregar encabezados y pies de página, o fusionar múltiples documentos, consulte la documentación de IronPDF.

¿Cómo almacenar archivos PDF cargados nuevamente en SQL Server?

Para completar el viaje de ida y vuelta se requiere un punto final de carga que lea los archivos de formulario entrantes y los escriba en la base de datos. Esto se combina con los puntos finales de recuperación anteriores para formar un sistema completo de gestión de documentos:

[HttpPost("upload")]
public async Task<IActionResult> UploadPdf(IFormFile file)
{
    if (file is null || file.Length == 0)
        return BadRequest("No file uploaded.");

    if (!file.ContentType.Equals("application/pdf", StringComparison.OrdinalIgnoreCase))
        return BadRequest("Only PDF files are accepted.");

    using var memoryStream = new MemoryStream();
    await file.CopyToAsync(memoryStream);
    byte[] pdfBytes = memoryStream.ToArray();

    // Validate using IronPDF before storage
    using var pdfDocument = new PdfDocument(pdfBytes);

    await using var connection = new SqlConnection(_connectionString);
    await connection.OpenAsync();

    const string insertQuery = @"
        INSERT INTO PdfDocuments (FileName, FileContent)
        VALUES (@FileName, @FileContent);
        SELECT SCOPE_IDENTITY();";

    await using var command = new SqlCommand(insertQuery, connection);
    command.Parameters.AddWithValue("@FileName", file.FileName);
    command.Parameters.AddWithValue("@FileContent", pdfDocument.BinaryData);

    var newId = Convert.ToInt32(await command.ExecuteScalarAsync());
    return Ok(new { id = newId, fileName = file.FileName });
}

Usar PdfDocument para validar antes del almacenamiento asegura que solo archivos PDF analizables y bien formados ingresen a la base de datos. Si la matriz de bytes está dañada o truncada, IronPDF lanza una excepción que puede capturar y devolver como una respuesta 400 Bad Request.

¿Cuáles son las tablas y tipos de columnas clave para el almacenamiento de PDF?

El esquema que utilice afectará el rendimiento de la consulta y la eficiencia del almacenamiento. La siguiente tabla muestra la configuración de columnas recomendada para SQL Server:

Esquema de SQL Server recomendado para el almacenamiento de BLOB PDF
ColumnaTipo de datosObjetivo
IdINT IDENTITYClave principal, incremento automático
FileNameNVARCHAR(255)Nombre de archivo original para los encabezados de descarga
FileContentVARBINARY(MAX)Datos binarios PDF sin procesar (BLOB)
ContentTypeNVARCHAR(100)Tipo MIME, p. ej., application/pdf
FileSizeBytesBIGINTTamaño almacenado para la gestión de cuotas
UploadedAtDATETIME2Marca de tiempo UTC para auditoría
UploadedByNVARCHAR(100)Identificador de entidad de usuario para control de acceso

Para sistemas de gran escala donde se necesita la transmisión de archivos de SQL Server, Microsoft documenta la función FILESTREAM como una alternativa que almacena BLOB grandes en el sistema de archivos y al mismo tiempo permite realizar consultas a través de T-SQL. Sin embargo, para la mayoría de las aplicaciones ASP.NET que sirven documentos de hasta unos cientos de megabytes, el almacenamiento en fila VARBINARY(MAX) funciona bien y simplifica el despliegue.

¿Cómo gestionar los errores y optimizar el rendimiento?

La recuperación confiable de PDF en producción requiere manejo de errores en cada capa: base de datos, IronPDF y respuesta HTTP. La siguiente tabla resume las prácticas clave:

Manejo de errores y patrones de rendimiento para la recuperación de PDF
InquietudRecomendaciónRazón
Eliminación de la conexiónawait using declaracionesPreviene el agotamiento del grupo de conexiones
Eliminación de documentos PDFusing declaracionesLibera rápidamente la memoria no administrada
Inyección SQLSolo consultas parametrizadasEvita que entradas maliciosas alteren las consultas
Validación del tipo de archivoComprobar el tipo MIME y los bytes mágicosBloquea cargas que no sean PDF antes del almacenamiento
Manejo de archivos grandesRespuesta de transmisión con FileStreamResultEvita cargar el archivo completo en la memoria del servidor
CachéUtilice IMemoryCache o IDistributedCacheReduce los viajes repetidos de ida y vuelta a la base de datos
Operaciones asincrónicasasync / await durante todo el procesoMantiene los subprocesos libres durante las esperas de disco y red

Para la gestión de cadenas de conexión, almacene el valor en appsettings.json y nunca lo codifique directamente en los archivos fuente. Utilice la administración de secretos integrada de ASP.NET Core durante el desarrollo local y Azure Key Vault o AWS Secrets Manager en producción. Nunca envíe cadenas de conexión ni claves de licencia al control de código fuente.

Al servir archivos PDF grandes, considere devolver un FileStreamResult respaldado por un MemoryStream en lugar de cargar toda la matriz de bytes en la memoria. Para documentos muy grandes (más de 100 MB), la API FILESTREAM de SQL Server permite la transmisión fragmentada directamente desde el sistema de archivos.

Almacenamiento en caché de documentos de acceso frecuente

Si ciertos archivos PDF se solicitan repetidamente -- por ejemplo, un documento de términos y condiciones o un catálogo de productos -- almacenar en caché la matriz de bytes en IMemoryCache evita repetidos viajes de ida y vuelta al base de datos. Registre IMemoryCache en Program.cs con builder.Services.AddMemoryCache(), luego inyectelo en el controlador y verifique la caché antes de consultar la base de datos. Establezca una fecha de caducidad absoluta que coincida con la frecuencia de actualización esperada de los documentos. Cuando se actualiza un documento, elimina la entrada almacenada en caché por clave para que la próxima solicitud obtenga la nueva versión.

Para escenarios distribuidos -- como un despliegue equilibrado con múltiples instancias de servidor -- reemplace IMemoryCache con IDistributedCache respaldado por Redis o SQL Server. Las abstracciones de caché distribuida de ASP.NET Core mantienen el código del controlador casi idéntico; solo cambia el registro en Program.cs.

¿Cómo implementar la recuperación de PDF en varias plataformas con IronPDF?

IronPDF funciona en Linux, Windows y macOS sin necesidad de una instalación independiente de Chromium ni de ningún cambio de configuración. El mismo paquete NuGet está dirigido a todas las plataformas, por lo que su controlador de PDF funciona de manera idéntica independientemente de si implementa en:

  • Servidor Windows con IIS
  • Contenedores de Ubuntu en Docker o Kubernetes
  • Servicio de aplicaciones de Azure (Linux o Windows)
  • AWS Elastic Beanstalk

Implementación en Docker y Linux

Para implementaciones de Docker, agregue las dependencias de IronPDF a su Dockerfile. La documentación de IronPDF para Linux proporciona los paquetes apt exactos necesarios para las imágenes base de Debian y Alpine. Un Dockerfile típico de varias etapas instala las dependencias del sistema operativo en la etapa de imagen en tiempo de ejecución y luego copia la aplicación ASP.NET publicada. Al usar Azure, la guía de implementación de Azure cubre la configuración de App Service, incluyendo la configuración de memoria y CPU que permite la representación de PDF a escala.

Dado que IronPDF incluye su propio motor de renderizado basado en Chromium, no es necesario instalar un navegador independiente en el servidor. Esto simplifica considerablemente las configuraciones de contenedores Linux en comparación con las soluciones que requieren un navegador a nivel de sistema. El equipo de IronPDF realiza pruebas con las imágenes base de Linux más comunes en cada lanzamiento, por lo que puede confiar en que un contenedor Alpine o Debian funcionará de inmediato.

Uso de Entity Framework Core en lugar de ADO .NET

IronPDF también se integra con Entity Framework Core como alternativa al formato ADO .NET sin formato. Si su proyecto ya usa EF Core, puede mapear la columna Contenido del archivo a una propiedad byte[] en una clase modelo y dejar que EF maneje la generación de la consulta. Este enfoque reduce significativamente el código repetitivo y facilita la incorporación de filtrado, paginación y comportamiento de auditoría a través del proveedor LINQ de EF.

La desventaja es que EF Core carga el BLOB completo en la memoria como parte del gráfico de entidades. Para archivos PDF muy grandes, considere usar ADO.NET en crudo o el método FromSql de EF Core con una proyección que seleccione solo la columna de matriz de bytes en lugar de la entidad completa.

¿Cuales son tus próximos pasos?

Recuperar archivos PDF de una base de datos SQL Server en ASP.NET Core usando C# e IronPDF sigue un patrón claro: consultar la columna BLOB con un SELECT parametrizado, cargar los bytes en un PdfDocument, y devolver los datos binarios con el encabezado Content-Disposition correcto. IronPDF agrega la capacidad de validar, marcar con marca de agua, fusionar o proteger documentos antes de que salgan de su servidor.

Para profundizar en las capacidades de gestión de documentos de IronPDF, explore estos recursos:

Comience con una licencia de prueba gratuita de IronPDF para probar todas las funciones sin restricciones. La versión de prueba produce una salida con marca de agua; Eliminar la marca de agua aplicando una clave de licencia paga. La documentación de referencia completa de la API y ejemplos de código están disponibles en el sitio web de IronPDF para cada método utilizado en este artículo.

Si su proyecto ya utiliza Entity Framework Core, la guía de integración de IronPDF con EF Core muestra cómo reemplazar ADO .NET sin procesar con modelos de entidad, manteniendo la misma canalización de procesamiento de IronPDF . Para los equipos que trabajan con .NET 10 y las últimas características de ASP.NET Core , los mismos patrones descritos aquí funcionan sin modificaciones: IronPDF es compatible con todas las versiones activas de .NET LTS y STS.

Revise la página de precios de IronPDF para encontrar el nivel de licencia adecuado para su implementación. Una única licencia de desarrollador cubre el desarrollo y las pruebas locales; Las licencias de redistribución están disponibles para productos SaaS e implementaciones locales con múltiples servidores.

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 estructurados y visualmente atractivos.

...
Leer más

Artículos Relacionados

Key in blue circle

Obtenga su clave de prueba gratuita de 30 días al instante.

Sin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.

bullet_checkedNo se requiere tarjeta de crédito ni creación de cuentaSin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Reserve su Demostración en Vivo gratuita
Booking Badge

Confiado por millones de ingenieros en todo el mundo

Logos de clientes de Iron Software
Obtén tu Consulta Sin Compromiso
Completa el formulario a continuación o envía un correo a sales@ironsoftware.com
Tus detalles siempre serán mantenidos confidenciales.
Confiado por millones de ingenieros en todo el mundo
Logos de clientes de Iron Software
Obtenga su Clave de Prueba de 30 días gratis al instante.
No se requiere tarjeta de crédito ni creación de cuenta