跳至页脚内容
使用IRONPDF

如何在 C# 中动态生成 PDF

在 ASP.NET 面板控件中显示 PDF 文档是文档管理系统、报表查看器和发票显示的常见需求。 IronPDF 通过服务器端渲染解决了这个问题,消除了客户端依赖性,并且可以在所有浏览器和平台上一致地运行。

当您需要在 ASP.NET Core Web 应用程序中嵌入 PDF 时,依赖浏览器插件或客户端库的标准方法会造成脆弱性。 企业环境中的插件限制、浏览器行为不一致以及移动端支持不佳都会损害用户体验。 服务器端方案可以消除所有这些痛点。

IronPDF完全在服务器端处理 PDF 的生成和交付,因此浏览器会收到具有正确 MIME 类型的标准 PDF 字节流——无需插件,也无需针对特定浏览器的变通方法。

IronPDF C# PDF库首页横幅展示关键功能,包括HTML转PDF转换、PDF编辑功能、部署选项和免费试用优惠

ASP.NET 中的服务器端 PDF 渲染是如何工作的?

IronPDF通过无头Chrome引擎将PDF渲染完全转移到服务器。您的控制器生成或检索PDF文档,将其转换为字节数组,并通过inline Content-Disposition头流向浏览器。 浏览器的内置PDF查看器随后在您的面板中内嵌的<iframe>内显示文档。

这种根本性的转变消除了传统的痛点:

客户端计算机上无需安装 Adobe Reader 或浏览器扩展程序。

  • 无论用户使用何种操作系统或浏览器版本,都能保持一致的渲染效果
  • 对文档内容、布局和样式进行完全的程序化控制
  • 适用于IT策略阻止插件安装的企业环境。

该库的Chrome 渲染引擎可以从 HTML、URL 和原始内容源生成像素级完美的输出。 在 PDF 文件到达客户之前,您可以控制输出的各个方面——纸张尺寸、页边距、页眉、页脚和 CSS 媒体类型。

IronPDF 还支持在 Windows、Linux 和 macOS 服务器上进行跨平台部署,使其适用于在AzureAWS上运行的云托管 ASP.NET 应用程序,以及使用Docker的容器化环境。

IronPDF功能概述,展示四个主要类别:创建PDF、转换PDF、编辑PDF和签署与安全PDF,并在每个类别下列出详细功能

如何设置 NuGet 包?

打开 Visual Studio,在解决方案资源管理器中右键单击您的项目,然后选择"管理 NuGet 程序包" 。 搜索IronPdf并安装。 或者,在软件包管理器控制台中运行以下命令:

Install-Package IronPdf

您也可以使用带有dotnet add package IronPdf的.NET CLI。 安装后,在控制器或服务类的顶部添加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()
$vbLabelText   $csharpLabel

AddControllersWithViews()注册启用API端点和视图渲染——当您想通过专用控制器操作提供PDF内容并在Razor视图面板中显示它时,两者都是必需的。 有关完整的配置详情,请参阅IronPDF API 文档

如何在面板中直接显示 PDF 文件?

核心模式很简单:一个控制器操作生成PDF,将其转换为字节,设置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
$vbLabelText   $csharpLabel

ChromePdfRenderer类是服务器端渲染的主要入口。 它接受HTML内容,使用无头Chrome浏览器转换,并返回PdfDocument对象。 BinaryData属性公开原始字节以进行流传输。

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.
$vbLabelText   $csharpLabel

<iframe>从您的控制器端点请求PDF。 接下来,浏览器内置的 PDF 查看器会接管操作,以全面板宽度和高度显示文档,而无需任何客户端库或插件。

生成的 PDF 看起来像什么?

Web浏览器在ASP.NET应用程序中嵌入一个PDF查看器,并显示文档#12345以及生成时间戳

如何使用 AJAX 动态加载 PDF?

静态<iframe>源对于固定内容效果很好,但许多应用程序需要根据用户操作加载PDF——点击数据网格中的记录、提交表单或选择报告类型。 采用 AJAX 驱动的方式可以处理这些情况,而无需重新加载整个页面。

控制器操作接受请求正文,并将 PDF 文件以 base64 字符串的形式返回:

[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
$vbLabelText   $csharpLabel

在渲染之前,RenderingOptions块允许您配置纸张大小、边距和CSS媒体类型。 根据微软的 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;
    }
});
JAVASCRIPT

此模式适用于Razor Pages和MVC视图。对于高级用例,IronPDF还本机支持异步渲染,因此您可以直接使用Task.Run

如何处理不同类型的PDF源文件?

IronPDF 可以从三个主要来源生成 PDF:HTML 字符串、本地 HTML 文件和外部 URL。 每种方法都适用于不同的场景。

如何将HTML模板转换为PDF?

基于模板的生成是企业级 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
$vbLabelText   $csharpLabel

CssMediaType.Print确保PDF使用特定于打印的CSS规则,这通常会移除导航栏、侧栏和其他仅限屏幕的元素。 当您的 HTML 模板在网页视图和 PDF 生成之间共享时,这将产生更清晰的输出。 您还可以应用自定义水印或背景图片进行品牌宣传。 对于复杂的布局,分页符控制功能允许您精确指定新页面的起始位置。

HTML模板生成的PDF输出是什么样的?

PDF查看器显示带有水印的htmltopdf报告,显示日期2025-11-18和

如何从外部URL生成PDF?

对于捕获外部网页(例如竞争对手分析、监管文件或来自第三方服务的内容),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
$vbLabelText   $csharpLabel

ViewPortWidth设置决定了无头浏览器在转换为PDF之前渲染页面的宽度。 1920像素视口能够以桌面分辨率捕捉现代响应式布局。 渲染延迟可以让大量使用 JavaScript 的单页应用程序有时间在截屏之前完成初始化。

对于更高级的捕获场景,IronPDF 支持JavaScript 执行控制、已验证页面的cookie 传递以及视口缩放调整

如何管理内存和性能?

生成PDF资源密集型。每次调用PdfDocument对象在内存中持有渲染的字节。 妥善处置内存可以防止资源泄漏,并使内存消耗在负载下保持可预测性。

始终使用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
$vbLabelText   $csharpLabel

PdfDocument对象立即被释放。 对于频繁生成 PDF 文件的应用程序,请考虑以下附加策略:

-缓存:将经常请求的 PDF 存储在内存缓存或磁盘中。 使用IMemoryCache通过文档标识符和时间戳缓存字节数组。 -流式传输:对于非常大的文档,请使用PDF 内存流而不是字节数组,以避免分配大的连续内存块。 -线性化:启用线性化(快速网页视图)输出,以便浏览器可以在完整文件下载完成之前开始渲染。 -压缩:在网络连接受限的情况下提供文档时,应用PDF 压缩来减小文件大小。

IronPDF 性能指南涵盖了高通量场景下的其他优化策略。

优化后的PDF输出会产生什么效果?

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归档要求。

IronPDF跨平台支持图展示与.NET版本、操作系统、开发环境和编程语言(包括C#、F#、VB.NET、Java、Node.js和Python)的兼容性

下一步计划是什么?

您现在有一个在ASP.NET面板中显示PDF的工作模式:安装IronPDF,创建生成PDF并返回带有<iframe>。 通过 AJAX 模式,您可以根据用户操作动态加载文档,而无需重新加载页面。

立即开始IronPDF 的免费试用,在您自己的项目中测试这些模式——无需信用卡。 试用版包含所有功能的完整访问权限,包括 HTML 转 PDF 渲染、URL 捕获和高级 PDF 操作。

一旦基本显示功能实现正常,可以考虑以下这些自然的扩展功能:

-合并或拆分 PDF 文件,以用于文档组装工作流程

IronPDF 文档详细介绍了这些功能,并提供了完整的代码示例和配置参考。

常见问题解答

在 ASP.NET 面板中显示 PDF 的目的是什么?

在 ASP.NET 面板中显示 PDF 允许开发人员将 PDF 文档直接集成到网络应用程序中,为文档管理、报告查看或发票显示创建无缝的用户体验。

IronPDF 如何帮助在 ASP.NET 中显示 PDF?

IronPDF for .NET 提供的工具可使开发人员毫不费力地在 ASP.NET 面板中渲染和显示 PDF 文档,确保流畅的集成和一致的用户界面。

using IronPDF 在 ASP.NET 应用程序中显示 PDF 有哪些好处?

using IronPDF for .NET 可以轻松集成 PDF,减少开发时间,并通过在 UI 控件中提供高质量的 PDF 渲染增强 ASP.NET 应用程序的功能。

IronPDF 可用于在 ASP.NET 中构建文档管理系统吗?

是的,IronPDF 是构建文档管理系统的理想选择,因为它支持在 ASP.NET 面板中无缝显示 PDF,增强了直接在网络上管理和查看文档的能力。

IronPDF 是否与 ASP.NET Core 兼容,用于 PDF 显示?

IronPDF for .NET 与 ASP.NET Core 完全兼容,允许开发人员使用面板控件在网络应用程序中显示 PDF 文档,确保现代网络集成。

Curtis Chau
技术作家

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

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

钢铁支援团队

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