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

Como Recuperar Arquivos PDF de um Banco de Dados em ASP.NET Usando C#

Recuperar um arquivo PDF de um banco de dados em ASP.NET usando C# requer três etapas: consultar a tabela do banco de dados para a coluna BLOB binária, carregar os bytes em um objeto PdfDocument usando IronPDF, e retornar os bytes para o navegador via uma resposta Conteúdo do arquivoResult ou File(). O IronPDF cuida da renderização, da marca d'água e dos recursos de segurança, para que você possa se concentrar na lógica de acesso aos dados.

Como instalar o IronPDF para ASP.NET?

Antes de escrever qualquer código para recuperar PDFs, adicione o IronPDF ao seu projeto através do Gerenciador de Pacotes NuGet :

Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
SHELL

Após a instalação, defina sua chave de licença em Program.cs ou appsettings.json antes de chamar qualquer método IronPDF:

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

O IronPDF é compatível com .NET 10 , .NET 8, .NET 6 e .NET Framework 4.6.2+. Funciona no Windows, Linux e macOS sem exigir dependências adicionais ou instalações de navegador sem interface gráfica. Uma licença de avaliação gratuita está disponível para fins de teste.

Como configurar uma tabela no banco de dados SQL Server?

A abordagem mais comum é armazenar arquivos PDF como dados binários em uma coluna VARBINÁRIO(MÁXIMO) do SQL Server. Isso mantém o documento e seus metadados juntos em uma única tabela, simplifica o backup e evita o gerenciamento de caminhos do sistema de arquivos.

Utilize o seguinte script SQL para criar a tabela de armazenamento:

// SQL Server table definition (run this in SSMS or via EF migrations)
// CREATE TABLE PdfDocuments (
//     Eu ia IDENTIDADE INT(1,1) PRIMARY KEY,
//     Nome do arquivo NVARCHAR(255) NOT NULL,
//     Conteúdo do arquivo VARBINÁRIO(MÁXIMO) NOT NULL,
//     Enviado em DATA E HORA2 DEFAULT GETUTCDATE()
// );
// SQL Server table definition (run this in SSMS or via EF migrations)
// CREATE TABLE PdfDocuments (
//     Eu ia IDENTIDADE INT(1,1) PRIMARY KEY,
//     Nome do arquivo NVARCHAR(255) NOT NULL,
//     Conteúdo do arquivo VARBINÁRIO(MÁXIMO) NOT NULL,
//     Enviado em DATA E HORA2 DEFAULT GETUTCDATE()
// );
$vbLabelText   $csharpLabel

Uma vez que a tabela exista, configure a string de conexão em appsettings.json:

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

Registre a string de conexão via injeção de dependência em 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();
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();
Imports Microsoft.Extensions.DependencyInjection

Dim builder = WebApplication.CreateBuilder(args)
builder.Services.AddControllers()
builder.Services.AddSingleton(Of IConfiguration)(builder.Configuration)

IronPdf.License.LicenseKey = builder.Configuration("IronPdf:LicenseKey")

Dim app = builder.Build()
app.MapControllers()
app.Run()
$vbLabelText   $csharpLabel

Como recuperar um PDF do SQL Server em ASP.NET Core?

O padrão de recuperação segue três etapas: abrir uma conexão, executar uma consulta SELECT parametrizada e ler a coluna binária em um byte[]. IronPDF então carrega essa matriz em um objeto PdfDocument para processamento opcional antes de transmitir para o cliente.

Construindo o Controlador de API

Crie um controlador que exponha endpoints GET para exibição embutida e download de arquivos:

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 documentEu ia)
    {
        await using var connection = new SqlConnection(_connectionString);
        await connection.OpenAsync();

        const string query = "SELECT Conteúdo do arquivo FROM PdfDocuments WHERE Eu ia = @Eu ia";
        await using var command = new SqlCommand(query, connection);
        command.Parameters.AddWithValue("@Eu ia", documentEu ia);

        var result = await command.ExecuteScalarAsync();
        return result as byte[] ?? Array.Empty<byte>();
    }
}
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 documentEu ia)
    {
        await using var connection = new SqlConnection(_connectionString);
        await connection.OpenAsync();

        const string query = "SELECT Conteúdo do arquivo FROM PdfDocuments WHERE Eu ia = @Eu ia";
        await using var command = new SqlCommand(query, connection);
        command.Parameters.AddWithValue("@Eu ia", documentEu ia);

        var result = await command.ExecuteScalarAsync();
        return result as byte[] ?? Array.Empty<byte>();
    }
}
Imports IronPdf
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.Data.SqlClient

<ApiController>
<Route("api/[controller]")>
Public Class PdfController
    Inherits ControllerBase

    Private ReadOnly _connectionString As String

    Public Sub New(configuration As IConfiguration)
        _connectionString = configuration.GetConnectionString("DefaultConnection")
        If _connectionString Is Nothing Then
            Throw New InvalidOperationException("Connection string not found.")
        End If
    End Sub

    <HttpGet("{id}")>
    Public Async Function GetPdf(id As Integer) As Task(Of IActionResult)
        Dim pdfBytes As Byte() = Await RetrievePdfBytesAsync(id)
        If pdfBytes Is Nothing OrElse pdfBytes.Length = 0 Then
            Return NotFound("PDF document not found.")
        End If

        ' Load into IronPDF for validation or optional modification
        Using pdfDocument As New PdfDocument(pdfBytes)
            ' Inline display -- browser opens PDF viewer
            Response.Headers.Append("Content-Disposition", "inline; filename=""document.pdf""")
            Return File(pdfDocument.BinaryData, "application/pdf")
        End Using
    End Function

    Private Async Function RetrievePdfBytesAsync(documentId As Integer) As Task(Of Byte())
        Await Using connection As New SqlConnection(_connectionString)
            Await connection.OpenAsync()

            Const query As String = "SELECT FileContent FROM PdfDocuments WHERE Id = @Id"
            Await Using command As New SqlCommand(query, connection)
                command.Parameters.AddWithValue("@Id", documentId)

                Dim result = Await command.ExecuteScalarAsync()
                Return If(TryCast(result, Byte()), Array.Empty(Of Byte)())
            End Using
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

Este controlador usa consultas parametrizadas para prevenir injeção de SQL e await using para descartar SqlConnection e SqlCommand corretamente. A classe PdfDocument valida a matriz de bytes e expõe a propriedade BinaryData para streaming.

Retornando um arquivo nomeado para download

Quando os usuários precisam salvar o documento ao invés de visualizá-lo em linha, defina o cabeçalho Content-Disposition para attachment e passe o nome do arquivo 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 Nome do arquivo, Conteúdo do arquivo FROM PdfDocuments WHERE Eu ia = @Eu ia";
    await using var command = new SqlCommand(query, connection);
    command.Parameters.AddWithValue("@Eu ia", documentEu ia);

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

    var fileName = reader.GetString(reader.GetOrdinal("Nome do arquivo"));
    var pdfBytes = (byte[])reader["Conteúdo do arquivo"];

    using var pdfDocument = new PdfDocument(pdfBytes);
    return File(pdfDocument.BinaryData, "application/pdf", fileName);
}
[HttpGet("download/{id}")]
public async Task<IActionResult> DownloadPdf(int id)
{
    await using var connection = new SqlConnection(_connectionString);
    await connection.OpenAsync();

    const string query = "SELECT Nome do arquivo, Conteúdo do arquivo FROM PdfDocuments WHERE Eu ia = @Eu ia";
    await using var command = new SqlCommand(query, connection);
    command.Parameters.AddWithValue("@Eu ia", documentEu ia);

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

    var fileName = reader.GetString(reader.GetOrdinal("Nome do arquivo"));
    var pdfBytes = (byte[])reader["Conteúdo do arquivo"];

    using var pdfDocument = new PdfDocument(pdfBytes);
    return File(pdfDocument.BinaryData, "application/pdf", fileName);
}
Imports System.Data.SqlClient
Imports Microsoft.AspNetCore.Mvc

<HttpGet("download/{id}")>
Public Async Function DownloadPdf(id As Integer) As Task(Of IActionResult)
    Await Using connection As New SqlConnection(_connectionString)
        Await connection.OpenAsync()

        Const query As String = "SELECT Nome do arquivo, Conteúdo do arquivo FROM PdfDocuments WHERE Eu ia = @Eu ia"
        Await Using command As New SqlCommand(query, connection)
            command.Parameters.AddWithValue("@Eu ia", documentEu ia)

            Await Using reader = Await command.ExecuteReaderAsync()
                If Not Await reader.ReadAsync() Then
                    Return NotFound("Document not found.")
                End If

                Dim fileName As String = reader.GetString(reader.GetOrdinal("Nome do arquivo"))
                Dim pdfBytes As Byte() = CType(reader("Conteúdo do arquivo"), Byte())

                Using pdfDocument As New PdfDocument(pdfBytes)
                    Return File(pdfDocument.BinaryData, "application/pdf", fileName)
                End Using
            End Using
        End Using
    End Using
End Function
$vbLabelText   $csharpLabel

Passar fileName como o terceiro argumento para File() define o cabeçalho Content-Disposition para attachment automaticamente. O ASP.NET Core lida corretamente com a formatação de nomes de arquivos que contêm espaços.

Como adicionar uma marca d'água a um PDF recuperado?

Uma das operações pós-recuperação mais práticas é inserir uma marca d'água em cada página antes de disponibilizar o documento. Isso é útil para relatórios confidenciais, rascunhos de documentos ou qualquer arquivo que precise de uma marcação de segurança visível.

Aplicando uma marca d'água HTML com o IronPDF

A API de marca d'água do IronPDF aceita qualquer string HTML, o que significa que você pode estilizar o texto da marca d'água usando CSS embutido. Defina a opacidade em um nível suficientemente baixo para que o conteúdo subjacente permaneça legível:

[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");
}
[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");
}
Imports Microsoft.AspNetCore.Mvc

<HttpGet("watermarked/{id}")>
Public Async Function GetWatermarkedPdf(id As Integer) As Task(Of IActionResult)
    Dim pdfBytes As Byte() = Await RetrievePdfBytesAsync(id)
    If pdfBytes Is Nothing OrElse pdfBytes.Length = 0 Then
        Return NotFound("PDF document not found.")
    End If

    Using pdfDocument As New PdfDocument(pdfBytes)
        ' HTML watermark applied to every page
        Dim watermarkHtml As String = "<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")
    End Using
End Function
$vbLabelText   $csharpLabel

O método ApplyWatermark aceita HTML e CSS padrão, então você tem controle total sobre fonte, cor, opacidade e posição. A marca d'água é aplicada automaticamente a todas as páginas do documento. Para recursos adicionais de manipulação de PDFs, incluindo marcar imagens, adicionar cabeçalhos e rodapés, ou mesclar vários documentos, veja a documentação do IronPDF.

Como armazenar PDFs carregados de volta no SQL Server?

Para completar o processo de ida e volta, é necessário um endpoint de upload que leia os arquivos de formulário recebidos e os grave no banco de dados. Isso se combina com os pontos de extremidade de recuperação acima para formar um sistema completo de gerenciamento 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.Tipo de conteúdo.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 (Nome do arquivo, Conteúdo do arquivo)
        VALUES (@Nome do arquivo, @Conteúdo do arquivo);
        SELECT SCOPE_IDENTITY();";

    await using var command = new SqlCommand(insertQuery, connection);
    command.Parameters.AddWithValue("@Nome do arquivo", file.Nome do arquivo);
    command.Parameters.AddWithValue("@Conteúdo do arquivo", pdfDocument.BinaryData);

    var newEu ia = Convert.ToInt32(await command.ExecuteScalarAsync());
    return Ok(new { id = newEu ia, fileName = file.Nome do arquivo });
}
[HttpPost("upload")]
public async Task<IActionResult> UploadPdf(IFormFile file)
{
    if (file is null || file.Length == 0)
        return BadRequest("No file uploaded.");

    if (!file.Tipo de conteúdo.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 (Nome do arquivo, Conteúdo do arquivo)
        VALUES (@Nome do arquivo, @Conteúdo do arquivo);
        SELECT SCOPE_IDENTITY();";

    await using var command = new SqlCommand(insertQuery, connection);
    command.Parameters.AddWithValue("@Nome do arquivo", file.Nome do arquivo);
    command.Parameters.AddWithValue("@Conteúdo do arquivo", pdfDocument.BinaryData);

    var newEu ia = Convert.ToInt32(await command.ExecuteScalarAsync());
    return Ok(new { id = newEu ia, fileName = file.Nome do arquivo });
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Http
Imports Microsoft.AspNetCore.Mvc
Imports System.Data.SqlClient

<HttpPost("upload")>
Public Async Function UploadPdf(file As IFormFile) As Task(Of IActionResult)
    If file Is Nothing OrElse file.Length = 0 Then
        Return BadRequest("No file uploaded.")
    End If

    If Not file.ContentType.Equals("application/pdf", StringComparison.OrdinalIgnoreCase) Then
        Return BadRequest("Only PDF files are accepted.")
    End If

    Using memoryStream As New MemoryStream()
        Await file.CopyToAsync(memoryStream)
        Dim pdfBytes As Byte() = memoryStream.ToArray()

        ' Validate using IronPDF before storage
        Using pdfDocument As New PdfDocument(pdfBytes)

            Await Using connection As New SqlConnection(_connectionString)
                Await connection.OpenAsync()

                Const insertQuery As String = "
                    INSERT INTO PdfDocuments (FileName, FileContent)
                    VALUES (@FileName, @FileContent);
                    SELECT SCOPE_IDENTITY();"

                Await Using command As New SqlCommand(insertQuery, connection)
                    command.Parameters.AddWithValue("@FileName", file.FileName)
                    command.Parameters.AddWithValue("@FileContent", pdfDocument.BinaryData)

                    Dim newId As Integer = Convert.ToInt32(Await command.ExecuteScalarAsync())
                    Return Ok(New With {.id = newId, .fileName = file.FileName})
                End Using
            End Using
        End Using
    End Using
End Function
$vbLabelText   $csharpLabel

Usar PdfDocument para validar antes do armazenamento garante que apenas arquivos PDF parseáveis e bem-formados entrem no banco de dados. Se a matriz de bytes estiver corrompida ou truncada, o IronPDF lança uma exceção que pode ser capturada e retornada como uma resposta 400 Bad Request.

Quais são as principais tabelas e tipos de coluna para armazenamento de PDF?

O esquema que você utiliza afeta o desempenho das consultas e a eficiência do armazenamento. A tabela abaixo mostra a configuração de colunas recomendada para o SQL Server:

Esquema recomendado do SQL Server para armazenamento de BLOBs em PDF
Coluna Tipo de dados Propósito
Eu ia IDENTIDADE INT Chave primária, auto-incremento
Nome do arquivo NVARCHAR(255) Nome original do arquivo para os cabeçalhos de download
Conteúdo do arquivo VARBINÁRIO(MÁXIMO) Dados binários brutos em PDF (BLOB)
Tipo de conteúdo NVARCHAR(100) Tipo MIME, por exemplo, application/pdf
Tamanho do arquivo em bytes BIGINT Tamanho armazenado para gerenciamento de cotas
Enviado em DATA E HORA2 Carimbo de data/hora UTC para auditoria
Enviado por NVARCHAR(100) Eu iaentidade do usuário para controle de acesso

Para sistemas de grande escala onde o streaming de arquivos do SQL Server é necessário, a Microsoft documenta o recurso FILESTREAM como uma alternativa que armazena grandes BLOBs no sistema de arquivos, mantendo a possibilidade de consulta por meio de T-SQL. No entanto, para a maioria das aplicações ASP.NET que servem documentos de até algumas centenas de megabytes, VARBINÁRIO(MÁXIMO) armazenamento em linha funciona bem e simplifica o deployment.

Como lidar com erros e otimizar o desempenho?

A recuperação confiável de PDFs em produção exige tratamento de erros em cada camada: banco de dados, IronPDF e resposta HTTP. A tabela abaixo resume as principais práticas:

Tratamento de erros e padrões de desempenho para recuperação de PDFs
Preocupação Recomendação Razão
Descarte de conexão `await using` instruções Impede o esgotamento do pool de conexões
Descarte de documentos PDF `using` instruções Libera prontamente a memória não gerenciada.
Injeção de SQL Somente consultas parametrizadas Impede que entradas maliciosas alterem as consultas.
Validação do tipo de arquivo Verifique o tipo MIME e os bytes mágicos. Bloqueia uploads de arquivos que não sejam PDF antes do armazenamento.
Manipulação de arquivos grandes Resposta de fluxo com `FileStreamResult` Evita carregar o arquivo inteiro na memória do servidor.
Armazenamento em cache Use `IMemoryCache` ou `IDistributedCache` Reduz as repetidas viagens de ida e volta ao banco de dados.
Operações assíncronas `async` / `await` em todo o processo Mantém as threads livres durante esperas de disco e de rede.

Para gerenciamento de strings de conexão, armazene o valor em appsettings.json e nunca codifique diretamente em arquivos-fonte. Utilize o gerenciamento de segredos integrado do ASP.NET Core durante o desenvolvimento local e o Azure Key Vault ou o AWS Secrets Manager em produção. Nunca inclua strings de conexão ou chaves de licença no controle de versão.

Ao servir arquivos PDF grandes, considere retornar um FileStreamResult apoiado por um MemoryStream em vez de carregar toda a matriz de bytes na memória. Para documentos muito grandes -- acima de 100 MB -- a API FILESTREAM do SQL Server permite o streaming em partes diretamente do sistema de arquivos.

Armazenamento em cache de documentos acessados ​​frequentemente

Se certos arquivos PDF forem solicitados repetidamente -- por exemplo, um documento de termos e condições ou um catálogo de produtos -- o armazenamento em cache da matriz de bytes em IMemoryCache evita idas e vindas repetidas ao banco de dados. Registre IMemoryCache em Program.cs com builder.Services.AddMemoryCache(), depois injete no controlador e verifique o cache antes de consultar o banco de dados. Defina um prazo de expiração absoluto que corresponda à frequência de atualização esperada dos documentos. Quando um documento é atualizado, remova a entrada em cache pela chave para que a próxima solicitação busque a nova versão.

Para cenários distribuídos -- como um deployment balanceado por carga com várias instâncias de servidor -- substitua IMemoryCache por IDistributedCache apoiado por Redis ou SQL Server. As abstrações de cache distribuído do ASP.NET Core mantêm o código do controlador praticamente idêntico; apenas o registro em Program.cs muda.

Como implantar a recuperação de PDFs em várias plataformas com o IronPDF?

O IronPDF funciona em Linux, Windows e macOS sem exigir uma instalação separada do Chromium ou qualquer alteração de configuração. O mesmo pacote NuGet é compatível com todas as plataformas, portanto, seu controlador de PDF funciona da mesma forma, independentemente de você implantá-lo em:

  • Windows Server com IIS
  • Contêineres Ubuntu em Docker ou Kubernetes
  • Serviço de Aplicativos do Azure (Linux ou Windows)
  • AWS Elastic Beanstalk

Implantação em Docker e Linux

Para implantações em Docker, adicione as dependências do IronPDF ao seu Dockerfile. A documentação do IronPDF para Linux fornece os pacotes apt exatos necessários para as imagens base Debian e Alpine. Um Dockerfile típico de várias etapas instala as dependências do sistema operacional na etapa de imagem de tempo de execução e, em seguida, copia o aplicativo ASP.NET publicado por cima. Ao usar o Azure, o guia de implantação do Azure aborda a configuração do Serviço de Aplicativo, incluindo as configurações de memória e CPU que suportam a renderização de PDF em escala.

Como o IronPDF inclui seu próprio mecanismo de renderização baseado no Chromium, você não precisa instalar um navegador separado no servidor. Isso simplifica consideravelmente as configurações de contêineres Linux em comparação com soluções que exigem um navegador em nível de sistema. A equipe do IronPDF realiza testes com as imagens base do Linux mais comuns a cada lançamento, para que você possa ter certeza de que um contêiner Alpine ou Debian funcionará sem problemas.

Utilizando o Entity Framework Core em vez do .NET

O IronPDF também se integra ao Entity Framework Core como uma alternativa ao .NET puro. Se seu projeto já usa EF Core, você pode mapear a coluna Conteúdo do arquivo para uma propriedade byte[] em uma classe de modelo e deixar que o EF lide com a geração da consulta. Essa abordagem reduz significativamente o código repetitivo e facilita a adição de filtragem, paginação e auditoria por meio do provedor LINQ do Entity Framework.

A desvantagem é que o EF Core carrega todo o BLOB na memória como parte do grafo de entidades. Para arquivos PDF muito grandes, considere usar ADO.NET bruto ou o método FromSql do EF Core com uma projeção que selecione apenas a coluna de matriz de bytes ao invés da entidade completa.

Quais são os seus próximos passos?

Recuperar arquivos PDF de um banco de dados SQL Server em ASP.NET Core usando C# e IronPDF segue um padrão claro: consultar a coluna BLOB com um SELECT parametrizado, carregar os bytes em um PdfDocument, e retornar os dados binários com o cabeçalho Content-Disposition correto. O IronPDF adiciona a capacidade de validar, adicionar marcas d'água, mesclar ou proteger documentos antes que eles saiam do seu servidor.

Para explorar ainda mais os recursos de gerenciamento de documentos do IronPDF, consulte estes recursos:

Comece com uma licença de avaliação gratuita do IronPDF para testar todos os recursos sem restrições. O teste produz resultados com marca d'água; Remova a marca d'água aplicando uma chave de licença paga. A documentação completa da API e exemplos de código estão disponíveis no site da IronPDF para cada método usado neste artigo.

Se o seu projeto já utiliza o Entity Framework Core, o guia de integração do IronPDF com o EF Core mostra como substituir o .NET puro por modelos de entidade, mantendo o mesmo fluxo de processamento do IronPDF . Para equipes que trabalham com o .NET 10 e os recursos mais recentes do ASP.NET Core , os mesmos padrões descritos aqui funcionam sem modificações — o IronPDF é compatível com todas as versões LTS e STS ativas do .NET .

Consulte a página de preços do IronPDF para encontrar o nível de licença adequado à sua implementação. Uma única licença de desenvolvedor cobre o desenvolvimento e os testes locais; Licenças de redistribuição estão disponíveis para produtos SaaS e implantações locais com vários servidores.

Perguntas frequentes

O que é o IronPDF?

IronPDF é uma biblioteca .NET que permite aos desenvolvedores criar, editar e extrair conteúdo de arquivos PDF em aplicativos C#.

Como posso recuperar um arquivo PDF de um banco de dados usando ASP.NET?

Para recuperar um arquivo PDF de um banco de dados em ASP.NET, você pode usar código C# para consultar o banco de dados e ler os dados do PDF em uma matriz de bytes. Essa matriz de bytes pode então ser usada com o IronPDF para renderizar ou manipular o PDF conforme necessário.

Por que devo usar o IronPDF para manipular PDFs na minha aplicação ASP.NET?

O IronPDF oferece um conjunto amplo de recursos para manipulação de PDFs, incluindo geração de PDF, conversão de HTML e manipulação. Ele se integra com ASP.NET e fornece uma API fácil de usar para trabalhar com PDFs.

Quais são os pré-requisitos para usar o IronPDF em ASP.NET?

Para usar o IronPDF em ASP.NET, você precisa ter um ambiente de desenvolvimento .NET configurado, como o Visual Studio, e incluir a biblioteca IronPDF em seu projeto por meio do gerenciador de pacotes NuGet.

O IronPDF pode ser usado para editar arquivos PDF existentes?

Sim, o IronPDF pode ser usado para editar arquivos PDF existentes. Ele permite modificações como adicionar texto ou imagens, mesclar documentos e muito mais.

É possível converter HTML para PDF com o IronPDF?

Sim, o IronPDF pode converter conteúdo HTML diretamente para o formato PDF, facilitando a geração de PDFs a partir de páginas da web ou outros conteúdos HTML.

Como faço para gerenciar os recursos de segurança de PDF usando o IronPDF?

O IronPDF oferece suporte a vários recursos de segurança para PDFs, incluindo proteção por senha e configuração de permissões para controlar o acesso e a edição de documentos.

Que tipos de bases de dados são compatíveis com o IronPDF para recuperação de PDFs?

O IronPDF pode funcionar com qualquer banco de dados que armazene dados binários, como SQL Server, MySQL ou PostgreSQL, para recuperar e manipular arquivos PDF.

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