푸터 콘텐츠로 바로가기
IRONPDF 사용하기

ASP.NET에서 데이터베이스에서 PDF 파일을 검색하는 방법

ASP.NET에서 C#을 사용하여 데이터베이스에서 PDF 파일을 검색하려면 세 가지 단계가 필요합니다: 이진 BLOB 열을 쿼리하고, IronPDF를 사용하여 바이트를 PdfDocument 객체로 로드하며, FileContentResult 또는 File() 응답을 통해 브라우저에 바이트를 반환합니다. IronPDF는 렌더링, 워터마킹 및 보안 기능을 처리하여 데이터 액세스 로직에 집중할 수 있도록 합니다.

ASP.NET용 IronPDF를 어떻게 설치하나요?

PDF 검색 코드를 작성하기 전에 NuGet Package Manager를 통해 프로젝트에 IronPDF를 추가하세요.

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

설치 후, Program.cs 또는 appsettings.json에 라이센스 키를 설정한 후 IronPDF 메소드를 호출하십시오:

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

IronPDF는 .NET 10, .NET 8, .NET 6, 및 .NET Framework 4.6.2+를 지원합니다. 추가 종속성이나 헤드리스 브라우저 설치 없이 Windows, Linux, 및 macOS에서 작동합니다. 무료 체험 라이선스가 평가용으로 제공됩니다.

SQL Server 데이터베이스 테이블을 어떻게 설정하나요?

가장 일반적인 방법은 SQL Server VARBINARY(MAX) 열에 PDF 파일을 이진 데이터로 저장하는 것입니다. 이렇게 하면 문서와 메타데이터를 단일 테이블에 함께 보관할 수 있고, 백업을 단순화하며 파일 시스템 경로 관리를 피할 수 있습니다.

저장 테이블을 생성하기 위해 다음 SQL 스크립트를 사용하십시오.

// 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()
// );
// 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()
// );
$vbLabelText   $csharpLabel

테이블이 존재하는 경우 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

의존성 주입을 통해 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

ASP.NET Core에서 SQL Server로부터 PDF를 어떻게 가져오나요?

세 가지 단계로 검색 패턴을 따릅니다: 연결을 열고, 매개변수화된 SELECT 쿼리를 실행하며, 이진 열을 byte[]로 읽어옵니다. IronPDF는 그런 다음 배열을 PdfDocument 객체에 로드하여 선택적으로 처리한 후 클라이언트로 스트리밍합니다.

API 컨트롤러 구축

인라인 디스플레이와 파일 다운로드 모두를 위한 GET 엔드포인트를 노출하는 컨트롤러를 생성하세요:

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>();
    }
}
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>();
    }
}
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

이 컨트롤러는 매개변수화된 쿼리를 사용하여 SQL 삽입을 방지하고 await using를 사용하여 SqlConnectionSqlCommand을 올바르게 폐기합니다. PdfDocument 클래스는 바이트 배열을 검증하고 스트리밍을 위한 BinaryData 속성을 제공합니다.

다운로드를 위한 이름이 지정된 파일 반환

사용자가 문서를 인라인으로 보기보다는 저장해야 할 때, Content-Disposition 헤더를 attachment로 설정하고 원래 파일 이름을 전달하십시오:

[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);
}
[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);
}
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 FileName, FileContent FROM PdfDocuments WHERE Id = @Id"
        Await Using command As New SqlCommand(query, connection)
            command.Parameters.AddWithValue("@Id", id)

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

                Dim fileName As String = reader.GetString(reader.GetOrdinal("FileName"))
                Dim pdfBytes As Byte() = CType(reader("FileContent"), 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

fileNameFile()의 세 번째 인수로 전달하면 Content-Disposition 헤더가 자동으로 attachment로 설정됩니다. ASP.NET Core는 공백이 포함된 파일명의 올바른 인용을 처리합니다.

검색된 PDF에 워터마크를 어떻게 추가하나요?

가장 실용적인 검색 후 작업 중 하나는 문서를 제공하기 전에 모든 페이지에 워터마크를 스탬핑하는 것입니다. 이는 기밀 보고서, 초안 문서 또는 보안 마킹이 필요한 파일에 유용합니다.

IronPDF로 HTML 워터마크 적용

IronPDF의 워터마크 API는 모든 HTML 문자열을 허용하므로 인라인 CSS를 사용하여 워터마크 텍스트를 스타일링할 수 있습니다. 하위 컨텐츠가 읽기 가능할 정도로 불투명도를 낮게 설정하세요:

[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

ApplyWatermark 메소드는 표준 HTML과 CSS를 수용하므로 글꼴, 색상, 불투명도 및 위치에 대한 완전한 제어가 가능합니다. 워터마크는 문서의 모든 페이지에 자동으로 적용됩니다. 추가 PDF 작업 기능, 이미지 스탬핑, 헤더 및 푸터 추가, 여러 문서 병합 등을 보려면 IronPDF 문서를 참조하세요.

업로드된 PDF를 SQL Server에 다시 어떻게 저장하나요?

왕복 전달을 완성하려면 들어오는 폼 파일을 읽고 데이터베이스에 쓰는 업로드 엔드포인트가 필요합니다. 이는 위의 검색 엔드포인트와 결합하여 완전한 문서 관리 시스템을 형성합니다:

[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 });
}
[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 });
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Http
Imports Microsoft.AspNetCore.Mvc
Imports System.Data.SqlClient
Imports IronPdf

<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

저장 전에 PdfDocument를 사용하여 검증하면 구문 분석 가능하고 잘 형성된 PDF 파일만 데이터베이스에 들어가도록 보장합니다. 바이트 배열이 손상되거나 잘린 경우, IronPDF는 예외를 발생시키며, 이를 포착하여 400 Bad Request 응답으로 반환할 수 있습니다.

PDF 저장을 위한 주요 테이블과 열 유형은 무엇인가요?

사용하는 스키마는 쿼리 성능과 저장 효율성에 영향을 미칩니다. 아래 테이블은 SQL Server에 대한 추천 열 구성을 보여줍니다:

PDF BLOB 저장을 위한 추천 SQL Server 스키마
데이터 유형 목적
Id INT IDENTITY 기본 키, 자동 증가
FileName NVARCHAR(255) 다운로드 헤더를 위한 원본 파일명
FileContent VARBINARY(MAX) 원시 PDF 이진 데이터 (BLOB)
ContentType NVARCHAR(100) MIME 유형, 예: application/pdf
FileSizeBytes BIGINT 쿼터 관리를 위한 저장 크기
UploadedAt DATETIME2 감사를 위한 UTC 타임스탬프
UploadedBy NVARCHAR(100) 액세스 제어를 위한 사용자 식별

SQL Server 파일 스트리밍이 필요한 대규모 시스템의 경우, Microsoft는 FILESTREAM 기능을 대안으로 문서화하며, 큰 BLOB를 파일 시스템에 저장하면서 T-SQL을 통해 쿼리가 가능합니다. 그러나 몇 백 메가바이트 까지의 문서를 제공하는 대부분의 ASP.NET 응용 프로그램의 경우, VARBINARY(MAX) 인-로우 저장이 잘 작동하고 배포를 간소화합니다.

오류를 처리하고 성능을 최적화하는 방법은 무엇입니까?

생산 환경에서의 신뢰할 수 있는 PDF 검색은 데이터베이스, IronPDF 및 HTTP 응답 각각의 층에서 오류 처리가 필요합니다. 아래 표는 주요 실천 사항을 요약합니다:

PDF 검색을 위한 오류 처리 및 성능 패턴
우려사항 추천 이유
연결 해제 `await using` 문 연결 풀의 소진을 방지
PdfDocument 해제 `using` 문 비관리 메모리를 즉시 해제
SQL 삽입 매개변수화된 쿼리만 사용 악의적인 입력이 쿼리를 변경하지 못하도록 방지
파일 유형 검증 MIME 유형 및 매직 바이트 확인 저장 전에 비-PDF 업로드 차단
대용량 파일 처리 `FileStreamResult`로 스트림 응답 서버 메모리에 전체 파일을 로드하지 않음
캐싱 `IMemoryCache` 또는 `IDistributedCache` 사용 반복적인 데이터베이스 왕복을 줄임
비동기 작업 `async`/`await` 전반 디스크 및 네트워크 대기 중 스레드를 자유롭게 유지

연결 문자열 관리를 위해 값을 appsettings.json에 저장하고 절대 소스 파일에 하드코딩하지 마십시오. 로컬 개발 중에는 ASP.NET Core의 내장 비밀 관리를 사용하고, 프로덕션에서는 Azure Key Vault 또는 AWS Secrets Manager를 사용하세요. 소스 제어에 연결 문자열이나 라이선스 키를 절대 커밋하지 마세요.

큰 PDF 파일을 제공할 때 전체 바이트 배열을 메모리에 로드하기보다는 FileStreamResultMemoryStream로 백업하여 반환하도록 고려하십시오. 매우 큰 문서 (100MB 이상)의 경우, SQL Server FILESTREAM API를 사용하여 파일 시스템에서 직접 청크 스트리밍을 가능하게 합니다.

자주 액세스되는 문서 캐싱

특정 PDF 파일이 반복해서 요청되는 경우 -- 예를 들어, 약관 또는 제품 카탈로그 -- 바이트 배열을 IMemoryCache에 캐시하면 반복적인 데이터베이스 왕복을 피할 수 있습니다. IMemoryCacheProgram.csbuilder.Services.AddMemoryCache()와 등록한 후, 이를 컨트롤러에 주입하고 데이터베이스 쿼리 전에 캐시를 확인하십시오. 문서의 예상 갱신 빈도에 맞는 절대 만료 시간을 설정합니다. 문서가 업데이트될 때, 키로 캐시된 항목을 제거하여 다음 요청이 새 버전을 가져오도록 합니다.

분산 시나리오 -- 예를 들어, 여러 서버 인스턴스로 부하 분산된 배포 -- 에서는 IMemoryCache를 Redis 또는 SQL Server로 백업된 IDistributedCache로 교체하십시오. ASP.NET Core의 분산 캐시 추상화는 컨트롤러 코드를 거의 동일하게 유지합니다; Program.cs의 등록만 변경됩니다.

IronPDF를 사용하여 플랫폼 간에 PDF 검색을 어떻게 배포합니까?

IronPDF는 별도의 Chromium 설치나 구성 변경 없이 Linux, Windows 및 macOS에서 실행됩니다. 동일한 NuGet 패키지가 모든 플랫폼을 대상으로 하므로, PDF 컨트롤러는 다음에 배포해도 동일하게 작동합니다:

  • IIS가 포함된 Windows Server
  • Docker 또는 Kubernetes에서의 Ubuntu 컨테이너
  • Azure App Service (Linux 또는 Windows)
  • AWS Elastic Beanstalk

Docker 및 Linux에 배포

Docker 배포의 경우 Dockerfile에 IronPDF 종속성을 추가하세요. IronPDF Linux 문서에는 Debian 및 Alpine 기반 이미지에 필요한 정확한 apt 패키지가 제공됩니다. 일반적인 다단계 Dockerfile은 런타임 이미지 단계에서 OS 종속성을 설치한 다음, 발행된 ASP.NET 애플리케이션을 그 위에 복사합니다. Azure를 사용할 때는, Azure 배포 가이드가 대규모 PDF 렌더링을 지원하는 메모리 및 CPU 설정을 포함한 App Service 구성을 다룹니다.

IronPDF는 자체 Chromium 기반 렌더링 엔진을 포함하므로, 서버에 별도의 브라우저를 설치할 필요가 없습니다. 이는 시스템 수준의 브라우저가 필요한 솔루션과 비교했을 때 Linux 컨테이너 설치를 상당히 간소화합니다. IronPDF 팀은 모든 릴리스마다 가장 일반적인 Linux 기본 이미지를 기반으로 테스트하기 때문에 Alpine이나 Debian 컨테이너가 바로 작동할 것이라고 신뢰할 수 있습니다.

ADO.NET 대신 Entity Framework Core 사용하기

IronPDF는 또한 Entity Framework Core와 통합되어 원본 ADO.NET에 대한 대안으로 사용할 수 있습니다. 프로젝트가 이미 EF Core를 사용하는 경우, 모델 클래스의 byte[] 속성에 FileContent 열을 매핑하고 EF가 쿼리 생성을 처리하도록 할 수 있습니다. 이 방법은 반복 코드를 상당히 줄이고 EF의 LINQ 제공자를 통해 필터링, 페이징, 감사 기능을 더 쉽게 추가할 수 있게 합니다.

대가로 EF Core는 엔티티 그래프의 일환으로 전체 BLOB을 메모리에 로드합니다. 매우 큰 PDF 파일에 대해서는, 전체 엔터티가 아닌 바이트 배열 열만 선택하는 프로젝션과 함께 원시 ADO.NET 또는 EF Core의 FromSql 메소드를 사용하는 것을 고려하십시오.

다음 단계는 무엇입니까?

ASP.NET Core에서 C#과 IronPDF를 사용하여 SQL Server 데이터베이스에서 PDF 파일을 검색하려면 명확한 패턴을 따릅니다: 매개변수화된 SELECT로 BLOB 열을 쿼리하고, 바이트를 PdfDocument로 로드하며, 올바른 Content-Disposition 헤더로 이진 데이터를 반환합니다. IronPDF는 문서가 서버에서 나가기 전에 유효성 검사를 하거나, 워터마크를 찍거나, 병합하거나, 보안을 유지하는 기능을 추가합니다.

IronPDF의 문서 관리 기능을 더욱 탐구하려면 다음 리소스를 살펴보십시오:

무료 IronPDF 체험판 라이선스를 시작하여 모든 기능을 제한 없이 테스트하십시오. 체험판은 워터마크가 있는 출력물을 생성합니다; 유료 라이선스 키를 적용하여 워터마크를 제거하십시오. 이 기사에서 사용된 모든 메서드에 대한 전체 API 참조 문서와 코드 샘플은 IronPDF 웹사이트에서 제공됩니다.

프로젝트에서 이미 Entity Framework Core를 사용하고 있는 경우, IronPDF EF Core 통합 가이드는 원본 ADO.NET을 엔티티 모델로 교체하면서 동일한 IronPDF 처리 파이프라인을 유지하는 방법을 보여줍니다. .NET 10 및 최신 ASP.NET Core 기능을 사용하는 팀의 경우, 여기 설명된 패턴은 수정 없이 작동합니다 -- IronPDF는 모든 활성 .NET LTS 및 STS 릴리스를 지원합니다.

IronPDF 가격 페이지를 검토하여 배포에 적합한 라이선스 계층을 찾으십시오. 단일 개발자 라이선스는 로컬 개발 및 테스트를 커버합니다; 재배포 라이센스는 SaaS 제품 및 여러 서버가 있는 온프레미스 배포를 위해 제공됩니다.

자주 묻는 질문

IronPDF란 무엇인가요?

IronPDF는 C# 애플리케이션에서 PDF 파일을 생성, 편집 및 콘텐츠를 추출할 수 있는 .NET 라이브러리입니다.

ASP.NET을 사용하여 데이터베이스에서 PDF 파일을 어떻게 가져올 수 있나요?

ASP.NET에서 데이터베이스에서 PDF 파일을 가져오려면 C# 코드를 사용하여 데이터베이스를 쿼리하고 PDF 데이터를 바이트 배열로 읽어들일 수 있습니다. 이 바이트 배열은 IronPDF를 사용하여 필요한 대로 PDF를 렌더링하거나 조작하는 데 사용할 수 있습니다.

내 ASP.NET 애플리케이션에서 PDF를 처리하기 위해 IronPDF를 사용해야 하는 이유는 무엇인가요?

IronPDF는 PDF 생성, HTML로부터의 변환 및 조작 등의 PDF 처리 기능을 제공합니다. ASP.NET과 통합되어 PDF 작업을 위한 사용하기 쉬운 API를 제공합니다.

ASP.NET에서 IronPDF를 사용하기 위한 전제 조건은 무엇인가요?

ASP.NET에서 IronPDF를 사용하려면, Visual Studio 같은 .NET 개발 환경이 설정되어 있어야 하며, NuGet 패키지 관리자를 통해 프로젝트에 IronPDF 라이브러리를 포함해야 합니다.

기존 PDF 파일을 편집하는 데 IronPDF를 사용할 수 있나요?

네, IronPDF는 기존 PDF 파일을 편집하는 데 사용할 수 있습니다. 텍스트나 이미지 추가, 문서 병합 등의 수정이 가능합니다.

IronPDF를 사용하여 HTML을 PDF로 변환하는 것이 가능한가요?

네, IronPDF는 HTML 콘텐츠를 직접 PDF 형식으로 변환할 수 있어, 웹 페이지나 기타 HTML 콘텐츠에서 PDF를 생성하기 쉽게 합니다.

IronPDF를 사용하여 PDF 보안 기능을 어떻게 처리하나요?

IronPDF는 PDF에 대해 비밀번호 보호 및 문서 액세스 및 편집을 제어하는 권한 설정 등 다양한 보안 기능을 지원합니다.

IronPDF가 PDF 검색을 위해 호환되는 데이터베이스의 종류는 무엇인가요?

IronPDF는 SQL Server, MySQL 또는 PostgreSQL과 같은 바이너리 데이터를 저장할 수 있는 모든 데이터베이스와 함께 작동하여 PDF 파일을 검색하고 조작할 수 있습니다.

커티스 차우
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해