ASP.NET Core에서 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를 의존성 주입 컨테이너에 등록하세요. 프로젝트 구조에는 @@--코드-2136--@@, @@--코드-2137--@@, @@--코드-2138--@@가 포함되어야 하며, PDF 관련 로직을 작성하기 전에 @@--코드-2136--@@를 포함해야 합니다.
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 구성
DbSet<PdfFileModel>에 ApplicationDbContext 속성을 추가하여 EF Core에 모델을 등록하세요:
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를 실행하여 스키마를 생성합니다. 엔티티 프레임워크 코어는 @@--코드-2144--@@를 SQL Server의 @@--코드-2145--@@ 열 또는 SQLite의 @@--코드-2146--@@ 열에 자동으로 매핑하므로 수동 SQL이 필요하지 않습니다.
ASP.NET Core 컨트롤러에 PDF 파일을 업로드하는 방법은 무엇인가요?
업로드를 처리하는 컨트롤러 작업은 IFormFile을 사용하여 HTML 양식에서 enctype="multipart/form-data" 매개 변수를 수신합니다. 작업은 스트림을 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가 아닌 콘텐츠를 업로드하는 것을 방지할 수 있습니다. 보다 강력한 유효성 검사를 위해 스트림의 처음 4바이트를 읽고 PDF 매직넘버(%PDF)를 확인합니다. 또한 스트림을 복사하기 전에 file.Length를 확인하여 최대 파일 크기(일반 문서 워크플로우의 경우 일반적으로 10MB)를 적용해야 합니다.
이 작업을 트리거하는 HTML 양식에는 두 가지 속성이 필요합니다: method="post" 및 enctype="multipart/form-data". 인코딩 유형이 없으면 브라우저는 파일 이름을 이진 콘텐츠가 아닌 평문으로 보냅니다. 양식 태그 안에 @@--코드-2155--@@ 요소와 @@--코드-2156--@@을 가리키는 제출 버튼을 추가하세요.
IronPDF로 ASP .NET C#에서 PDF 파일을 업로드 및 다운로드하는 방법: 이미지 1 - 업로드된 PDF를 보여주는 UI
업로드된 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.BinaryData를 호출하기 전에 여러 처리 단계를 연결할 수 있습니다.
IronPDF로 ASP .NET C#에서 PDF 파일을 업로드 및 다운로드하는 방법: 이미지 2 - 워터마킹한 후 데이터베이스에 저장한 PDF
데이터베이스에 저장된 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: 첨부 파일을 모두 설정합니다; filename="..."헤더 브라우저에서 다운로드 메시지를 표시하는 대신 PDF를 인라인으로 열도록 하려면 세 번째 인수 없이return File(bytes, contentType)를 사용하면Content-Disposition: attachment` 명령어가 생략됩니다.
IronPDF로 ASP .NET C#에서 PDF 파일을 업로드 및 다운로드하는 방법: 이미지 3 - 저장된 PDF 파일 목록
대안으로 파일 시스템 저장
대규모 배포의 경우 데이터베이스에 원시 바이너리 데이터를 저장하면 행 크기가 증가하고 쿼리가 느려질 수 있습니다. 대안으로 디스크의 디렉토리 또는 클라우드 공급자에 파일을 저장하고 데이터베이스에 상대 경로만 저장하는 방법이 있습니다. 업로드 중에는 FileData byte[]을 FilePath string으로 바꾸고, 업로드 중에는 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>$749</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>$749</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>$749</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에서도 올바르게 렌더링됨을 의미합니다. RenderingOptions 속성을 통해 용지 크기, 여백 및 방향을 설정한 후 RenderHtmlAsPdf을 호출할 수 있습니다.
보다 복잡한 문서의 경우 HTML 문자열 대신 RenderUrlAsPdf에 전체 URL을 전달하세요. IronPDF는 페이지를 헤드리스 브라우저에서 로드하고, 자바스크립트를 실행하며, 스타일을 적용하고, 완전히 렌더링된 DOM을 PDF로 변환합니다. HTML에서 PDF로 변환 가이드를 검토하여 사용자 지정 헤더, 푸터, 페이지 번호 토큰을 포함하여 렌더링 옵션의 전체 세트를 확인하세요.
IronPDF로 ASP .NET C#에서 PDF 파일을 업로드 및 다운로드하는 방법: 이미지 4 - 생성된 예제 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로 설정되어 있습니다. 높이려면 builder.Services.Configure<FormOptions>를 호출하여 MultipartBodyLengthLimit을 설정하고 builder.WebHost.ConfigureKestrel을 호출하여 Limits.MaxRequestBodySize을 원하는 바이트 수(예: 50MB의 경우 50 * 1024 * 1024)로 Program.cs 전에 builder.Build()으로 설정하세요.
크기 제한 외에도 모든 업로드 엔드포인트에 콘텐츠 유형 헤더의 유효성 검사, 스트림의 첫 바이트에서 %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는 많은 규정 준수 요구사항을 충족하는 변조 증거 메타데이터를 가지고 있습니다.
클라우드로 스토리지 확장 로컬 byte[] 데이터베이스 열을 Azure Blob Storage 또는 Amazon S3 참조로 바꿉니다. 처리된 바이트를 워터마킹한 후 클라우드 스토리지에 업로드하고, 데이터베이스에 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 기능을 관리하고 확장하기 쉽게 만듭니다.


