IronPDF를 사용하여 ASP.NET 패널에서 PDF를 표시하는 방법
ASP.NET 패널 컨트롤 내에 PDF 문서를 표시하는 것은 문서 관리 시스템, 보고서 뷰어, 청구서 표시를 위한 일반적인 요구 사항입니다. IronPDF는 클라이언트 측 종속성을 제거하고 모든 브라우저 및 플랫폼에서 일관되게 작동하는 서버 측 렌더링을 통해 이를 해결합니다.
ASP.NET Core 웹 응용 프로그램 내에 PDF를 포함해야 할 때 브라우저 플러그인 또는 클라이언트 측 라이브러리에 의존하는 표준 접근 방식은 취약함을 초래합니다. Enterprise 환경의 플러그인 제한, 불규칙한 브라우저 동작 및 열악한 모바일 지원은 모두 사용자 경험을 저해합니다. 서버 측 접근 방식은 모든 문제를 제거합니다.
IronPDF는 서버에서 PDF 생성 및 배달을 전적으로 처리하므로 브라우저는 올바른 MIME 유형의 표준 PDF 바이트 스트림을 수신합니다. 플러그인이 필요 없고, 브라우저별 해결책도 필요 없습니다.

ASP.NET에서 서버 측 PDF 렌더링은 어떻게 작동합니까?
IronPDF는 PDF 렌더링을 헤드리스 Chrome 엔진을 사용하여 완전히 서버로 이동합니다. 컨트롤러는 PDF 문서를 생성하거나 검색하여 바이트 배열로 변환한 후, inline Content-Disposition 헤더와 함께 브라우저로 스트리밍합니다. 브라우저의 내장 PDF 뷰어는 이후 <iframe>에 귀하의 패널에 삽입된 문서를 표시합니다.
이 기본적인 변화는 전통적인 문제점을 제거합니다:
- 클라이언트 컴퓨터에 Adobe Reader나 브라우저 확장 프로그램이 필요 없음
- 사용자의 운영 체제나 브라우저 버전에 관계없이 일관된 렌더링
- 문서 콘텐츠, 레이아웃 및 스타일링에 대한 완전한 프로그래밍 제어
- IT 정책이 플러그인 설치를 차단하는 Enterprise 환경에서 작동
라이브러리의 Chrome 렌더링 엔진은 HTML, URL 및 원시 콘텐츠 소스에서 픽셀 완벽한 출력을 생성합니다. 출력이 클라이언트에 도달하기 전에 용지 크기, 여백, 헤더, 푸터 및 CSS 미디어 유형을 포함한 출력의 모든 측면을 제어할 수 있습니다.
IronPDF는 Windows, Linux 및 macOS 서버에서 크로스 플랫폼 배포도 지원하여 Azure 또는 AWS에서 실행되는 클라우드 호스팅 ASP.NET 애플리케이션뿐만 아니라 Docker를 사용하는 컨테이너 환경에도 적합합니다.

NuGet 패키지 설정 방법은?
Visual Studio를 열고 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭한 다음 NuGet 패키지 관리를 선택합니다. IronPdf를 검색하고 설치하십시오. 대안으로 패키지 관리자 콘솔에서 이 명령을 실행하세요:
Install-Package IronPdf
.NET CLI를 dotnet add package IronPdf와 함께 사용할 수도 있습니다. 설치되면, 라이브러리의 네임스페이스에 액세스하기 위해 컨트롤러 또는 서비스 클래스 맨 위에 using IronPdf;를 추가하십시오.
최적의 PDF 배달을 위해 Program.cs를 구성하여 정적 파일을 제공하고 라우팅을 설정하십시오:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();
var app = builder.Build();
app.UseStaticFiles();
app.UseRouting();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();
var app = builder.Build();
app.UseStaticFiles();
app.UseRouting();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.Extensions.DependencyInjection
Dim builder = WebApplication.CreateBuilder(args)
builder.Services.AddControllersWithViews()
builder.Services.AddRazorPages()
Dim app = builder.Build()
app.UseStaticFiles()
app.UseRouting()
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}")
app.Run()
AddControllersWithViews() 등록은 API 엔드포인트와 뷰 렌더링을 모두 가능하게 하며, 각각 PDF 콘텐츠를 전용 컨트롤러 액션을 통해 제공하고 Razor 뷰 패널 안에 표시할 때 필요합니다. 어떤 것인지에 대한 전체 구성 세부정보는 IronPDF API 문서를 참조하십시오.
패널 내에서 바로 PDF 파일을 표시하려면 어떻게 해야 합니까?
핵심 패턴은 간단합니다: 컨트롤러 액션이 PDF를 생성하여 바이트로 변환하고 Content-Disposition 헤더를 inline로 설정한 후, File 결과를 반환합니다. Razor 뷰의 <iframe>는 해당 엔드포인트를 가리킵니다.
다음은 완전한 컨트롤러 구현입니다:
[ApiController]
[Route("api/[controller]")]
public class PdfPanelController : ControllerBase
{
[HttpGet("display/{documentId}")]
public IActionResult DisplayPdfInPanel(string documentId)
{
var renderer = new ChromePdfRenderer();
string filename = $"document_{documentId}.pdf";
var htmlContent = $@"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; margin: 40px; }}
h1 {{ color: #333; }}
.content {{ line-height: 1.6; }}
</style>
</head>
<body>
<h1>Document #{documentId}</h1>
<div class='content'>
<p>This PDF is generated dynamically and displayed inline in your panel.</p>
<p>Generated at: {DateTime.Now:yyyy-MM-dd HH:mm:ss}</p>
</div>
</body>
</html>";
using var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
byte[] pdfBytes = pdfDocument.BinaryData;
Response.Headers.Append("Content-Disposition", $"inline; filename={filename}");
return File(pdfBytes, "application/pdf");
}
}
[ApiController]
[Route("api/[controller]")]
public class PdfPanelController : ControllerBase
{
[HttpGet("display/{documentId}")]
public IActionResult DisplayPdfInPanel(string documentId)
{
var renderer = new ChromePdfRenderer();
string filename = $"document_{documentId}.pdf";
var htmlContent = $@"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; margin: 40px; }}
h1 {{ color: #333; }}
.content {{ line-height: 1.6; }}
</style>
</head>
<body>
<h1>Document #{documentId}</h1>
<div class='content'>
<p>This PDF is generated dynamically and displayed inline in your panel.</p>
<p>Generated at: {DateTime.Now:yyyy-MM-dd HH:mm:ss}</p>
</div>
</body>
</html>";
using var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
byte[] pdfBytes = pdfDocument.BinaryData;
Response.Headers.Append("Content-Disposition", $"inline; filename={filename}");
return File(pdfBytes, "application/pdf");
}
}
Imports Microsoft.AspNetCore.Mvc
Imports System
<ApiController>
<Route("api/[controller]")>
Public Class PdfPanelController
Inherits ControllerBase
<HttpGet("display/{documentId}")>
Public Function DisplayPdfInPanel(documentId As String) As IActionResult
Dim renderer = New ChromePdfRenderer()
Dim filename As String = $"document_{documentId}.pdf"
Dim htmlContent As String = $"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; margin: 40px; }}
h1 {{ color: #333; }}
.content {{ line-height: 1.6; }}
</style>
</head>
<body>
<h1>Document #{documentId}</h1>
<div class='content'>
<p>This PDF is generated dynamically and displayed inline in your panel.</p>
<p>Generated at: {DateTime.Now:yyyy-MM-dd HH:mm:ss}</p>
</div>
</body>
</html>"
Using pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
Dim pdfBytes As Byte() = pdfDocument.BinaryData
Response.Headers.Append("Content-Disposition", $"inline; filename={filename}")
Return File(pdfBytes, "application/pdf")
End Using
End Function
End Class
ChromePdfRenderer 클래스는 서버 측 렌더링의 주요 진입점입니다. HTML 콘텐츠를 수락하여 헤드리스 Chrome 브라우저를 사용해 변환하고 PdfDocument 객체를 반환합니다. BinaryData 속성은 스트리밍을 위한 원시 바이트를 노출합니다.
패널 표시를 위해 Content-Disposition를 inline로 설정하는 것이 중요한 단계입니다. 없으면 브라우저가 <iframe> 안에 렌더링하지 않고 다운로드를 제안합니다. 또한 페이지마다 헤더 및 푸터 추가를 하거나RenderingOptions을 통해 페이지 방향 및 사용자 정의 여백을 제어할 수 있습니다.
이 엔드포인트를 Razor 패널에 임베드하려면, <iframe>를 생성하여 컨트롤러 경로를 가리킵니다:
@page
@model IndexModel
<div class="container mt-4">
<div class="card">
<div class="card-header">
<h3>PDF Display Panel</h3>
</div>
<div class="card-body">
<div class="pdf-panel" style="height: 600px;">
<iframe src="/api/PdfPanel/display/12345"
width="100%"
height="100%"
frameborder="0">
</iframe>
</div>
</div>
</div>
</div>
@page
@model IndexModel
<div class="container mt-4">
<div class="card">
<div class="card-header">
<h3>PDF Display Panel</h3>
</div>
<div class="card-body">
<div class="pdf-panel" style="height: 600px;">
<iframe src="/api/PdfPanel/display/12345"
width="100%"
height="100%"
frameborder="0">
</iframe>
</div>
</div>
</div>
</div>
The provided code is a Razor page markup, which is not directly translatable to VB.NET as it is not C# code. Razor pages are used in ASP.NET Core for creating dynamic web pages and are written in a combination of HTML and C#.
If you need to convert the C# logic within a Razor page to VB.NET, you would typically focus on the code-behind file or any C# code embedded within the Razor markup. However, the provided snippet contains only HTML and Razor directives without any C# logic to convert.
If you have a specific C# code-behind logic or embedded C# code within a Razor page that you need to convert to VB.NET, please provide that portion, and I can assist with the conversion.
<iframe>가 컨트롤러 엔드포인트에서 PDF를 요청합니다. 웹 브라우저의 내장 PDF 뷰어가 나머지를 처리하며, 클라이언트 측 라이브러리나 플러그인 없이 문서를 전체 패널 너비와 높이로 표시합니다.
생성된 PDF 파일은 어떤 모습인가요?

AJAX로 동적으로 PDF를 로드하려면 어떻게 해야 합니까?
정적 <iframe> 소스는 고정 콘텐츠에 잘 동작하지만, 많은 애플리케이션은 데이터 그리드에서 레코드를 클릭하거나 양식을 제출하거나 보고서 유형을 선택하는 것과 같은 사용자 작업에 따라 PDF를 로드해야 합니다. AJAX 기반 접근 방식은 전체 페이지를 다시 로드하지 않고 이러한 시나리오를 처리합니다.
컨트롤러 동작은 요청 본문을 받아 base64 문자열로 PDF를 반환합니다:
[HttpPost("generate")]
public async Task<IActionResult> GenerateDynamicPdf([FromBody] PdfRequestModel request)
{
try
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var htmlBuilder = new StringBuilder();
htmlBuilder.Append("<html><body>");
htmlBuilder.Append($"<h2>{request.Title}</h2>");
htmlBuilder.Append($"<div>{request.Content}</div>");
if (request.IncludeData)
{
htmlBuilder.Append("<table border='1' style='width:100%;'>");
foreach (var item in request.DataItems)
{
htmlBuilder.Append($"<tr><td>{item.Key}</td><td>{item.Value}</td></tr>");
}
htmlBuilder.Append("</table>");
}
htmlBuilder.Append("</body></html>");
var pdfDocument = await Task.Run(() =>
renderer.RenderHtmlAsPdf(htmlBuilder.ToString()));
var base64Pdf = Convert.ToBase64String(pdfDocument.BinaryData);
return Ok(new { success = true, pdfData = base64Pdf });
}
catch (Exception ex)
{
return BadRequest(new { success = false, error = ex.Message });
}
}
[HttpPost("generate")]
public async Task<IActionResult> GenerateDynamicPdf([FromBody] PdfRequestModel request)
{
try
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var htmlBuilder = new StringBuilder();
htmlBuilder.Append("<html><body>");
htmlBuilder.Append($"<h2>{request.Title}</h2>");
htmlBuilder.Append($"<div>{request.Content}</div>");
if (request.IncludeData)
{
htmlBuilder.Append("<table border='1' style='width:100%;'>");
foreach (var item in request.DataItems)
{
htmlBuilder.Append($"<tr><td>{item.Key}</td><td>{item.Value}</td></tr>");
}
htmlBuilder.Append("</table>");
}
htmlBuilder.Append("</body></html>");
var pdfDocument = await Task.Run(() =>
renderer.RenderHtmlAsPdf(htmlBuilder.ToString()));
var base64Pdf = Convert.ToBase64String(pdfDocument.BinaryData);
return Ok(new { success = true, pdfData = base64Pdf });
}
catch (Exception ex)
{
return BadRequest(new { success = false, error = ex.Message });
}
}
Imports System.Text
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
<HttpPost("generate")>
Public Async Function GenerateDynamicPdf(<FromBody> request As PdfRequestModel) As Task(Of IActionResult)
Try
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
Dim htmlBuilder = New StringBuilder()
htmlBuilder.Append("<html><body>")
htmlBuilder.Append($"<h2>{request.Title}</h2>")
htmlBuilder.Append($"<div>{request.Content}</div>")
If request.IncludeData Then
htmlBuilder.Append("<table border='1' style='width:100%;'>")
For Each item In request.DataItems
htmlBuilder.Append($"<tr><td>{item.Key}</td><td>{item.Value}</td></tr>")
Next
htmlBuilder.Append("</table>")
End If
htmlBuilder.Append("</body></html>")
Dim pdfDocument = Await Task.Run(Function() renderer.RenderHtmlAsPdf(htmlBuilder.ToString()))
Dim base64Pdf = Convert.ToBase64String(pdfDocument.BinaryData)
Return Ok(New With {Key .success = True, Key .pdfData = base64Pdf})
Catch ex As Exception
Return BadRequest(New With {Key .success = False, Key .error = ex.Message})
End Try
End Function
RenderingOptions 블록을 통해 렌더링 전에 용지 크기, 여백 및 CSS 미디어 유형을 구성할 수 있습니다. Microsoft의 ASP.NET Core 문서에 따르면, 비동기 패턴은 로드가 걸렸을 때 반응형 인터페이스를 유지하는 데 필수적입니다. 동기 렌더 호출을 Task.Run에 감싸는 것은 Chrome 엔진이 HTML을 처리하는 동안 요청 스레드를 자유롭게 유지합니다.
base64 응답의 경우 JavaScript 클라이언트가 페이지 재로드 없이 <iframe> 소스를 직접 업데이트할 수 있습니다:
fetch('/api/PdfPanel/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(requestData)
})
.then(response => response.json())
.then(result => {
if (result.success) {
const iframe = document.getElementById('pdf-frame');
iframe.src = 'data:application/pdf;base64,' + result.pdfData;
}
});
fetch('/api/PdfPanel/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(requestData)
})
.then(response => response.json())
.then(result => {
if (result.success) {
const iframe = document.getElementById('pdf-frame');
iframe.src = 'data:application/pdf;base64,' + result.pdfData;
}
});
이 패턴은 Razor Pages 및 MVC 뷰에 모두 잘 작동합니다. 고급 사용 사례를 위해 IronPDF는 또한 비동기 렌더링을 기본적으로 지원하여 RenderHtmlAsPdfAsync를 직접 Task.Run 대신 사용할 수 있습니다.
다른 PDF 소스 유형을 처리하려면 어떻게 해야 합니까?
IronPDF는 세 가지 주요 소스에서 PDF를 생성할 수 있습니다: HTML 문자열, 로컬 HTML 파일 및 외부 URL. 각각은 다른 시나리오에 적합합니다.
HTML 템플릿을 PDF로 변환하려면 어떻게 해야 합니까?
템플릿 기반 생성은 Enterprise ASP.NET 애플리케이션에서 가장 일반적인 패턴입니다. 플레이스홀더 토큰이 포함된 HTML 템플릿을 유지보수하고 런타임에 데이터를 주입한 후 결과를 렌더링합니다:
[HttpGet("from-html")]
public IActionResult GenerateFromHtmlString(string reportType)
{
var renderer = new ChromePdfRenderer();
var htmlTemplate = GetHtmlTemplate(reportType);
var userName = User?.Identity?.Name ?? "Unknown";
var processedHtml = htmlTemplate
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd"))
.Replace("{{USER}}", userName)
.Replace("{{REPORT_TYPE}}", reportType);
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
using var pdf = renderer.RenderHtmlAsPdf(processedHtml);
pdf.SaveAs(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", $"{reportType}.pdf"));
return File(pdf.BinaryData, "application/pdf");
}
private string GetHtmlTemplate(string reportType)
{
return @"
<html>
<head><title>{{REPORT_TYPE}} Report</title></head>
<body>
<h1>{{REPORT_TYPE}} Report</h1>
<p>Date: {{DATE}}</p>
<p>User: {{USER}}</p>
<div>Report content goes here.</div>
</body>
</html>";
}
[HttpGet("from-html")]
public IActionResult GenerateFromHtmlString(string reportType)
{
var renderer = new ChromePdfRenderer();
var htmlTemplate = GetHtmlTemplate(reportType);
var userName = User?.Identity?.Name ?? "Unknown";
var processedHtml = htmlTemplate
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd"))
.Replace("{{USER}}", userName)
.Replace("{{REPORT_TYPE}}", reportType);
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
using var pdf = renderer.RenderHtmlAsPdf(processedHtml);
pdf.SaveAs(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", $"{reportType}.pdf"));
return File(pdf.BinaryData, "application/pdf");
}
private string GetHtmlTemplate(string reportType)
{
return @"
<html>
<head><title>{{REPORT_TYPE}} Report</title></head>
<body>
<h1>{{REPORT_TYPE}} Report</h1>
<p>Date: {{DATE}}</p>
<p>User: {{USER}}</p>
<div>Report content goes here.</div>
</body>
</html>";
}
Imports System
Imports Microsoft.AspNetCore.Mvc
Imports IronPdf
Imports System.IO
<HttpGet("from-html")>
Public Function GenerateFromHtmlString(reportType As String) As IActionResult
Dim renderer As New ChromePdfRenderer()
Dim htmlTemplate As String = GetHtmlTemplate(reportType)
Dim userName As String = If(User?.Identity?.Name, "Unknown")
Dim processedHtml As String = htmlTemplate _
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd")) _
.Replace("{{USER}}", userName) _
.Replace("{{REPORT_TYPE}}", reportType)
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
Using pdf = renderer.RenderHtmlAsPdf(processedHtml)
pdf.SaveAs(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", $"{reportType}.pdf"))
Return File(pdf.BinaryData, "application/pdf")
End Using
End Function
Private Function GetHtmlTemplate(reportType As String) As String
Return "
<html>
<head><title>{{REPORT_TYPE}} Report</title></head>
<body>
<h1>{{REPORT_TYPE}} Report</h1>
<p>Date: {{DATE}}</p>
<p>User: {{USER}}</p>
<div>Report content goes here.</div>
</body>
</html>"
End Function
CssMediaType.Print는 PDF가 프린트 전용 CSS 규칙을 사용하도록 보장하며, 일반적으로 네비게이션 바, 사이드바 및 다른 화면 전용 요소를 제거합니다. 웹 뷰와 PDF 생성 사이에 HTML 템플릿이 공유될 때 더 깨끗한 출력을 생산합니다. 맞춤 워터마크나 브랜드 적용을 위한 배경 이미지를 적용할 수도 있습니다. 페이지 분리 제어는 복합 레이아웃의 경우 새로운 페이지가 시작될 정확한 위치를 지정하도록 합니다.
HTML 템플릿 PDF 출력은 어떻게 보입니까?

외부 URL로부터 PDF를 생성하려면 어떻게 해야 합니까?
외부 웹 페이지 - 경쟁사 분석, 규제 문서 저장, 또는 제3자 서비스 콘텐츠 캡처 등 - 을 캡처하기 위해 IronPDF는 모든 공개 접근이 가능한 URL을 렌더링할 수 있습니다:
[HttpGet("from-url")]
public async Task<IActionResult> GenerateFromUrl(string encodedUrl)
{
var url = HttpUtility.UrlDecode(encodedUrl);
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.ViewPortWidth = 1920;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(2000);
using var pdf = await renderer.RenderUrlAsPdfAsync(url);
Response.Headers.Append("Content-Disposition", "inline; filename=webpage.pdf");
return File(pdf.BinaryData, "application/pdf");
}
[HttpGet("from-url")]
public async Task<IActionResult> GenerateFromUrl(string encodedUrl)
{
var url = HttpUtility.UrlDecode(encodedUrl);
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.ViewPortWidth = 1920;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(2000);
using var pdf = await renderer.RenderUrlAsPdfAsync(url);
Response.Headers.Append("Content-Disposition", "inline; filename=webpage.pdf");
return File(pdf.BinaryData, "application/pdf");
}
Imports System.Web
Imports Microsoft.AspNetCore.Mvc
<HttpGet("from-url")>
Public Async Function GenerateFromUrl(encodedUrl As String) As Task(Of IActionResult)
Dim url = HttpUtility.UrlDecode(encodedUrl)
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.ViewPortWidth = 1920
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.WaitFor.RenderDelay(2000)
Using pdf = Await renderer.RenderUrlAsPdfAsync(url)
Response.Headers.Append("Content-Disposition", "inline; filename=webpage.pdf")
Return File(pdf.BinaryData, "application/pdf")
End Using
End Function
ViewPortWidth 설정은 페이지가 PDF로 변환되기 전에 헤드리스 브라우저가 페이지를 렌더링하는 너비를 결정합니다. 1920 픽셀 뷰포트는 데스크톱 해상도에서 현대적 반응형 레이아웃을 캡처합니다. 렌더링 지연은 JavaScript가 많은 단일 페이지 애플리케이션이 스크린샷이 찍히기 전에 초기화를 완료할 수 있는 시간을 제공합니다.
더 발전된 캡처 시나리오를 위해, IronPDF는 JavaScript 실행 제어, 인증된 페이지에 대한 쿠키 전달, 및 뷰포트 확대/축소 조정을 지원합니다.
메모리 및 성능을 어떻게 관리하나요?
PDF 생성은 리소스를 많이 소모합니다. ChromePdfRenderer 호출은 각 헤드리스 Chrome 프로세스를 생성하며, 각PdfDocument 객체는 렌더링된 바이트를 메모리에 보관합니다. 적절한 처분은 자원 누수를 방지하고 메모리 소비를 부하에 따라 예측 가능하게 유지합니다.
항상 using 문장을 PdfDocument와 함께 사용하십시오:
public IActionResult OptimizedPdfGeneration()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = false;
var processedHtml = GetHtmlTemplate("report")
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd"))
.Replace("{{USER}}", "Test")
.Replace("{{REPORT_TYPE}}", "Report");
using var pdf = renderer.RenderHtmlAsPdf(processedHtml);
byte[] pdfBytes = pdf.BinaryData;
pdf.SaveAs("output.pdf");
return File(pdfBytes, "application/pdf");
}
public IActionResult OptimizedPdfGeneration()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = false;
var processedHtml = GetHtmlTemplate("report")
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd"))
.Replace("{{USER}}", "Test")
.Replace("{{REPORT_TYPE}}", "Report");
using var pdf = renderer.RenderHtmlAsPdf(processedHtml);
byte[] pdfBytes = pdf.BinaryData;
pdf.SaveAs("output.pdf");
return File(pdfBytes, "application/pdf");
}
Imports System
Imports Microsoft.AspNetCore.Mvc
Public Class PdfController
Inherits Controller
Public Function OptimizedPdfGeneration() As IActionResult
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.CreatePdfFormsFromHtml = False
Dim processedHtml = GetHtmlTemplate("report") _
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd")) _
.Replace("{{USER}}", "Test") _
.Replace("{{REPORT_TYPE}}", "Report")
Using pdf = renderer.RenderHtmlAsPdf(processedHtml)
Dim pdfBytes As Byte() = pdf.BinaryData
pdf.SaveAs("output.pdf")
Return File(pdfBytes, "application/pdf")
End Using
End Function
Private Function GetHtmlTemplate(templateName As String) As String
' Placeholder for the actual implementation
Return String.Empty
End Function
End Class
using 문장은 byte 배열을 추출한 후에 PdfDocument 객체가 즉시 해제되도록 하며, 하류에서 예외가 발생하더라도 그렇게 됩니다. PDF를 자주 생성하는 응용 프로그램의 경우, 다음과 같은 추가 전략을 고려하십시오:
- 캐싱: 자주 요청되는 PDF를 메모리 캐시 또는 디스크에 저장합니다.
IMemoryCache을 사용하여 문서 식별자 및 타임스탬프별로 인덱스된 바이트 배열을 캐시하십시오. - 스트리밍: 아주 큰 문서의 경우, 큰 연속 메모리 블록 할당을 피하기 위해 바이트 배열 대신 PDF 메모리 스트림을 사용하세요.
- 선형화: 브라우저가 전체 파일을 다운로드하기 전에 렌더링을 시작할 수 있도록 선형화된 (빠른 웹 보기) 출력을 활성화합니다.
- 압축: 제한된 네트워크 연결을 통해 문서를 제공할 때 파일 크기를 줄이기 위해 PDF 압축을 적용합니다.
IronPDF 성능 가이드는 높은 처리량 시나리오에 대한 추가 최적화 전략을 다룹니다.
최적화된 PDF 출력은 무엇을 생성합니까?

보안 및 크로스 브라우저 호환성을 어떻게 보장합니까?
보안을 신뢰할 수 있는 상태로 유지하는 것은 PDF 패널 디스플레이를 프로덕션에 배포하기 전에 모두 주의를 기울여야 합니다.
입력 유효성 검사: HTML 템플릿에 동적 콘텐츠를 주입하기 전에 항상 이를 정화하십시오. Chrome 엔진을 통해 렌더링된 정화되지 않은 사용자 입력은 서버를 SSRF 및 XSS 공격에 노출시킬 수 있습니다. 기존의 HTML 인코딩 라이브러리를 사용하거나 허용할 수 있는 안전한 목록으로 허용되는 문자를 제한하세요.
액세스 제어: PDF 엔드포인트를 인증 및 권한 부여 미들웨어 뒤에 보호하십시오. /api/PdfPanel/display/12345와 같은 URL은 호출자의 신원을 확인하지 않고 문서를 반환하는 경우 데이터 노출 위험이 있습니다. [Authorize] 속성을 적용하고 인증된 사용자가 요청된 문서 ID에 액세스할 수 있는 권한이 있는지 확인하십시오.
MIME 유형 구성: 항상 application/pdf을 콘텐츠 유형으로 반환하십시오. 잘못된 MIME 유형을 받은 브라우저는 다운로드 대화 상자를 트리거하거나 인라인으로 렌더링하는 것을 거부할 수 있습니다. wwwroot에서 정적 PDF 파일도 제공하는 경우 애플리케이션의 MIME 유형 매핑에 PDF가 포함되어 있는지 확인하십시오.
크로스 브라우저 인라인 표시: 최신 브라우저 -- Chrome, Firefox, Edge 및 Safari --는 모두 Content-Disposition: inline 헤더를 통해 인라인 PDF 표시를 지원합니다. W3C 콘텐츠 보안 정책 사양은 패널이 다른 출처에서 PDF를 포함하는 경우 frame-ancestors 지침에 대한 안내를 제공합니다. IronPDF의 서버 측 렌더링은 PDF 생성이 클라이언트와 독립적으로 발생하기 때문에 대부분의 브라우저 렌더링 불일치를 제거합니다.
오류 처리: PDF 생성 시 try-catch 블록으로 감싸고 의미 있는 HTTP 상태 코드를 반환하세요. 본문이 없는 500 응답은 진단하기 어렵습니다. 구조화된 오류 객체를 반환하면 클라이언트 측 코드가 깨진 <iframe> 대신 사용자 친화적인 메시지를 표시할 수 있습니다.
문서 보안을 위해, IronPDF는 암호 보호 및 권한 설정, 디지털 서명, 그리고 보관 요구 사항을 위한 PDF/A 규격 준수를 지원합니다.

다음 단계는 무엇입니까?
이제 PDF를 ASP.NET 패널에 표시하기 위한 작동 패턴을 갖추었습니다: IronPDF를 설치하고 Content-Disposition: inline을 사용하는 PDF를 생성하여 반환하는 컨트롤러 액션을 작성하고 Razor 패널 내에 <iframe>에 엔드포인트를 임베드하십시오. 그 후, AJAX 패턴은 페이지를 새로 고침하지 않고 사용자 작업에 반응하여 문서를 동적으로 로드할 수 있게 해줍니다.
IronPDF의 무료 체험판을 시작하여 신용 카드 없이 귀하의 프로젝트에서 이러한 패턴을 테스트해보세요. 체험판은 HTML을 PDF로 렌더링, URL 캡처 및 고급 PDF 조작을 포함하여 모든 기능에 대한 완전한 접근을 제공합니다.
기본 디스플레이가 작동한 후에는 다음과 같은 자연스러운 확장을 고려하세요:
- PDF 파일 병합 또는 분할로 문서 조립 워크플로우 용
- HTML 양식에서 작성 가능한 PDF 양식 생성
- 문서 인증을 위한 디지털 서명 추가
- 기존 PDF 편집하여 도장 찍기, 주석 추가 또는 내용 삭제하기
- HTML을 PDF로 변환하여 복잡한 보고서 레이아웃에 대한 전체 CSS 및 JavaScript 지원
IronPDF 문서에서는 이 기능 각각을 심도 있게 다루며, 완전한 코드 예제와 구성 참조를 제공합니다.
자주 묻는 질문
ASP.NET 패널에서 PDF를 표시하는 목적은 무엇입니까?
ASP.NET 패널에서 PDF를 표시하면 개발자가 웹 애플리케이션에 PDF 문서를 직접 통합할 수 있어 문서 관리, 보고서 보기, 또는 송장 표시를 위한 원활한 사용자 경험을 제공합니다.
ASP.NET에서 PDF를 표시하는 데 IronPDF가 어떻게 도움이 될 수 있나요?
IronPDF는 개발자가 ASP.NET 패널 내에서 PDF 문서를 원활하게 렌더링하고 표시할 수 있는 도구를 제공하여 원활한 통합과 일관된 사용자 인터페이스를 보장합니다.
ASP.NET 애플리케이션에서 PDF를 표시하는 데 IronPDF를 사용하는 이점은 무엇입니까?
IronPDF를 사용하면 PDF 통합이 쉬워지고 개발 시간이 단축되며, UI 컨트롤 내의 고품질 PDF 렌더링을 제공함으로써 ASP.NET 애플리케이션의 기능이 향상됩니다.
IronPDF를 ASP.NET에서 문서 관리 시스템 구축에 사용할 수 있습니까?
네, IronPDF는 ASP.NET 패널 내에서 원활한 PDF 표시를 지원하여 웹에서 직접 문서 관리 및 보기 기능을 강화하므로 문서 관리 시스템 구축에 이상적입니다.
IronPDF는 PDF 표시를 위한 ASP.NET Core와 호환됩니까?
IronPDF는 ASP.NET Core와 완벽하게 호환되며, 개발자가 패널 컨트롤을 사용하여 웹 애플리케이션 내에 PDF 문서를 표시할 수 있어 현대적인 웹 통합을 보장합니다.


