C#에서 두 개의 PDF 파일을 비교하는 방법
ASP.NET Core에서 PDF 파일을 업로드하고 다운로드하려면 이진 데이터 처리, 컨트롤러 작업 관리, 옵션으로는 저장 또는 전송 전에 서버 측 문서 처리가 필요합니다. IronPDF를 사용하면 단순 파일 저장을 넘어 워터마크 적용, HTML에서 PDF 생성, 처리된 문서를 사용자에게 반환하는 것까지 기존 MVC 파이프라인 내에서 수행할 수 있습니다. 본 가이드는 .NET 10을 사용하여 C#에서 완전한 업로드-다운로드 워크플로를 구축하는 각 단계를 안내합니다.
ASP.NET Core 프로젝트에 IronPDF를 설치하는 방법은 무엇입니까?
업로드나 다운로드 로직을 작성하기 전에 NuGet 패키지 관리자나 .NET CLI를 사용하여 프로젝트에 IronPDF를 추가하세요. 패키지 관리자 콘솔에서 Install-Package IronPdf을 사용하거나 아래의 CLI 명령어를 실행하여 새 MVC 프로젝트를 스캐폴드하고 필요한 모든 패키지를 한 번에 추가하십시오.
dotnet new mvc -n PdfManager --framework net10.0
cd PdfManager
dotnet add package IronPdf
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet new mvc -n PdfManager --framework net10.0
cd PdfManager
dotnet add package IronPdf
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Design
설치가 완료되면, IronPDF는 HTML에서 PDF를 생성하는 ChromePdfRenderer, 기존 파일을 로드하고 조작하는 PdfDocument 및 워터마크, 스탬프, 디지털 서명을 포함한 다양한 편집 도구에 대한 액세스를 제공합니다. 버전 이력 및 호환성 정보는 IronPDF NuGet 패키지 페이지에서 확인하실 수 있습니다.
프로젝트 설정
Program.cs에 저장 경로 상수를 추가하고 의존성 주입 컨테이너에 ApplicationDbContext를 등록하십시오. 프로젝트 구조에는 PDF 관련 논리를 작성하기 전에 Controllers/PdfController.cs, Models/PdfFileModel.cs, Data/ApplicationDbContext.cs가 포함됩니다.
PDF 저장을 위한 데이터베이스 모델을 어떻게 만드나요?
PDF 업로드 시스템의 기초는 데이터베이스 테이블로 매핑되는 모델 클래스입니다. 다음 C# 레코드는 필수 필드인 파일 이름, 콘텐츠 형식, 원시 바이너리 데이터, 업로드 타임스탬프를 캡처합니다.
public class PdfFileModel
{
public int Id { get; set; }
public string FileName { get; set; } = string.Empty;
public string ContentType { get; set; } = "application/pdf";
public byte[] FileData { get; set; } = Array.Empty<byte>();
public DateTime UploadedDate { get; set; } = DateTime.UtcNow;
}
public class PdfFileModel
{
public int Id { get; set; }
public string FileName { get; set; } = string.Empty;
public string ContentType { get; set; } = "application/pdf";
public byte[] FileData { get; set; } = Array.Empty<byte>();
public DateTime UploadedDate { get; set; } = DateTime.UtcNow;
}
Public Class PdfFileModel
Public Property Id As Integer
Public Property FileName As String = String.Empty
Public Property ContentType As String = "application/pdf"
Public Property FileData As Byte() = Array.Empty(Of Byte)()
Public Property UploadedDate As DateTime = DateTime.UtcNow
End Class
FileData은 PDF를 바이너리 대용량 객체(BLOB)로 저장합니다. 이 접근 방식은 문서를 데이터베이스 내에 자체적으로 포함시켜 백업을 더 간단하게 하고 쿼리를 쉽게 만듭니다. 대량 시나리오 또는 대용량 파일의 경우, 데이터베이스에 파일 경로만 저장하고 바이너리를 Azure Blob Storage 또는 Amazon S3와 같은 클라우드 스토리지 버킷에 쓰는 것을 고려하십시오.
Entity Framework Core 구성
모델을 EF Core에 등록하려면 ApplicationDbContext에 DbSet<PdfFileModel> 속성을 추가하십시오:
using Microsoft.EntityFrameworkCore;
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options) { }
public DbSet<PdfFileModel> PdfFiles { get; set; }
}
using Microsoft.EntityFrameworkCore;
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options) { }
public DbSet<PdfFileModel> PdfFiles { get; set; }
}
Imports Microsoft.EntityFrameworkCore
Public Class ApplicationDbContext
Inherits DbContext
Public Sub New(options As DbContextOptions(Of ApplicationDbContext))
MyBase.New(options)
End Sub
Public Property PdfFiles As DbSet(Of PdfFileModel)
End Class
스키마를 생성하려면 dotnet ef migrations add InitialCreate 뒤에 dotnet ef database update을 실행하십시오. Entity Framework Core는 byte[]을 SQL Server의 varbinary(max) 열 또는 SQLite의 BLOB 열로 자동으로 매핑합니다 -- 수동 SQL이 필요하지 않습니다.
ASP.NET Core 컨트롤러에 PDF 파일을 업로드하는 방법은 무엇인가요?
업로드를 처리하는 컨트롤러 액션은 enctype="multipart/form-data"을 사용하여 HTML 폼에서 IFormFile 매개변수를 수신합니다. 액션은 스트림을 MemoryStream에 읽어들여 바이트 배열로 변환하고, Entity Framework Core를 통해 결과를 지속합니다.
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
public class PdfController : Controller
{
private readonly ApplicationDbContext _context;
public PdfController(ApplicationDbContext context)
{
_context = context;
}
[HttpPost]
public async Task<IActionResult> Upload(IFormFile file)
{
if (file is null || file.Length == 0)
return BadRequest("No file selected.");
if (!file.ContentType.Equals("application/pdf", StringComparison.OrdinalIgnoreCase))
return BadRequest("Only PDF files are accepted.");
using var stream = new MemoryStream();
await file.CopyToAsync(stream);
var pdfFile = new PdfFileModel
{
FileName = Path.GetFileName(file.FileName),
ContentType = file.ContentType,
FileData = stream.ToArray(),
UploadedDate = DateTime.UtcNow
};
_context.PdfFiles.Add(pdfFile);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
public async Task<IActionResult> Index()
{
var files = await _context.PdfFiles
.Select(f => new { f.Id, f.FileName, f.UploadedDate })
.ToListAsync();
return View(files);
}
}
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
public class PdfController : Controller
{
private readonly ApplicationDbContext _context;
public PdfController(ApplicationDbContext context)
{
_context = context;
}
[HttpPost]
public async Task<IActionResult> Upload(IFormFile file)
{
if (file is null || file.Length == 0)
return BadRequest("No file selected.");
if (!file.ContentType.Equals("application/pdf", StringComparison.OrdinalIgnoreCase))
return BadRequest("Only PDF files are accepted.");
using var stream = new MemoryStream();
await file.CopyToAsync(stream);
var pdfFile = new PdfFileModel
{
FileName = Path.GetFileName(file.FileName),
ContentType = file.ContentType,
FileData = stream.ToArray(),
UploadedDate = DateTime.UtcNow
};
_context.PdfFiles.Add(pdfFile);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
public async Task<IActionResult> Index()
{
var files = await _context.PdfFiles
.Select(f => new { f.Id, f.FileName, f.UploadedDate })
.ToListAsync();
return View(files);
}
}
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.EntityFrameworkCore
Imports System.IO
Imports System.Threading.Tasks
Public Class PdfController
Inherits Controller
Private ReadOnly _context As ApplicationDbContext
Public Sub New(context As ApplicationDbContext)
_context = context
End Sub
<HttpPost>
Public Async Function Upload(file As IFormFile) As Task(Of IActionResult)
If file Is Nothing OrElse file.Length = 0 Then
Return BadRequest("No file selected.")
End If
If Not file.ContentType.Equals("application/pdf", StringComparison.OrdinalIgnoreCase) Then
Return BadRequest("Only PDF files are accepted.")
End If
Using stream As New MemoryStream()
Await file.CopyToAsync(stream)
Dim pdfFile As New PdfFileModel With {
.FileName = Path.GetFileName(file.FileName),
.ContentType = file.ContentType,
.FileData = stream.ToArray(),
.UploadedDate = DateTime.UtcNow
}
_context.PdfFiles.Add(pdfFile)
Await _context.SaveChangesAsync()
End Using
Return RedirectToAction(NameOf(Index))
End Function
Public Async Function Index() As Task(Of IActionResult)
Dim files = Await _context.PdfFiles _
.Select(Function(f) New With {f.Id, f.FileName, f.UploadedDate}) _
.ToListAsync()
Return View(files)
End Function
End Class
업로드된 파일 검증
항상 처리하기 전에 콘텐츠 유형을 검증하십시오. file.ContentType을 검사하여 사용자가 실수로 PDF가 아닌 콘텐츠를 업로드하는 것을 방지합니다. 더 강력한 검증을 위해 스트림의 처음 네 바이트를 읽고 PDF 매직 넘버(%PDF)를 확인하십시오. 스트림을 복사하기 전에 일반 문서 워크플로우에서는 최대 파일 크기를 -- 일반적으로 10MB 정도 -- 제한하도록 file.Length을 확인하여 강제해야 합니다.
이 액션을 트리거하는 HTML 폼은 두 가지 속성, method="post" 및 enctype="multipart/form-data"이 필요합니다. 인코딩 유형이 없으면 브라우저는 파일 이름을 이진 콘텐츠가 아닌 평문으로 보냅니다. 폼 태그 내부에 <input type="file" name="file" accept=".pdf" /> 요소와 /Pdf/Upload를 가리키는 전송 버튼을 추가하십시오.

업로드된 PDF에 워터마크를 추가한 후 저장하는 방법은 무엇인가요?
저장 전 서버 측에서 파일을 처리하는 것은 IronPDF의 워터마크 기능을 가장 실용적으로 사용하는 방법 중 하나입니다. 회사 로고, 'CONFIDENTIAL' 레이블 또는 'DRAFT' 알림과 같은 워터마크를 추가하여 바이트가 데이터베이스에 도달하기 전에 모든 들어오는 문서에 찍을 수 있습니다.
[HttpPost]
public async Task<IActionResult> UploadWithWatermark(IFormFile file)
{
if (file is null || file.Length == 0)
return BadRequest("No file selected.");
using var stream = new MemoryStream();
await file.CopyToAsync(stream);
byte[] originalBytes = stream.ToArray();
// Load the uploaded file into IronPDF
var pdf = new IronPdf.PdfDocument(originalBytes);
// Apply an HTML watermark centered on every page
pdf.ApplyWatermark(
"<h2 style='color:red;opacity:0.4'>CONFIDENTIAL</h2>",
rotation: 45,
opacity: 60,
verticalAlignment: IronPdf.Editing.VerticalAlignment.Middle,
horizontalAlignment: IronPdf.Editing.HorizontalAlignment.Center
);
var pdfFile = new PdfFileModel
{
FileName = Path.GetFileName(file.FileName),
ContentType = "application/pdf",
FileData = pdf.BinaryData,
UploadedDate = DateTime.UtcNow
};
_context.PdfFiles.Add(pdfFile);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
[HttpPost]
public async Task<IActionResult> UploadWithWatermark(IFormFile file)
{
if (file is null || file.Length == 0)
return BadRequest("No file selected.");
using var stream = new MemoryStream();
await file.CopyToAsync(stream);
byte[] originalBytes = stream.ToArray();
// Load the uploaded file into IronPDF
var pdf = new IronPdf.PdfDocument(originalBytes);
// Apply an HTML watermark centered on every page
pdf.ApplyWatermark(
"<h2 style='color:red;opacity:0.4'>CONFIDENTIAL</h2>",
rotation: 45,
opacity: 60,
verticalAlignment: IronPdf.Editing.VerticalAlignment.Middle,
horizontalAlignment: IronPdf.Editing.HorizontalAlignment.Center
);
var pdfFile = new PdfFileModel
{
FileName = Path.GetFileName(file.FileName),
ContentType = "application/pdf",
FileData = pdf.BinaryData,
UploadedDate = DateTime.UtcNow
};
_context.PdfFiles.Add(pdfFile);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
Imports System.IO
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
<HttpPost>
Public Async Function UploadWithWatermark(file As IFormFile) As Task(Of IActionResult)
If file Is Nothing OrElse file.Length = 0 Then
Return BadRequest("No file selected.")
End If
Using stream As New MemoryStream()
Await file.CopyToAsync(stream)
Dim originalBytes As Byte() = stream.ToArray()
' Load the uploaded file into IronPDF
Dim pdf = New IronPdf.PdfDocument(originalBytes)
' Apply an HTML watermark centered on every page
pdf.ApplyWatermark(
"<h2 style='color:red;opacity:0.4'>CONFIDENTIAL</h2>",
rotation:=45,
opacity:=60,
verticalAlignment:=IronPdf.Editing.VerticalAlignment.Middle,
horizontalAlignment:=IronPdf.Editing.HorizontalAlignment.Center
)
Dim pdfFile As New PdfFileModel With {
.FileName = Path.GetFileName(file.FileName),
.ContentType = "application/pdf",
.FileData = pdf.BinaryData,
.UploadedDate = DateTime.UtcNow
}
_context.PdfFiles.Add(pdfFile)
Await _context.SaveChangesAsync()
Return RedirectToAction(NameOf(Index))
End Using
End Function
워터마크 구성 옵션
IronPDF의 ApplyWatermark 메서드는 HTML 문자열을 수용하므로 워터마크에 그라데이션, 사용자 지정 폰트, 회전된 텍스트 또는 내장 SVG 아이콘과 같은 유효한 HTML 및 인라인 CSS를 포함할 수 있습니다. rotation 매개변수는 페이지 대각선에 워터마크를 회전시키고, opacity은 0(보이지 않음)에서 100(완전 불투명)까지 투명도를 제어합니다.
워터마크 외에도 동일한 PdfDocument 객체는 헤더 및 푸터 추가, 이미지 스탬핑, 기존 양식 필드 편집을 위한 메서드를 제공합니다. 최종 바이트 배열을 검색하기 전에 여러 처리 단계를 연결할 수 있습니다.

데이터베이스에 저장된 PDF 파일을 다운로드하는 방법은 무엇인가요?
저장된 PDF를 브라우저로 다시 제공하려면, ID로 레코드를 검색하고 FileResult을 반환합니다. ASP.NET Core File 헬퍼 메서드는 올바른 Content-Type 헤더를 설정하고 원본 파일 이름으로 브라우저의 다운로드 대화 상자를 트리거합니다.
public async Task<IActionResult> Download(int id)
{
var pdfFile = await _context.PdfFiles.FindAsync(id);
if (pdfFile is null)
return NotFound();
return File(pdfFile.FileData, pdfFile.ContentType, pdfFile.FileName);
}
public async Task<IActionResult> Download(int id)
{
var pdfFile = await _context.PdfFiles.FindAsync(id);
if (pdfFile is null)
return NotFound();
return File(pdfFile.FileData, pdfFile.ContentType, pdfFile.FileName);
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Public Async Function Download(id As Integer) As Task(Of IActionResult)
Dim pdfFile = Await _context.PdfFiles.FindAsync(id)
If pdfFile Is Nothing Then
Return NotFound()
End If
Return File(pdfFile.FileData, pdfFile.ContentType, pdfFile.FileName)
End Function
보기에서 다운로드 목록 표시
Index 액션은 모든 저장된 파일 레코드를 검색하여 Razor 뷰에 전달합니다. 간단한 HTML 테이블은 각 레코드의 파일 이름, 업로드 날짜, 다운로드 앵커를 렌더링합니다.
<table class="content__data-table" data-content-table>
<caption>Uploaded PDF Files</caption>
<thead>
<tr>
<th>File Name</th>
<th>Uploaded</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@item.FileName</td>
<td>@item.UploadedDate.ToString("yyyy-MM-dd HH:mm")</td>
<td><a href="/Pdf/Download/@item.Id">Download</a></td>
</tr>
}
</tbody>
</table>
<table class="content__data-table" data-content-table>
<caption>Uploaded PDF Files</caption>
<thead>
<tr>
<th>File Name</th>
<th>Uploaded</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@item.FileName</td>
<td>@item.UploadedDate.ToString("yyyy-MM-dd HH:mm")</td>
<td><a href="/Pdf/Download/@item.Id">Download</a></td>
</tr>
}
</tbody>
</table>
return File(bytes, contentType, fileName) 오버로드는 Content-Type: application/pdf 및 Content-Disposition: attachment를 모두 설정합니다. filename="..."헤더 브라우저가 PDF를 다운로드 메시지 없이 바로 열게 하려면, 세 번째 인수 없이return File(bytes, contentType)을 사용하십시오 -- 이렇게 하면Content-Disposition: attachment` 명령어가 생략됩니다.

대안으로 파일 시스템 저장
대규모 배포의 경우 데이터베이스에 원시 바이너리 데이터를 저장하면 행 크기가 증가하고 쿼리가 느려질 수 있습니다. 대안으로 디스크의 디렉토리 또는 클라우드 공급자에 파일을 저장하고 데이터베이스에 상대 경로만 저장하는 방법이 있습니다. 업로드 중에 FilePath string으로 FileData byte[]을 대체하고 다운로드 중에 System.IO.File.WriteAllBytesAsync(path, bytes)을 작성하고 System.IO.File.ReadAllBytesAsync(path)을 읽습니다. 모든 경로는 컨트롤러의 동일한 return File(...) 호출로 합류합니다.
온디맨드 PDF 문서를 생성하여 다운로드 서비스를 제공하는 방법은 무엇인가요?
사전에 저장된 파일을 제공하는 것에 제한되지 않습니다. IronPDF의 HTML-to-PDF 변환을 사용하면 청구서, 보고서, 인증서 및 데이터 내보내기에 유용한 요청 시 데이터에서 문서를 동적으로 생성할 수 있습니다.
public IActionResult GenerateInvoice(int orderId)
{
// Build HTML content from your data model
string html = $@"
<html>
<body style='font-family: Arial, sans-serif; padding: 40px;'>
<h1>Invoice #{orderId}</h1>
<p>Generated: {DateTime.UtcNow:yyyy-MM-dd HH:mm} UTC</p>
<table border='1' cellpadding='8'>
<tr><th>Item</th><th>Qty</th><th>Price</th></tr>
<tr><td>IronPDF License</td><td>1</td><td>$999</td></tr>
</table>
</body>
</html>";
var renderer = new IronPdf.ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf(html);
return File(pdf.BinaryData, "application/pdf", $"invoice-{orderId}.pdf");
}
public IActionResult GenerateInvoice(int orderId)
{
// Build HTML content from your data model
string html = $@"
<html>
<body style='font-family: Arial, sans-serif; padding: 40px;'>
<h1>Invoice #{orderId}</h1>
<p>Generated: {DateTime.UtcNow:yyyy-MM-dd HH:mm} UTC</p>
<table border='1' cellpadding='8'>
<tr><th>Item</th><th>Qty</th><th>Price</th></tr>
<tr><td>IronPDF License</td><td>1</td><td>$999</td></tr>
</table>
</body>
</html>";
var renderer = new IronPdf.ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf(html);
return File(pdf.BinaryData, "application/pdf", $"invoice-{orderId}.pdf");
}
Imports System
Imports Microsoft.AspNetCore.Mvc
Imports IronPdf
Public Class InvoiceController
Inherits Controller
Public Function GenerateInvoice(orderId As Integer) As IActionResult
' Build HTML content from your data model
Dim html As String = $"
<html>
<body style='font-family: Arial, sans-serif; padding: 40px;'>
<h1>Invoice #{orderId}</h1>
<p>Generated: {DateTime.UtcNow:yyyy-MM-dd HH:mm} UTC</p>
<table border='1' cellpadding='8'>
<tr><th>Item</th><th>Qty</th><th>Price</th></tr>
<tr><td>IronPDF License</td><td>1</td><td>$999</td></tr>
</table>
</body>
</html>"
Dim renderer As New ChromePdfRenderer()
Using pdf = renderer.RenderHtmlAsPdf(html)
Return File(pdf.BinaryData, "application/pdf", $"invoice-{orderId}.pdf")
End Using
End Function
End Class
온디맨드 PDF를 위한 렌더링 옵션
ChromePdfRenderer은 Google Chrome을 구동하는 동일한 Chromium 렌더링 엔진을 사용하여 픽셀 단위로 정확한 출력을 생성합니다. 이는 브라우저에서 표시할 수 있는 모든 CSS - flexbox 레이아웃, 그리드, 사용자 지정 글꼴, SVG 차트 - 생성된 PDF에서도 올바르게 렌더링됨을 의미합니다. RenderHtmlAsPdf을 호출하기 전에 RenderingOptions 속성을 통해 용지 크기, 여백 및 방향을 설정할 수 있습니다.
더 복잡한 문서의 경우, HTML 문자열 대신 전체 URL을 RenderUrlAsPdf에 전달하십시오. IronPDF는 페이지를 헤드리스 브라우저에서 로드하고, JavaScript를 실행하며, 스타일을 적용하고, 완전히 렌더링된 DOM을 PDF로 변환합니다. HTML에서 PDF로 변환 가이드를 검토하여 사용자 지정 헤더, 푸터, 페이지 번호 토큰을 포함하여 렌더링 옵션의 전체 세트를 확인하세요.

ASP.NET Core에서 여러 PDF 파일을 어떻게 병합합니까?
단일 파일 작업을 넘어 여러 업로드된 문서를 하나로 결합해야 할 수 있습니다. IronPDF의 PDF 병합 기능은 PdfDocument 객체 목록을 받아 단일 병합 파일을 반환합니다.
public async Task<IActionResult> MergeAll()
{
var allFiles = await _context.PdfFiles.ToListAsync();
if (allFiles.Count < 2)
return BadRequest("At least two files are required for merging.");
var documents = allFiles
.Select(f => new IronPdf.PdfDocument(f.FileData))
.ToList();
using var merged = IronPdf.PdfDocument.Merge(documents);
return File(merged.BinaryData, "application/pdf", "merged.pdf");
}
public async Task<IActionResult> MergeAll()
{
var allFiles = await _context.PdfFiles.ToListAsync();
if (allFiles.Count < 2)
return BadRequest("At least two files are required for merging.");
var documents = allFiles
.Select(f => new IronPdf.PdfDocument(f.FileData))
.ToList();
using var merged = IronPdf.PdfDocument.Merge(documents);
return File(merged.BinaryData, "application/pdf", "merged.pdf");
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
Public Async Function MergeAll() As Task(Of IActionResult)
Dim allFiles = Await _context.PdfFiles.ToListAsync()
If allFiles.Count < 2 Then
Return BadRequest("At least two files are required for merging.")
End If
Dim documents = allFiles _
.Select(Function(f) New IronPdf.PdfDocument(f.FileData)) _
.ToList()
Using merged = IronPdf.PdfDocument.Merge(documents)
Return File(merged.BinaryData, "application/pdf", "merged.pdf")
End Using
End Function
PDF에서 페이지 분할하기
역방향 동작 -- 페이지 일부 추출 -- 은 CopyPages을 사용합니다. 저장된 바이트로부터 PdfDocument을 로드하고, 0부터 시작하는 페이지 인덱스를 사용하여 source.CopyPages(startIndex, endIndex)을 호출하고, 결과 PdfDocument.BinaryData을 FileResult로 반환합니다. 이 패턴은 페이지 매김 미리보기, 여러 섹션 보고서 분할 또는 썸네일 생성을 위한 커버 페이지 추출에 유용합니다. 사용자에게 제공하기 전에 병합 또는 분할 출력에 디지털 서명을 적용할 수도 있습니다.
대용량 파일 업로드를 안전하게 처리하는 방법은?
대용량 PDF 파일은 ASP.NET Core 미들웨어 수준에서 추가 구성이 필요합니다. 기본적으로, 요청 본문 크기 제한은 약 28 MB로 설정되어 있습니다. 이를 높이려면, Program.cs에서 builder.Build() 전에 MultipartBodyLengthLimit을 설정하고 builder.WebHost.ConfigureKestrel에서 원하는 바이트 수, 예를 들어 50 * 1024 * 1024로 50MB를 설정하십시오.
크기 제한 외에도 모든 업로드 엔드포인트에 다음 보안 방침을 적용하십시오: 콘텐츠 유형 헤더를 검증하고, %PDF 매직 넘버를 위해 스트림의 첫 바이트를 검사하고, IronPDF의 문서 검사 API를 사용하여 내장 스크립트를 검색하며, 웹 루트 밖에 처리된 파일을 저장하여 직접 정적 콘텐츠로 제공되지 않도록 하십시오. ASP.NET Core 보안 문서는 위조 방지 토큰 검증 및 바이러스 스캔 통합을 포함한 추가 강화 기술을 다룹니다.
메모리 부담을 피하기 위해 대용량 파일 스트리밍하기
파일이 10MB를 넘으면 처리하기 전 전체 스트림을 MemoryStream에 읽는 것이 메모리 사용량을 크게 증가시킬 수 있습니다. 가능한 경우 요청 스트림에서 직접 로드하기 위해 IronPdf.PdfDocument.FromStream을 사용하거나 임시 파일 경로로 쓰고 디스크에서 로드하십시오:
string tempPath = Path.GetTempFileName();
await using (var fs = System.IO.File.Create(tempPath))
{
await file.CopyToAsync(fs);
}
using var pdf = new IronPdf.PdfDocument(tempPath);
// process...
System.IO.File.Delete(tempPath);
string tempPath = Path.GetTempFileName();
await using (var fs = System.IO.File.Create(tempPath))
{
await file.CopyToAsync(fs);
}
using var pdf = new IronPdf.PdfDocument(tempPath);
// process...
System.IO.File.Delete(tempPath);
Imports System.IO
Imports IronPdf
Dim tempPath As String = Path.GetTempFileName()
Using fs As FileStream = System.IO.File.Create(tempPath)
Await file.CopyToAsync(fs)
End Using
Using pdf As PdfDocument = New IronPdf.PdfDocument(tempPath)
' process...
End Using
System.IO.File.Delete(tempPath)
이 패턴은 힙 할당량을 낮게 유지하고, HTTP 응답이 이미 전송된 후 비동기적으로 파일이 처리되는 백그라운드 처리 큐에서 잘 작동합니다. 추가 비동기 처리 패턴을 보려면 IronPDF 문서를 탐색하세요.
다음 단계는 무엇입니까?
이제 IronPDF로 지원되는 ASP.NET Core MVC 응용 프로그램에서 PDF 파일을 업로드, 처리, 저장 및 다운로드하기 위한 완전한 기초를 갖추었습니다. 여기서부터 워크플로를 확장하기 위한 다음 방향들을 고려하세요.
처리 기능 확장. IronPDF는 PDF 양식 필드 채우기 및 읽기, PDF 텍스트 추출 API를 통한 텍스트 및 이미지 추출, 및 썸네일 미리 보기를 위한 PDF 페이지를 이미지로 변환하는 것을 지원합니다. 이러한 기능들은 모두 위에서 보여진 동일한 컨트롤러 패턴에 통합됩니다.
디지털 서명 추가. X.509 인증서를 사용하여 생성되거나 업로드된 모든 문서에 디지털 서명 후 저장하십시오. 서명된 PDF는 많은 규정 준수 요구사항을 충족하는 변조 증거 메타데이터를 가지고 있습니다.
스토리지를 클라우드로 확장하십시오. Azure Blob Storage 또는 Amazon S3 참조로 로컬 byte[] 데이터베이스 열을 대체하십시오. 처리된 바이트를 워터마킹한 후 클라우드 스토리지에 업로드하고, 데이터베이스에 URI만 저장하세요 -- 이것은 데이터베이스 행 크기를 크게 줄이고 CDN 전달을 가능하게 합니다.
무료 체험판 시작하기. IronPDF 체험판 라이선스 페이지를 방문하여 모든 기능 접근성을 가진 30일 평가 키를 받으세요. 또한 전체 IronPDF 기능 개요를 수강하여 .NET 응용 프로그램에서 사용 가능한 PDF 기능의 전체 범위를 이해하거나, 프로덕션 배포 준비가 되면 가격 및 라이선스 페이지를 참조하십시오.
자주 묻는 질문
ASP.NET Core MVC 애플리케이션에서 PDF 파일을 어떻게 업로드할 수 있습니까?
ASP.NET Core MVC 애플리케이션에서 PDF 파일을 업로드하려면 IFormFile 인터페이스를 사용하여 폼에서 파일 데이터를 캡처한 후 서버 측에서 처리하고 저장할 수 있습니다. 필요에 따라 IronPDF를 사용하여 PDF를 추가로 조작할 수 있습니다.
ASP.NET에서 PDF 파일을 다운로드하는 가장 좋은 방법은 무엇입니까?
ASP.NET에서 PDF 파일을 다운로드하는 가장 좋은 방법은 컨트롤러에서 FileResult 액션을 사용하는 것입니다. IronPDF가 서버 측에서 PDF를 생성하고 수정하는 데 도움을 줄 수 있어 다운로드 준비를 돕습니다.
ASP.NET을 사용하여 데이터베이스에 PDF 파일을 저장할 수 있습니까?
예, 파일을 바이트 배열로 변환하고 이를 이진 대형 객체(BLOB)로 저장하여 ASP.NET을 사용하여 데이터베이스에 PDF 파일을 저장할 수 있습니다. IronPDF는 저장 전에 PDF를 처리하는 데 도움을 줄 수 있습니다.
IronPDF는 ASP.NET에서 PDF에 워터마크를 추가하는 데 어떻게 도움이 됩니까?
IronPDF는 PDF에 텍스트 또는 이미지 워터마크를 쉽게 추가할 수 있는 기능을 제공하며, 이를 ASP.NET 애플리케이션에 통합하여 다운로드 또는 저장 전에 문서를 수정할 수 있습니다.
PDF 저장을 위한 EF Core 사용의 장점은 무엇입니까?
EF Core는 효율적인 객체 관계 매핑을 허용하여 ASP.NET 애플리케이션 내에서 구조적이고 확장 가능한 방식으로 PDF 저장 및 검색을 관리하기 쉽게 만듭니다.
ASP.NET 애플리케이션에서 PDF 콘텐츠를 조작할 수 있습니까?
네, IronPDF를 사용하면 PDF 콘텐츠를 조작할 수 있습니다. 텍스트, 이미지, 메타데이터 편집을 포함하여 사용자에게 제공하기 전에 문서를 맞춤화하는 데 유용합니다.
ASP.NET에서 파일 업로드를 안전하게 처리하려면 어떻게 해야 합니까?
ASP.NET에서 파일 업로드를 안전하게 처리하려면 파일 유형을 검증하고 파일 크기를 제한하며 안전한 위치에 저장해야 합니다. IronPDF 같은 라이브러리를 사용하면 PDF 파일 자체의 무결성을 보장하는 데 도움을 줄 수 있습니다.
웹 애플리케이션에서 PDF 작업 시 일반적인 문제는 무엇입니까?
일반적인 문제에는 파일 호환성 보장, 대형 파일 크기 관리, 문서 무결성 유지가 포함됩니다. IronPDF는 견고한 PDF 생성 및 조작 도구를 제공하여 이러한 문제를 극복하는 데 도움을 줍니다.
ASP.NET에서 다른 파일 유형을 PDF로 변환할 수 있습니까?
네, IronPDF는 HTML 또는 이미지 파일과 같은 다양한 파일 유형을 ASP.NET 애플리케이션 내에서 매끄럽게 PDF로 변환할 수 있도록 합니다.
ASP.NET에서 PDF를 처리하는 데 있어 MVC의 역할은 무엇입니까?
MVC 패턴은 코드에서 데이터 처리(모델), 사용자 인터페이스(뷰), 애플리케이션 로직(컨트롤러)을 분리하여 PDF를 처리하는 코드를 구성하는 데 도움이 됩니다. 이를 통해 PDF 기능을 관리하고 확장하기 쉽게 만듭니다.

