跳至頁尾內容
使用IRONPDF

如何在 C# 中動態生成 PDF

在ASP.NET面板控制項內顯示PDF文件是文件管理系統、報告檢視器和發票顯示的常見需求。 IronPDF通過伺服器端渲染解決了這個問題,消除了客戶端依賴,並在所有瀏覽器和平台上保持一致的運行。

當您需要將PDF嵌入ASP.NET Core網頁應用程式時,依賴瀏覽器插件或客戶端程式庫的標準方法會導致脆弱性。 企業環境中的插件限制、不一致的瀏覽器行為以及劣質的移動支援都削弱了使用者體驗。 伺服器端的方法消除了所有這些痛點。

IronPDF完全在伺服器上處理PDF生成和傳遞,因此瀏覽器接收到帶有正確MIME型別的標準PDF字節流——不需要插件,也不需要瀏覽器特定的解決方案。

IronPDF C# PDF程式庫首頁橫幅顯示關鍵功能,包括HTML到PDF轉換、PDF編輯功能、部署選項和免費試用優惠

伺服器端PDF渲染在ASP.NET中如何工作?

IronPDF使用Headless Chrome引擎將PDF渲染完全轉移到伺服器。您的控制器生成或獲取PDF文件,將其轉換為字節陣列,並使用inline Content-Disposition 標頭將其流式傳輸到瀏覽器。 瀏覽器的內建PDF檢視器然後會在您的面板中顯示文件。

這一基本轉變消除了傳統的痛點:

  • 客戶端機器上不需要Adobe Reader或瀏覽器擴展
  • 無論使用者的操作系統或瀏覽器版本如何,渲染效果一致
  • 完全程式化控制文件內容、佈局和樣式
  • 在IT政策阻止插件安裝的企業環境中工作

該程式庫的Chrome渲染引擎從HTML、URL和原始內容來源生成像素完美的輸出。 您可以完全控制輸出的各個方面——紙張大小、邊距、頁眉、頁腳和CSS媒體型別——在PDF到達客戶端之前。

IronPDF還支援Windows、Linux和macOS伺服器的跨平台部署,使其適用於在AzureAWS上運行的雲端托管的ASP.NET應用程式,以及使用Docker的容器化環境。

IronPDF功能概覽顯示四個主要類別:建立PDF、轉換PDF、編輯PDF以及簽署和保護PDF,並在每個類別下列出詳細功能

如何設置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()
$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內容,使用Headless 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看起來如何?

網頁瀏覽器顯示嵌入在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媒體型別。 根據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;
    }
});
JAVASCRIPT

這種模式對Razor頁面和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生成是資源密集的。每次調用ChromePdfRenderer都會建立一個Headless Chrome進程,而每個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文件檢視器顯示日期2025-11-18和使用者'Test'的'Improve Report'報告,顯示在100%的縮放級別,帶有Iron Software水印

如何確保安全和跨瀏覽器相容性?

在將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顯示。 若您的面板嵌入來自不同起源的PDF,W3C內容安全政策規範提供了有關框架祖先指令的指導。 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操作。

一旦您完成了基本的顯示工作,考慮這些自然擴充:

IronPDF文件深入介紹了這些功能中的每一項,並帶有完整的程式碼範例和配置參考。

常見問題

在ASP.NET面板中顯示PDF的目的為何?

在ASP.NET面板中顯示PDF允許開發者直接將PDF文件整合到網頁應用中,為文件管理、報告查看或發票顯示創造無縫的使用者體驗。

IronPDF如何幫助在ASP.NET中顯示PDF?

IronPDF提供工具,使開發者能夠輕鬆地在ASP.NET面板中渲染並顯示PDF文件,確保順暢的整合和一致的使用者介面。

使用IronPDF在ASP.NET應用中顯示PDF有何好處?

使用IronPDF可實現簡易的PDF整合,減少開發時間,並通過在UI控制中提供高質量的PDF渲染來增強ASP.NET應用的功能。

IronPDF可以用於構建ASP.NET的文件管理系統嗎?

可以,IronPDF非常適合構建文件管理系統,因為它支持在ASP.NET面板中無縫地顯示PDF,增強了直接在線上管理和查看文件的能力。

IronPDF是否與ASP.NET Core相容以顯示PDF?

IronPDF完美相容ASP.NET Core,允許開發者使用面板控制在網頁應用程式中顯示PDF文件,確保現代化的網頁整合。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話