跳至页脚内容
使用IRONPDF

如何在Blazor中使用IronPDF显示PDF

要在 Blazor 应用程序中显示 PDF,请使用 IronPDF 的 PDF 查看器组件,该组件与 Blazor Server 应用程序集成,并提供高性能的 PDF 渲染,具有表单填写、注释和移动支持等功能——所有这些都无需依赖第三方浏览器工具。

为什么 Blazor 应用程序需要专用的 PDF 查看器?

在现代 Web 应用程序中显示 PDF 需要一个可靠的查看器组件,该组件的功能超越了浏览器的基本功能。 对于构建 Blazor 应用程序的 .NET 开发人员来说, IronPDF提供了一个有效的 PDF 查看器解决方案,该方案可与您的Blazor Server 应用程序集成。 这样一来,无需依赖第三方浏览器工具,即可实现高性能的 PDF 渲染和丰富的功能。

不同浏览器和平台对原生浏览器 PDF 的支持程度差异很大,导致用户体验不一致。 通过在 Blazor 应用程序中实现自定义 PDF 查看器,您可以完全控制查看体验,确保在所有平台上实现一致的功能。 对于需要符合合规标准和高级安全功能的应用来说,这一点尤为重要。

Blazor 框架——基于微软的 ASP.NET Core构建——支持基于组件的开发,可以与 PDF 操作库自然地结合使用。 与其从外部 CDN 嵌入第三方查看器小部件,不如构建一个根据应用程序的具体需求量身定制的组件。

如何在 Blazor 项目中安装 IronPDF?

在部署 Blazor PDF 查看器之前,请先安装 IronPDF。 通过 NuGet,使用程序包管理器控制台或 .NET CLI 将其添加到 Blazor Server 应用程序中:

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 开发人员需要考虑 Intel 芯片与 Apple Silicon 芯片的兼容性。

PDF文件应该存储在哪里?

PDF文件的存储位置会对应用程序的性能和安全性产生重大影响。 对于 Blazor 应用程序,请考虑以下选项:

  • wwwroot 文件夹:非常适合存放不含敏感信息的静态 PDF 文件。
  • Azure Blob 存储:适用于需要灵活存储的云应用程序 -数据库以字节数组形式存储:适用于需要访问控制的小型 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
End Code
$vbLabelText   $csharpLabel

这段代码创建了一个 PDF 查看器组件,该组件加载 PDF 文档并使用 iframe 显示它。 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 互操作来改善 PDF 显示效果?

为了更好地控制 PDF 内容的显示,请使用 JavaScript 互操作来处理 PDF 查看器功能。 这种模式异步加载 JavaScript 模块,并将渲染委托给浏览器的原生 blob/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.JSInterop
Imports Microsoft.AspNetCore.Hosting

@page "/pdf-jsinterop"
@rendermode InteractiveServer
@inject IJSRuntime JSRuntime
@inject 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

将相应的 JavaScript 函数添加到您的 wwwroot/pdfViewerInterop.js 文件中。请注意,此文件使用 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 数据创建一个 blob,生成一个对象 URL,并将一个 iframe 附加到容器中。 该技术支持JavaScript 渲染和复杂文档的自定义渲染延迟。

输出

IronPDF JavaScript 互操作查看器界面显示了一个 PDF 文档,其中包含"什么是 PDF?"的内容,演示了 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 文档,而 LoadFromHtmlContent 则展示了如何即时将 HTML 转换为 PDF 。 Chrome渲染引擎可确保HTML转换的准确性。 其他源选项包括 Azure Blob 存储、数据库内存流DOCX 文档

哪种数据源方法最适合您的使用场景?

Blazor 应用程序的 PDF 源方法
来源类型 最适合 表现 安全
本地文件 静态内容 出色的 低的
网址 外部文件 好的 中等的
HTML转换 动态报表 多变的 高的
Blob 存储 企业应用 出色的 高的
内存流 临时PDF 出色的 高的

使用HTML内容输出

IronPDF 测试界面演示了如何成功地从 HTML 内容生成 PDF,顶部显示了从 URL 加载或从 HTML 生成的选项。

如何为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。

输出

这是一个功能齐全的 PDF 查看器组件,采用 Blazor 构建,显示文档导航控件、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 协会的最佳实践,线性化(网络优化)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);
}
Imports System.Collections.Generic
Imports System.Threading.Tasks

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

    Dim headers As 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文件进行清理,以删除潜在的恶意内容并编辑敏感信息。

处理密码时,切勿以明文或客户端代码形式存储。 使用安全的输入法并进行适当的验证,对敏感文档实施会话超时,并在使用后清除内存中的密码。 微软的ASP.NET Core 安全指南建议,在将用户提供的凭据传递给下游 API 之前,始终对其进行验证和清理。

客户端解密与服务器端解密

PDF解密方法安全性比较
解密类型 用例 安全级别
客户端 公开文件 低的
服务器端 敏感数据 高的
杂交种 混合内容 中等的

为了最大限度提高安全性,始终在服务器端执行解密,并将解密后的内容安全地传输到客户端。 为满足长期存档需求,实施PDF/A 合规性

在 Blazor 中显示 PDF 的关键要点是什么?

使用 IronPDF 实现 Blazor PDF 查看器,可以为开发人员提供在 Web 应用程序中显示 PDF 的完整解决方案。 从基本显示到表单填写和注释等高级功能,IronPDF 的PDF 查看器组件提供了专业应用程序所需的功能。

所示示例演示了如何创建一个可靠的 Blazor PDF 查看器,该查看器可以处理各种 PDF 源,提供交互式功能,并保持良好的性能。 无论是构建简单的文档查看器还是复杂的文档管理系统,IronPDF 与Blazor Server 应用程序的集成都使得实现专业的 PDF 查看功能变得简单易行。

主要优势包括:

-跨平台兼容性,在所有浏览器上都能保持一致的渲染效果

  • 针对敏感文件的高级安全功能
  • 通过异步和分块加载优化大文件的性能 -具备完整的表单处理功能,包括数字签名
  • 与现有 .NET 应用程序无缝集成

IronPDF 支持 Azure、AWS、Docker 和传统 Windows 环境。 准备好构建自己的查看器了吗? 首先,您可以免费试用 IronPDF ,并查阅完整的文档代码示例,以便在 Blazor 应用程序中创建有效的 PDF 查看体验。

常见问题解答

如何在Blazor应用中使用IronPDF显示PDF?

IronPDF提供全面的API,允许在Blazor应用中渲染和显示PDF。通过集成IronPDF,您可以轻松实现一个强大的PDF查看组件。

使用IronPDF进行Blazor PDF查看有哪些优势?

使用IronPDF进行Blazor PDF查看带来诸如处理表单字段、创建互动查看器以及在您的应用程序中无缝渲染高质量PDF等好处。

在Blazor中使用IronPDF处理PDF中的表单字段是否可能?

是的,IronPDF允许您在Blazor应用中处理和操作PDF文档中的表单字段,提供增强的互动性和用户参与度。

IronPDF是否可用于创建Blazor中的互动PDF查看器?

绝对可以。IronPDF提供工具在Blazor中创建互动PDF查看器,启用诸如表单处理和动态内容显示的功能。

IronPDF为Blazor中的PDF操作提供了哪些功能?

IronPDF提供PDF渲染、表单字段处理、文本提取和页面操作等功能,使其成为Blazor PDF操作的一个多功能选择。

在 C# 中比较两个 PDF 文件(开发者指南)提供了使用 IronPDF 高效比较 PDF 文档的指南,涵盖其必要性、设置 IronPDF 库、读取和解析PDF、执行比较及最佳实践。

IronPDF通过提供流畅的渲染、互动功能和稳健的PDF文档处理来提升Blazor应用中的PDF查看体验。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我