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

IronPDF로 Blazor에서 PDF를 표시하는 방법

Blazor 애플리케이션에서 PDF를 표시하려면, IronPDF의 PDF 뷰어 컴포넌트를 사용하세요. 이는 Blazor 서버 앱과 통합되며, 폼 작성, 주석 달기, 모바일 지원과 같은 기능을 제공하는 고성능 PDF 렌더링을 위해 타사 브라우저 도구에 의존하지 않습니다.

왜 Blazor 애플리케이션에 전용 PDF 뷰어가 필요합니까?

현대 웹 애플리케이션에서 PDF를 표시하려면 기본 브라우저 기능을 넘어서는 신뢰할 수 있는 뷰어 컴포넌트가 필요합니다. .NET 개발자가 Blazor 애플리케이션을 구축하기 위해, IronPDFBlazor 서버 앱과 통합되는 효과적인 PDF 뷰어 솔루션을 제공합니다. 이로 인해 타사 브라우저 도구에 의존하지 않고 고성능 PDF 렌더링과 풍부한 기능성이 가능해집니다.

브라우저 PDF에 대한 기본 지원은 브라우저와 플랫폼마다 상당히 다르므로, 일관되지 않은 사용자 경험을 초래할 수 있습니다. Blazor 애플리케이션에서 맞춤형 PDF 뷰어를 구현하면, 모든 플랫폼에서 일관된 기능성을 보장하는 보기 환경에 대한 완전한 제어를 얻을 수 있습니다. 이것은 규정 준수 기준 및 고급 보안 기능을 필요로 하는 애플리케이션에 특히 중요합니다.

Microsoft의 ASP.NET Core에서 구축된 Blazor 프레임워크는 PDF 조작 라이브러리와 자연스럽게 결합되는 컴포넌트 기반 개발을 가능하게 합니다. 외부 CDN에서 타사 뷰어 위젯을 포함시키는 대신, 애플리케이션의 정확한 요구 사항에 맞춘 컴포넌트를 구축할 수 있습니다.

Blazor 프로젝트에 IronPDF를 어떻게 설치합니까?

Blazor PDF 뷰어를 구현하기 전에, IronPDF를 설치하십시오. NuGet을 통해 패키지 관리자 콘솔 또는 .NET CLI를 사용하여 Blazor 서버 앱에 추가하십시오:

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

다음으로, 새로운 Blazor 애플리케이션을 생성하고 최신 버전의 .NET이 설치되어 있는지 확인하십시오. PDF 파일을 쉽게 접근할 수 있도록 wwwroot 폴더에 저장하거나, 바이트 배열이나 URL 등의 다른 소스에서 로드하십시오. 설치 개요는 다양한 배포 시나리오에 대한 자세한 지침을 제공합니다.

필수 선행 조건은 무엇입니까?

Blazor PDF 뷰어를 성공적으로 구현하려면 다음이 필요합니다:

  • 개발 머신에 .NET 10이 설치되어 있어야 합니다
  • Visual Studio 2022 또는 C# 확장이 포함된 Visual Studio Code
  • IronPDF 라이센스 키 (무료 체험판을 통해 이용 가능)
  • Blazor 구성 요소 구조에 대한 기본 이해
  • 테스트를 위한 샘플 PDF 파일 (이를 wwwroot 폴더에 배치합니다)

Windows 배포의 경우 적절한 Visual C++ 런타임을 확인하십시오. Linux 사용자는 필요한 종속성을 설치해야 하며, macOS 개발자는 인텔과 Apple Silicon 호환성을 고려해야 합니다.

어디에 PDF 파일을 저장해야 합니까?

PDF 파일 저장 위치는 애플리케이션의 성능과 보안에 상당히 영향을 미칩니다. Blazor 애플리케이션의 경우 다음 옵션을 고려하십시오:

  • wwwroot 폴더: 민감한 정보가 없는 정적 PDF에 이상적
  • Azure 블롭 스토리지: 유연한 저장소가 필요한 클라우드 애플리케이션
  • 바이트 배열로서 데이터베이스: 접근 제어가 필요한 작은 PDF에 적합
  • 보호된 서버 디렉토리: 보안 요구 사항이 있는 민감한 문서에 최적
  • 메모리 스트림: HTML을 PDF로 변환하여 동적으로 생성된 PDF에 이상적

Blazor PDF 뷰어 구성 요소를 어떻게 만듭니까?

PDF 문서를 표시할 수 있는 기본 Blazor PDF 뷰어 구성 요소를 빌드하십시오. 프로젝트에서 새로운 Razor 구성 요소를 생성하십시오:

@page "/pdfviewer"
@rendermode 인터랙티브Server
@using IronPdf
@inject IJSRuntime JSRuntime
@inject Microsoft.AspNetCore.Hosting.IWebHostEnvironment WebHostEnvironment

<h3>PDF Viewer Component</h3>
<div>
    <button @onclick="LoadPdfDocument">Open File</button>
    <div id="pdfContainer">
        @if (!string.IsNullOrEmpty(pdfUrl))
        {
            <iframe src="@pdfUrl" style="width:100%; height:600px;"></iframe>
        }
    </div>
</div>

@code {
    private string pdfUrl = "";
    private byte[] pdfData = Array.Empty<byte>();

    private async Task LoadPdfDocument()
    {
        var pdfDocument = PdfDocument.FromFile("wwwroot/sample.pdf");
        pdfData = pdfDocument.BinaryData;
        var base64 = Convert.ToBase64String(pdfData);
        pdfUrl = $"data:application/pdf;base64,{base64}";
    }
}
@page "/pdfviewer"
@rendermode 인터랙티브Server
@using IronPdf
@inject IJSRuntime JSRuntime
@inject Microsoft.AspNetCore.Hosting.IWebHostEnvironment WebHostEnvironment

<h3>PDF Viewer Component</h3>
<div>
    <button @onclick="LoadPdfDocument">Open File</button>
    <div id="pdfContainer">
        @if (!string.IsNullOrEmpty(pdfUrl))
        {
            <iframe src="@pdfUrl" style="width:100%; height:600px;"></iframe>
        }
    </div>
</div>

@code {
    private string pdfUrl = "";
    private byte[] pdfData = Array.Empty<byte>();

    private async Task LoadPdfDocument()
    {
        var pdfDocument = PdfDocument.FromFile("wwwroot/sample.pdf");
        pdfData = pdfDocument.BinaryData;
        var base64 = Convert.ToBase64String(pdfData);
        pdfUrl = $"data:application/pdf;base64,{base64}";
    }
}
Imports IronPdf
Imports Microsoft.AspNetCore.Hosting
Imports Microsoft.AspNetCore.Components
Imports Microsoft.JSInterop

@page "/pdfviewer"
@rendermode InteractiveServer

<h3>PDF Viewer Component</h3>
<div>
    <button @onclick="LoadPdfDocument">Open File</button>
    <div id="pdfContainer">
        @If Not String.IsNullOrEmpty(pdfUrl) Then
            <iframe src="@pdfUrl" style="width:100%; height:600px;"></iframe>
        End If
    </div>
</div>

@code
Private pdfUrl As String = ""
Private pdfData As Byte() = Array.Empty(Of Byte)()

Private Async Function LoadPdfDocument() As Task
    Dim pdfDocument = PdfDocument.FromFile("wwwroot/sample.pdf")
    pdfData = pdfDocument.BinaryData
    Dim base64 = Convert.ToBase64String(pdfData)
    pdfUrl = $"data:application/pdf;base64,{base64}"
End Function
$vbLabelText   $csharpLabel

이 코드는 PDF 문서를 로드하고 iframe을 사용하여 표시하는 PDF 뷰어 구성 요소를 만듭니다. LoadPdfDocument 메서드는 wwwroot 폴더에서 PDF를 읽고 iframe에서 직접 렌더링하는 base64 데이터 URL로 변환합니다. 이 접근 방식은 다양한 PDF 버전과 국제 문서의 UTF-8 인코딩을 지원합니다.

구성 요소가 PDF 파일을 어떻게 로드합니까?

구성 요소는 IronPDF의 문서 로딩 기능을 사용하여 PDF 파일을 효율적으로 읽습니다. 사용자가 '파일 열기' 버튼을 클릭하면, 메서드는:

  1. PdfDocument.FromFile를 사용하여 PDF 파일을 로드합니다
  2. 로드된 PDF 문서에서 이진 데이터를 추출합니다
  3. 브라우저 호환성을 위해 Base64 형식으로 변환합니다
  4. 브라우저가 직접 렌더링할 수 있는 데이터 URL을 생성합니다

이 접근 방식은 PDF 디스플레이에 대해 좋은 성능을 유지하면서 다양한 브라우저 간 호환성을 보장합니다. 구성 요소는 다양한 용지 크기와 페이지 방향을 처리할 수 있습니다.

출력

Blazor PDF 뷰어 컴포넌트가 'PDF란?' 내용을 포함한 샘플 PDF를 표시하면서 탐색 컨트롤, 확대 옵션, 파일 열기 버튼을 보여주는 스크린샷.

JavaScript Interop을 사용하여 더 나은 PDF 디스플레이를 어떻게 만듭니까?

PDF 콘텐츠 디스플레이에 대한 더 나은 제어를 위해 JavaScript 상호 운용성을 사용하여 PDF 뷰어 기능을 처리합니다. 이 패턴은 JavaScript 모듈을 비동기로 로드하고 브라우저의 네이티브 블롭/URL API로 렌더링을 위임합니다. 이는 잘 맞는 방식을 제공합니다 Blazor의 구성 요소 생명주기:

@page "/pdf-jsinterop"
@rendermode 인터랙티브Server
@using IronPdf
@inject IJSRuntime JSRuntime
@inject Microsoft.AspNetCore.Hosting.IWebHostEnvironment WebHostEnvironment
@implements IAsyncDisposable

<h3>IronPDF JavaScript Interop Viewer</h3>
<p>Displays PDF using JavaScript Blob/ObjectURL capabilities.</p>

@if (!string.IsNullOrEmpty(ErrorMessage))
{
    <div class="alert alert-danger">Error: @ErrorMessage</div>
}

<div id="@documentId" style="border: 1px solid #ccc; width: 100%; min-height: 600px;">
    Loading PDF...
</div>

@code {
    private string documentId = Guid.NewGuid().ToString();
    private string ErrorMessage = string.Empty;
    private bool pdfLoaded = false;
    private IJSObjectReference? jsModule;

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender && !pdfLoaded)
        {
            try
            {
                jsModule = await JSRuntime.InvokeAsync<IJSObjectReference>(
                    "import", "./pdfViewerInterop.js");
                await LoadPdfWithJavaScript();
                pdfLoaded = true;
            }
            catch (Exception ex)
            {
                ErrorMessage = $"Failed to load JS module: {ex.Message}";
            }
            finally
            {
                StateHasChanged();
            }
        }
    }

    private async Task LoadPdfWithJavaScript()
    {
        if (jsModule is null) return;
        var pdfPath = Path.Combine(WebHostEnvironment.WebRootPath, "sample.pdf");
        if (!File.Exists(pdfPath))
        {
            ErrorMessage = $"File not found: {pdfPath}";
            return;
        }
        var pdf = PdfDocument.FromFile(pdfPath);
        await jsModule.InvokeVoidAsync("displayPdf", documentId, pdf.BinaryData);
    }

    public async ValueTask DisposeAsync()
    {
        if (jsModule is not null)
            await jsModule.DisposeAsync();
    }
}
@page "/pdf-jsinterop"
@rendermode 인터랙티브Server
@using IronPdf
@inject IJSRuntime JSRuntime
@inject Microsoft.AspNetCore.Hosting.IWebHostEnvironment WebHostEnvironment
@implements IAsyncDisposable

<h3>IronPDF JavaScript Interop Viewer</h3>
<p>Displays PDF using JavaScript Blob/ObjectURL capabilities.</p>

@if (!string.IsNullOrEmpty(ErrorMessage))
{
    <div class="alert alert-danger">Error: @ErrorMessage</div>
}

<div id="@documentId" style="border: 1px solid #ccc; width: 100%; min-height: 600px;">
    Loading PDF...
</div>

@code {
    private string documentId = Guid.NewGuid().ToString();
    private string ErrorMessage = string.Empty;
    private bool pdfLoaded = false;
    private IJSObjectReference? jsModule;

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender && !pdfLoaded)
        {
            try
            {
                jsModule = await JSRuntime.InvokeAsync<IJSObjectReference>(
                    "import", "./pdfViewerInterop.js");
                await LoadPdfWithJavaScript();
                pdfLoaded = true;
            }
            catch (Exception ex)
            {
                ErrorMessage = $"Failed to load JS module: {ex.Message}";
            }
            finally
            {
                StateHasChanged();
            }
        }
    }

    private async Task LoadPdfWithJavaScript()
    {
        if (jsModule is null) return;
        var pdfPath = Path.Combine(WebHostEnvironment.WebRootPath, "sample.pdf");
        if (!File.Exists(pdfPath))
        {
            ErrorMessage = $"File not found: {pdfPath}";
            return;
        }
        var pdf = PdfDocument.FromFile(pdfPath);
        await jsModule.InvokeVoidAsync("displayPdf", documentId, pdf.BinaryData);
    }

    public async ValueTask DisposeAsync()
    {
        if (jsModule is not null)
            await jsModule.DisposeAsync();
    }
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Imports IronPdf
Imports Microsoft.AspNetCore.Components
Imports Microsoft.AspNetCore.Components.Web
Imports Microsoft.JSInterop

@page "/pdf-jsinterop"
@rendermode InteractiveServer
@inject IJSRuntime JSRuntime
@inject Microsoft.AspNetCore.Hosting.IWebHostEnvironment WebHostEnvironment
@implements IAsyncDisposable

<h3>IronPDF JavaScript Interop Viewer</h3>
<p>Displays PDF using JavaScript Blob/ObjectURL capabilities.</p>

@if Not String.IsNullOrEmpty(ErrorMessage) Then
    <div class="alert alert-danger">Error: @ErrorMessage</div>
End If

<div id="@documentId" style="border: 1px solid #ccc; width: 100%; min-height: 600px;">
    Loading PDF...
</div>

@code {
    Private documentId As String = Guid.NewGuid().ToString()
    Private ErrorMessage As String = String.Empty
    Private pdfLoaded As Boolean = False
    Private jsModule As IJSObjectReference

    Protected Overrides Async Function OnAfterRenderAsync(firstRender As Boolean) As Task
        If firstRender AndAlso Not pdfLoaded Then
            Try
                jsModule = Await JSRuntime.InvokeAsync(Of IJSObjectReference)(
                    "import", "./pdfViewerInterop.js")
                Await LoadPdfWithJavaScript()
                pdfLoaded = True
            Catch ex As Exception
                ErrorMessage = $"Failed to load JS module: {ex.Message}"
            Finally
                StateHasChanged()
            End Try
        End If
    End Function

    Private Async Function LoadPdfWithJavaScript() As Task
        If jsModule Is Nothing Then Return
        Dim pdfPath = Path.Combine(WebHostEnvironment.WebRootPath, "sample.pdf")
        If Not File.Exists(pdfPath) Then
            ErrorMessage = $"File not found: {pdfPath}"
            Return
        End If
        Dim pdf = PdfDocument.FromFile(pdfPath)
        Await jsModule.InvokeVoidAsync("displayPdf", documentId, pdf.BinaryData)
    End Function

    Public Async Function DisposeAsync() As ValueTask Implements IAsyncDisposable.DisposeAsync
        If jsModule IsNot Nothing Then
            Await jsModule.DisposeAsync()
        End If
    End Function
}
$vbLabelText   $csharpLabel

wwwroot/pdfViewerInterop.js 파일에 해당 JavaScript 함수를 추가하십시오. 이 파일은 JavaScript(아니라 C#)를 사용하여 .js 모듈로 저장됩니다:

export function displayPdf(elementId, data) {
    const blob = new Blob([new Uint8Array(data)], { type: 'application/pdf' });
    const url = URL.createObjectURL(blob);
    const container = document.getElementById(elementId);
    if (!container) return;
    container.innerHTML = '';
    const iframe = document.createElement('iframe');
    iframe.src = url;
    iframe.style.width = '100%';
    iframe.style.height = '600px';
    iframe.style.border = 'none';
    container.appendChild(iframe);
}
export function displayPdf(elementId, data) {
    const blob = new Blob([new Uint8Array(data)], { type: 'application/pdf' });
    const url = URL.createObjectURL(blob);
    const container = document.getElementById(elementId);
    if (!container) return;
    container.innerHTML = '';
    const iframe = document.createElement('iframe');
    iframe.src = url;
    iframe.style.width = '100%';
    iframe.style.height = '600px';
    iframe.style.border = 'none';
    container.appendChild(iframe);
}
The provided code is JavaScript, not C#. Therefore, it cannot be directly converted to VB.NET, as VB.NET is a server-side language and JavaScript is a client-side language. If you have C# code that you need converted to VB.NET, please provide that code for conversion.
$vbLabelText   $csharpLabel

이 JavaScript 함수는 PDF 데이터에서 블롭을 생성하고, 객체 URL을 생성하며, 컨테이너에 iframe을 추가합니다. 이 기술은 JavaScript 렌더링과 복잡한 문서에 대한 사용자 정의 렌더링 지연을 지원합니다.

출력

'PDF란?' 내용을 표시하는 PDF 문서와 함께 IronPDF JavaScript Interop 뷰어 인터페이스가 JavaScript Blob/ObjectURL PDF 렌더링 기능을 시연 중

다양한 소스에서 PDF를 어떻게 로드합니까?

Blazor PDF 뷰어는 다양한 소스에서 PDF 문서를 검색하고 표시할 수 있습니다. 아래 예는 URL에서 로딩하거나 HTML 콘텐츠에서 로딩하는 방법을 보여줍니다:

private async Task LoadFromUrl(string url)
{
    using var client = new HttpClient();
    client.Timeout = TimeSpan.FromSeconds(30);
    var response = await client.GetAsync(url);
    response.EnsureSuccessStatusCode();
    var stream = await response.Content.ReadAsStreamAsync();
    var pdfDocument = new PdfDocument(stream);
    await DisplayPdfContent(pdfDocument);
}

private async Task LoadFromHtmlContent()
{
    var renderer = new ChromePdfRenderer();
    var htmlContent = "<h1>Generated PDF</h1><p>Dynamic content from Blazor.</p>";
    var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
    await DisplayPdfContent(pdfDocument);
}

private Task DisplayPdfContent(PdfDocument document)
{
    var data = document.BinaryData;
    pdfUrl = $"data:application/pdf;base64,{Convert.ToBase64String(data)}";
    return Task.CompletedTask;
}
private async Task LoadFromUrl(string url)
{
    using var client = new HttpClient();
    client.Timeout = TimeSpan.FromSeconds(30);
    var response = await client.GetAsync(url);
    response.EnsureSuccessStatusCode();
    var stream = await response.Content.ReadAsStreamAsync();
    var pdfDocument = new PdfDocument(stream);
    await DisplayPdfContent(pdfDocument);
}

private async Task LoadFromHtmlContent()
{
    var renderer = new ChromePdfRenderer();
    var htmlContent = "<h1>Generated PDF</h1><p>Dynamic content from Blazor.</p>";
    var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
    await DisplayPdfContent(pdfDocument);
}

private Task DisplayPdfContent(PdfDocument document)
{
    var data = document.BinaryData;
    pdfUrl = $"data:application/pdf;base64,{Convert.ToBase64String(data)}";
    return Task.CompletedTask;
}
Imports System
Imports System.Net.Http
Imports System.Threading.Tasks

Private Async Function LoadFromUrl(url As String) As Task
    Using client As New HttpClient()
        client.Timeout = TimeSpan.FromSeconds(30)
        Dim response = Await client.GetAsync(url)
        response.EnsureSuccessStatusCode()
        Dim stream = Await response.Content.ReadAsStreamAsync()
        Dim pdfDocument As New PdfDocument(stream)
        Await DisplayPdfContent(pdfDocument)
    End Using
End Function

Private Async Function LoadFromHtmlContent() As Task
    Dim renderer As New ChromePdfRenderer()
    Dim htmlContent As String = "<h1>Generated PDF</h1><p>Dynamic content from Blazor.</p>"
    Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
    Await DisplayPdfContent(pdfDocument)
End Function

Private Function DisplayPdfContent(document As PdfDocument) As Task
    Dim data = document.BinaryData
    pdfUrl = $"data:application/pdf;base64,{Convert.ToBase64String(data)}"
    Return Task.CompletedTask
End Function
$vbLabelText   $csharpLabel

LoadFromUrl 메서드는 원격 위치에서 PDF 문서를 가져오고, LoadFromHtmlContentHTML을 PDF로 즉석에서 변환하는 방법을 보여줍니다. Chrome 렌더링 엔진은 정확한 HTML 변환을 보장합니다. 추가 소스 옵션은 Azure 블롭 스토리지, 데이터베이스 메모리 스트림DOCX 문서를 포함합니다.

어떤 소스 방법이 사용 사례에 적합한가요?

Blazor 애플리케이션을 위한 PDF 소스 방법
소스 유형 최적의 용도 성능 보안
로컬 파일 정적 콘텐츠 훌륭함 낮음
URL 외부 문서 좋은 중간
HTML 변환 동적 보고서 가변적 높음
블롭 스토리지 Enterprise 앱 훌륭함 높음
메모리 스트림 임시 PDF 훌륭함 높음

HTML 콘텐츠를 사용한 출력

IronPDF 테스트 인터페이스는 URL에서 로드하거나 HTML에서 생성하는 옵션이 상단에 표시된 HTML 콘텐츠로부터의 PDF 생성의 성공을 시연합니다.

PDF 뷰어에 인터랙티브 기능을 어떻게 추가하나요?

페이지 내비게이션, 회전, 인쇄 및 다운로드 기능으로 PDF 뷰어 확장:

@code {
    private int currentPage = 1;
    private int totalPages;
    private byte[] pdfData = Array.Empty<byte>();
    private string pdfUrl = "";
    private string rotationClass = "";
    private string documentId = Guid.NewGuid().ToString();

    private async Task NavigateToPage(int page)
    {
        currentPage = page;
        await JSRuntime.InvokeVoidAsync("navigateTo", page);
    }

    private void RotateCounterclockwise()
    {
        rotationClass = "rotate-270";
    }

    private async Task PrintPdf()
    {
        await JSRuntime.InvokeVoidAsync("printDocument", documentId);
    }

    private async Task DownloadPdf()
    {
        await JSRuntime.InvokeVoidAsync("downloadFile", pdfData, "document.pdf");
    }
}
@code {
    private int currentPage = 1;
    private int totalPages;
    private byte[] pdfData = Array.Empty<byte>();
    private string pdfUrl = "";
    private string rotationClass = "";
    private string documentId = Guid.NewGuid().ToString();

    private async Task NavigateToPage(int page)
    {
        currentPage = page;
        await JSRuntime.InvokeVoidAsync("navigateTo", page);
    }

    private void RotateCounterclockwise()
    {
        rotationClass = "rotate-270";
    }

    private async Task PrintPdf()
    {
        await JSRuntime.InvokeVoidAsync("printDocument", documentId);
    }

    private async Task DownloadPdf()
    {
        await JSRuntime.InvokeVoidAsync("downloadFile", pdfData, "document.pdf");
    }
}
Imports System

Public Class CodeBehind
    Private currentPage As Integer = 1
    Private totalPages As Integer
    Private pdfData As Byte() = Array.Empty(Of Byte)()
    Private pdfUrl As String = ""
    Private rotationClass As String = ""
    Private documentId As String = Guid.NewGuid().ToString()

    Private Async Function NavigateToPage(page As Integer) As Task
        currentPage = page
        Await JSRuntime.InvokeVoidAsync("navigateTo", page)
    End Function

    Private Sub RotateCounterclockwise()
        rotationClass = "rotate-270"
    End Sub

    Private Async Function PrintPdf() As Task
        Await JSRuntime.InvokeVoidAsync("printDocument", documentId)
    End Function

    Private Async Function DownloadPdf() As Task
        Await JSRuntime.InvokeVoidAsync("downloadFile", pdfData, "document.pdf")
    End Function
End Class
$vbLabelText   $csharpLabel

이 코드는 페이지 내비게이션, 회전, 인쇄, 다운로드 기능을 추가합니다. 네비게이션이 많은 문서에는 페이지 번호 및 책갈피 추가를 고려하세요. 고급 기능에는 텍스트 추출 및 PDF를 HTML로 변환하는 것 등이 포함될 수 있습니다.

출력

Blazor로 구축된 완전한 기능의 PDF 뷰어 컴포넌트, 문서 탐색 컨트롤과 100%로 설정된 확대 기능, PDF 파일 로드, 인쇄, 다운로드, 회전 옵션을 포함하는 사용자 정의 작업 버튼 표시

PDF 양식 및 주석은 어떻게 처리하나요?

양식 필드주석이 있는 PDF 문서에 대해 IronPDF는 필드 값을 프로그래밍 방식으로 읽고 쓰는 강력한 지원을 제공합니다:

private async Task ProcessFormFields()
{
    var pdfDocument = PdfDocument.FromFile("form.pdf");

    foreach (var field in pdfDocument.Form.Fields)
    {
        if (field.Type == PdfFormFieldType.Text)
        {
            field.Value = "User Input";
        }
    }

    await DisplayPdfContent(pdfDocument);
}

private async Task SaveFormData()
{
    var pdfWithFormData = PdfDocument.FromFile("filled-form.pdf");
    var formData = pdfWithFormData.Form.Fields
        .ToDictionary(f => f.Name, f => f.Value);

    var json = System.Text.Json.JsonSerializer.Serialize(formData);
    await File.WriteAllTextAsync("form-data.json", json);

    pdfWithFormData.Form.Flatten();
    pdfWithFormData.SaveAs("form-submission.pdf");
}
private async Task ProcessFormFields()
{
    var pdfDocument = PdfDocument.FromFile("form.pdf");

    foreach (var field in pdfDocument.Form.Fields)
    {
        if (field.Type == PdfFormFieldType.Text)
        {
            field.Value = "User Input";
        }
    }

    await DisplayPdfContent(pdfDocument);
}

private async Task SaveFormData()
{
    var pdfWithFormData = PdfDocument.FromFile("filled-form.pdf");
    var formData = pdfWithFormData.Form.Fields
        .ToDictionary(f => f.Name, f => f.Value);

    var json = System.Text.Json.JsonSerializer.Serialize(formData);
    await File.WriteAllTextAsync("form-data.json", json);

    pdfWithFormData.Form.Flatten();
    pdfWithFormData.SaveAs("form-submission.pdf");
}
Imports System.IO
Imports System.Threading.Tasks
Imports System.Text.Json

Private Async Function ProcessFormFields() As Task
    Dim pdfDocument = PdfDocument.FromFile("form.pdf")

    For Each field In pdfDocument.Form.Fields
        If field.Type = PdfFormFieldType.Text Then
            field.Value = "User Input"
        End If
    Next

    Await DisplayPdfContent(pdfDocument)
End Function

Private Async Function SaveFormData() As Task
    Dim pdfWithFormData = PdfDocument.FromFile("filled-form.pdf")
    Dim formData = pdfWithFormData.Form.Fields.ToDictionary(Function(f) f.Name, Function(f) f.Value)

    Dim json = JsonSerializer.Serialize(formData)
    Await File.WriteAllTextAsync("form-data.json", json)

    pdfWithFormData.Form.Flatten()
    pdfWithFormData.SaveAs("form-submission.pdf")
End Function
$vbLabelText   $csharpLabel

이는 Blazor PDF 뷰어 내에서 양식 채우기 기능을 가능하게 하며, 사용자가 브라우저에서 양식 필드와 직접 상호작용할 수 있도록 합니다. 코드는 양식 필드를 반복하여 프로그래밍 방식으로 값을 설정하며, 이는 동적 사전 채우기가 필요한 애플리케이션에 이상적입니다. IronPDF는 디지털 서명 및 텍스트 주석도 지원합니다.

지원되는 필드 유형에는 텍스트 입력, 체크박스, 라디오 버튼, 드롭다운 목록, 디지털 서명 필드, 여러 줄 텍스트 영역, 날짜 선택기가 포함됩니다.

언제 프로그래밍 대 인터랙티브 양식 채우기를 사용해야 하나요?

양식 채우기 접근 방식 비교
접근 방식 사용 시기 혜택
프로그래밍 방식 알려진 데이터 사전 충전 더 빠르고, 일관되며 자동화됨
인터랙티브 사용자 입력 필요 유연하고 즉각적인 검증
하이브리드 일부 데이터 사용 가능 두 가지 접근 방식의 장점

제출 후 변조를 방지하기 위해 양식을 평면화하는 것을 고려하세요. PDF 클렌징을 보안을 위해 사용하세요.

출력

사용자가 브라우저에서 직접 PDF 양식과 상호 작용할 수 있는 PDF 뷰어 컴포넌트의 양식 작성 기능 예제

큰 PDF의 성능을 어떻게 최적화하나요?

PDF를 표시할 때, 특히 큰 파일에 대해 좋은 성능을 보장하려면 조각화 로딩 및 메모리 관리를 사용하세요:

private async Task LoadLargePdf()
{
    const int chunkSize = 1024 * 1024; // 1MB chunks
    var pdfPath = "largefile.pdf";

    using var fileStream = File.OpenRead(pdfPath);
    var buffer = new byte[chunkSize];
    var chunks = new List<byte[]>();
    int bytesRead;

    while ((bytesRead = await fileStream.ReadAsync(buffer)) > 0)
    {
        var chunk = new byte[bytesRead];
        Array.Copy(buffer, chunk, bytesRead);
        chunks.Add(chunk);
    }

    await ProcessPdfChunks(chunks);
}
private async Task LoadLargePdf()
{
    const int chunkSize = 1024 * 1024; // 1MB chunks
    var pdfPath = "largefile.pdf";

    using var fileStream = File.OpenRead(pdfPath);
    var buffer = new byte[chunkSize];
    var chunks = new List<byte[]>();
    int bytesRead;

    while ((bytesRead = await fileStream.ReadAsync(buffer)) > 0)
    {
        var chunk = new byte[bytesRead];
        Array.Copy(buffer, chunk, bytesRead);
        chunks.Add(chunk);
    }

    await ProcessPdfChunks(chunks);
}
Imports System.IO
Imports System.Threading.Tasks

Private Async Function LoadLargePdf() As Task
    Const chunkSize As Integer = 1024 * 1024 ' 1MB chunks
    Dim pdfPath As String = "largefile.pdf"

    Using fileStream As FileStream = File.OpenRead(pdfPath)
        Dim buffer(chunkSize - 1) As Byte
        Dim chunks As New List(Of Byte())()
        Dim bytesRead As Integer

        Do
            bytesRead = Await fileStream.ReadAsync(buffer, 0, buffer.Length)
            If bytesRead > 0 Then
                Dim chunk(bytesRead - 1) As Byte
                Array.Copy(buffer, chunk, bytesRead)
                chunks.Add(chunk)
            End If
        Loop While bytesRead > 0
    End Using

    Await ProcessPdfChunks(chunks)
End Function
$vbLabelText   $csharpLabel

이 접근 방식은 큰 PDF 파일을 조각으로 로드하여 메모리 문제를 방지하고 성능이 뛰어난 문서에서도 매끄러운 성능을 보장합니다. 이는 특히 모바일 기기나 리소스가 제한적인 시스템에서 PDF 파일을 다룰 때 유용합니다. 추가 조정 옵션에 대한 자세한 내용은 IronPDF의 성능 가이드를 참조하세요.

추가 최적화 전략에는 빠른 웹 보기를 위한 선형화, 파일 크기를 줄이기 위한 압축, 여러 PDF를 동시에 처리하기 위한 비동기 처리가 포함됩니다. PDF Association의 모범 사례에 따르면, 선형화된(웹 최적화된) PDF는 큰 문서의 초기 로드 시간을 30--60% 줄일 수 있습니다.

어떤 파일 크기가 조각화 로딩을 필요로 합니까?

PDF 파일 크기 로딩 전략 가이드
파일 크기 로딩 전략 메모리 영향
5 MB 미만 직접 로딩 최소화
5 -- 20 MB 선택적 청킹 적당함
20 -- 50 MB 권장 청킹 상당한
50 MB 이상 필수 청킹 중요한

서버 측 렌더링은 100 MB 이상의 PDF를 처리하거나 복잡한 주석을 구현하거나 여러 동시 사용자를 지원할 때 유용해집니다.

암호로 보호된 파일을 위한 Blazor PDF 뷰어 보안을 어떻게 확보할 수 있습니까?

암호로 보호된 PDF 파일을 다룰 때, 암호를 PdfDocument.FromFile에 직접 전달하고 적절한 HTTP 보안 헤더를 구성하십시오.

private async Task LoadSecurePdf(string password)
{
    var pdfDocument = PdfDocument.FromFile("secure.pdf", password);

    var headers = new Dictionary<string, string>
    {
        { "X-Frame-Options", "SAMEORIGIN" },
        { "Content-보안-Policy", "default-src 'self'" },
        { "X-Content-Type-Options", "nosniff" },
        { "Referrer-Policy", "no-referrer" }
    };

    await DisplayPdfContent(pdfDocument);
}
private async Task LoadSecurePdf(string password)
{
    var pdfDocument = PdfDocument.FromFile("secure.pdf", password);

    var headers = new Dictionary<string, string>
    {
        { "X-Frame-Options", "SAMEORIGIN" },
        { "Content-보안-Policy", "default-src 'self'" },
        { "X-Content-Type-Options", "nosniff" },
        { "Referrer-Policy", "no-referrer" }
    };

    await DisplayPdfContent(pdfDocument);
}
Private Async Function LoadSecurePdf(password As String) As Task
    Dim pdfDocument = PdfDocument.FromFile("secure.pdf", password)

    Dim headers = New Dictionary(Of String, String) From {
        {"X-Frame-Options", "SAMEORIGIN"},
        {"Content-보안-Policy", "default-src 'self'"},
        {"X-Content-Type-Options", "nosniff"},
        {"Referrer-Policy", "no-referrer"}
    }

    Await DisplayPdfContent(pdfDocument)
End Function
$vbLabelText   $csharpLabel

이 코드는 적절한 헤더 구성을 통해 보안을 유지하면서 암호로 보호된 PDF 문서를 로드하는 방법을 보여줍니다. 개선된 인증을 위해 디지털 서명을 고려하십시오. PDF 클린징을 구현하여 잠재적으로 악의적인 콘텐츠를 제거하고 민감한 정보를 수정하십시오.

비밀번호를 처리할 때, 절대 평문이나 클라이언트 측 코드에 저장하지 마십시오. 적절한 유효성 검사로 보안 입력 방법을 사용하고, 민감한 문서의 세션 타임아웃을 구현하며, 사용 후 메모리에서 비밀번호를 지우십시오. Microsoft의 ASP.NET Core 보안 지침은 사용자 제공 자격 증명을 다운스트림 API에 전달하기 전에 항상 유효성 검사 및 클린징을 수행해야 한다고 권장합니다.

클라이언트 측 대 서버 측 복호화

PDF 복호화 접근 보안 비교
복호화 유형 사용 사례 보안 수준
클라이언트 측 공공 문서 낮음
서버 측 민감한 데이터 높음
하이브리드 혼합 콘텐츠 중간

최대 보안을 위해 항상 서버 측에서 복호화를 수행하고, 복호화된 콘텐츠를 클라이언트에 안전하게 스트리밍하십시오. PDF/A 준수를 구현하여 장기 보관 요구 사항을 충족하십시오.

Blazor에서 PDF를 표시하기 위한 주요 요점은 무엇입니까?

IronPDF를 사용하여 Blazor PDF 뷰어를 구현하면 개발자에게 웹 애플리케이션에서 PDF를 표시하기 위한 완전한 솔루션을 제공합니다. 기본 표시에서 양식 채우기 및 주석과 같은 고급 기능까지, IronPDF의 PDF 뷰어 구성 요소는 전문적인 애플리케이션에 필요한 기능을 제공합니다.

예시에서는 다양한 PDF 소스를 처리하고, 대화형 기능을 제공하며, 성능을 유지하는 신뢰할 수 있는 Blazor PDF 뷰어를 만드는 방법을 보여줍니다. 단순한 문서 뷰어를 구축하든 복잡한 문서 관리 시스템을 구축하든, IronPDF와 Blazor Server 앱과의 통합은 전문적인 PDF 뷰잉 기능을 구현하는 것을 간단하게 만듭니다.

주요 이점은 다음과 같습니다.

  • 일관된 렌더링을 제공하는 크로스 플랫폼 호환성
  • 민감한 문서를 위한 고급 보안 기능
  • 비동기 및 청크 로딩을 통한 큰 파일의 성능 최적화
  • 디지털 서명을 포함한 완전한 양식 처리 기능
  • 기존 .NET 애플리케이션과의 매끄러운 통합

IronPDF는 Azure, AWS, Docker, 및 전통적인 Windows 환경을 지원합니다. 자신만의 뷰어를 구축할 준비가 되었나요? IronPDF의 무료 체험판으로 시작하고, 완벽한 문서코드 예시를 참조하여 Blazor 애플리케이션에서 효과적인 PDF 뷰잉 경험을 만드십시오.

자주 묻는 질문

IronPDF를 사용하여 Blazor 애플리케이션에서 PDF를 표시하려면 어떻게 해야 하나요?

IronPDF는 Blazor 애플리케이션 내에서 PDF를 렌더링하고 표시할 수 있는 종합적인 API를 제공합니다. IronPDF를 통합하면 강력한 PDF 뷰어 컴포넌트를 쉽게 구현할 수 있습니다.

Blazor PDF 보기를 위해 IronPDF를 사용하는 것의 이점은 무엇인가요?

Blazor PDF 보기를 위해 IronPDF를 사용하면 폼 필드 처리, 인터랙티브 뷰어 생성, 애플리케이션 내에서 고품질 PDF를 원활하게 렌더링하는 등의 이점이 있습니다.

IronPDF를 사용하여 Blazor에서 PDF의 양식 필드를 처리할 수 있나요?

네, IronPDF는 Blazor 애플리케이션 내에서 PDF 문서의 양식 필드를 처리하고 조작할 수 있게 하여 향상된 상호작용과 사용자 참여를 제공합니다.

IronPDF를 사용하여 Blazor에서 상호작용 가능한 PDF 뷰어를 만들 수 있나요?

물론입니다. IronPDF는 Blazor에서 상호작용 가능한 PDF 뷰어를 만들기 위한 도구를 제공하여 양식 처리 및 동적 콘텐츠 표시와 같은 기능을 가능하게 합니다.

IronPDF는 Blazor에서 PDF 조작을 위해 어떤 기능을 제공하나요?

IronPDF는 PDF 렌더링, 양식 필드 처리, 텍스트 추출, 페이지 조작과 같은 기능을 제공하여 Blazor에서 PDF 작업에 유연한 선택지를 제공합니다.

IronPDF는 Blazor 애플리케이션에서 PDF 보기 경험을 어떻게 향상시키나요?

IronPDF는 Blazor 애플리케이션에서 매끄러운 렌더링, 상호작용 기능, 견고한 PDF 문서 처리를 제공하여 PDF 보기 경험을 향상시킵니다.

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

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

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

아이언 서포트 팀

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