如何使用 IronPDF 在 ASP.NET 面板中顯示 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 文檔,將其轉換為位元組數組,並透過 Content-Disposition 標頭將其串流傳輸到瀏覽器。 然後,瀏覽器內建的 PDF 檢視器會將文件顯示在嵌入面板中的 <iframe> 元素內。
這種根本性的轉變消除了傳統的痛點:
用戶端電腦上無需安裝 Adobe Reader 或瀏覽器擴充功能。
- 無論使用者使用何種作業系統或瀏覽器版本,都能保持一致的渲染效果
- 對文件內容、版面配置和樣式進行完全的程式化控制
- 適用於IT策略阻止外掛程式安裝的企業環境。
該函式庫的Chrome 渲染引擎可以從 HTML、URL 和原始內容來源產生像素級完美的輸出。 在 PDF 文件到達客戶之前,您可以控制輸出的各個方面——紙張尺寸、頁邊距、頁首、頁尾和 CSS 媒體類型。
IronPDF 還支援在 Windows、Linux 和 macOS 伺服器上進行跨平台部署,使其適用於在Azure或AWS上運行的雲端託管 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()
AddControllersWithViews() 註冊啟用 API 端點和視圖渲染—當您想要透過專用控制器操作提供 PDF 內容並將其顯示在 Razor 視圖面板中時,兩者都是必需的。 有關完整的配置詳情,請參閱IronPDF API 文件。
如何在面板中直接顯示 PDF 檔案?
核心模式很簡單:控制器操作產生 PDF,將其轉換為字節,將 Content-Disposition 標頭設定為 inline,並傳回 File 結果。 Razor 視圖中的 <iframe> 指向該端點。
以下是一個完整的控制器實作:
[ApiController]
[Route("api/[controller]")]
public class PdfPanelController : ControllerBase
{
[HttpGet("display/{documentId}")]
public IActionResult DisplayPdfInPanel(string documentId)
{
var renderer = new ChromePdfRenderer();
string filename = $"document_{documentId}.pdf";
var htmlContent = $@"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; margin: 40px; }}
h1 {{ color: #333; }}
.content {{ line-height: 1.6; }}
</style>
</head>
<body>
<h1>Document #{documentId}</h1>
<div class='content'>
<p>This PDF is generated dynamically and displayed inline in your panel.</p>
<p>Generated at: {DateTime.Now:yyyy-MM-dd HH:mm:ss}</p>
</div>
</body>
</html>";
using var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
byte[] pdfBytes = pdfDocument.BinaryData;
Response.Headers.Append("Content-Disposition", $"inline; filename={filename}");
return File(pdfBytes, "application/pdf");
}
}
[ApiController]
[Route("api/[controller]")]
public class PdfPanelController : ControllerBase
{
[HttpGet("display/{documentId}")]
public IActionResult DisplayPdfInPanel(string documentId)
{
var renderer = new ChromePdfRenderer();
string filename = $"document_{documentId}.pdf";
var htmlContent = $@"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; margin: 40px; }}
h1 {{ color: #333; }}
.content {{ line-height: 1.6; }}
</style>
</head>
<body>
<h1>Document #{documentId}</h1>
<div class='content'>
<p>This PDF is generated dynamically and displayed inline in your panel.</p>
<p>Generated at: {DateTime.Now:yyyy-MM-dd HH:mm:ss}</p>
</div>
</body>
</html>";
using var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
byte[] pdfBytes = pdfDocument.BinaryData;
Response.Headers.Append("Content-Disposition", $"inline; filename={filename}");
return File(pdfBytes, "application/pdf");
}
}
Imports Microsoft.AspNetCore.Mvc
Imports System
<ApiController>
<Route("api/[controller]")>
Public Class PdfPanelController
Inherits ControllerBase
<HttpGet("display/{documentId}")>
Public Function DisplayPdfInPanel(documentId As String) As IActionResult
Dim renderer = New ChromePdfRenderer()
Dim filename As String = $"document_{documentId}.pdf"
Dim htmlContent As String = $"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; margin: 40px; }}
h1 {{ color: #333; }}
.content {{ line-height: 1.6; }}
</style>
</head>
<body>
<h1>Document #{documentId}</h1>
<div class='content'>
<p>This PDF is generated dynamically and displayed inline in your panel.</p>
<p>Generated at: {DateTime.Now:yyyy-MM-dd HH:mm:ss}</p>
</div>
</body>
</html>"
Using pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
Dim pdfBytes As Byte() = pdfDocument.BinaryData
Response.Headers.Append("Content-Disposition", $"inline; filename={filename}")
Return File(pdfBytes, "application/pdf")
End Using
End Function
End Class
ChromePdfRenderer 類別是伺服器端渲染的主要入口點。 它接受 HTML 內容,使用無頭 Chrome 瀏覽器進行轉換,並傳回一個 PdfDocument 物件。 BinaryData 屬性公開用於串流的原始位元組。
將 Content-Disposition 設定為 inline 是面板顯示的關鍵步驟。 如果沒有它,瀏覽器會提示下載,而不是在 <iframe> 中渲染。 您也可以透過 RenderingOptions 為每個頁面新增頁首和頁腳,或控制頁面方向和自訂邊距。
若要將此端點嵌入 Razor 面板中,請建立一個指向控制器路由的 <iframe>:
@page
@model IndexModel
<div class="container mt-4">
<div class="card">
<div class="card-header">
<h3>PDF Display Panel</h3>
</div>
<div class="card-body">
<div class="pdf-panel" style="height: 600px;">
<iframe src="/api/PdfPanel/display/12345"
width="100%"
height="100%"
frameborder="0">
</iframe>
</div>
</div>
</div>
</div>
@page
@model IndexModel
<div class="container mt-4">
<div class="card">
<div class="card-header">
<h3>PDF Display Panel</h3>
</div>
<div class="card-body">
<div class="pdf-panel" style="height: 600px;">
<iframe src="/api/PdfPanel/display/12345"
width="100%"
height="100%"
frameborder="0">
</iframe>
</div>
</div>
</div>
</div>
The provided code is a Razor page markup, which is not directly translatable to VB.NET as it is not C# code. Razor pages are used in ASP.NET Core for creating dynamic web pages and are written in a combination of HTML and C#.
If you need to convert the C# logic within a Razor page to VB.NET, you would typically focus on the code-behind file or any C# code embedded within the Razor markup. However, the provided snippet contains only HTML and Razor directives without any C# logic to convert.
If you have a specific C# code-behind logic or embedded C# code within a Razor page that you need to convert to VB.NET, please provide that portion, and I can assist with the conversion.
<iframe> 要求從您的控制器端點取得 PDF。 接下來,瀏覽器內建的 PDF 檢視器會接管操作,以全面板寬度和高度顯示文檔,而無需任何用戶端程式庫或插件。
生成的 PDF 是什麼樣子?
如何使用 AJAX 動態載入 PDF?
靜態 <iframe> 來源對於固定內容效果很好,但許多應用程式需要根據使用者操作載入 PDF,例如點擊資料格中的記錄、提交表單或選擇報表類型。 採用 AJAX 驅動的方式可以處理這些情況,而無需重新載入整個頁面。
控制器操作接受請求正文,並將 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
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;
}
});
這種模式對Razor Pages和 MVC 視圖都適用。對於進階用例,IronPDF 也原生支援非同步渲染,因此您可以直接使用 RenderHtmlAsPdfAsync 而不是 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
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
ViewPortWidth 設定決定了無頭瀏覽器在轉換為 PDF 之前渲染頁面的寬度。 1920像素視窗能夠以桌面解析度捕捉現代響應式佈局。 渲染延遲可以讓大量使用 JavaScript 的單頁應用程式有時間在截圖之前完成初始化。
對於更進階的擷取場景,IronPDF 支援JavaScript 執行控制、已驗證頁面的cookie 傳遞以及視窗縮放調整。
如何管理記憶體和效能?
PDF 產生需要消耗大量資源。每次呼叫 ChromePdfRenderer 都會建立一個無頭 Chrome 進程,每個 PdfDocument 物件都會將渲染後的位元組保存在記憶體中。 妥善處置記憶體可以防止資源洩漏,並使記憶體消耗在負載下保持可預測性。
總是將 using 語句與 PdfDocument 語句一起使用:
public IActionResult OptimizedPdfGeneration()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = false;
var processedHtml = GetHtmlTemplate("report")
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd"))
.Replace("{{USER}}", "Test")
.Replace("{{REPORT_TYPE}}", "Report");
using var pdf = renderer.RenderHtmlAsPdf(processedHtml);
byte[] pdfBytes = pdf.BinaryData;
pdf.SaveAs("output.pdf");
return File(pdfBytes, "application/pdf");
}
public IActionResult OptimizedPdfGeneration()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = false;
var processedHtml = GetHtmlTemplate("report")
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd"))
.Replace("{{USER}}", "Test")
.Replace("{{REPORT_TYPE}}", "Report");
using var pdf = renderer.RenderHtmlAsPdf(processedHtml);
byte[] pdfBytes = pdf.BinaryData;
pdf.SaveAs("output.pdf");
return File(pdfBytes, "application/pdf");
}
Imports System
Imports Microsoft.AspNetCore.Mvc
Public Class PdfController
Inherits Controller
Public Function OptimizedPdfGeneration() As IActionResult
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.CreatePdfFormsFromHtml = False
Dim processedHtml = GetHtmlTemplate("report") _
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd")) _
.Replace("{{USER}}", "Test") _
.Replace("{{REPORT_TYPE}}", "Report")
Using pdf = renderer.RenderHtmlAsPdf(processedHtml)
Dim pdfBytes As Byte() = pdf.BinaryData
pdf.SaveAs("output.pdf")
Return File(pdfBytes, "application/pdf")
End Using
End Function
Private Function GetHtmlTemplate(templateName As String) As String
' Placeholder for the actual implementation
Return String.Empty
End Function
End Class
using 語句確保在提取位元組數組後立即釋放 PdfDocument 對象,即使下游發生異常。 對於頻繁生成 PDF 文件的應用程序,請考慮以下附加策略:
-快取:將經常請求的 PDF 儲存在記憶體快取或磁碟中。 使用 IMemoryCache 快取以文件識別碼和時間戳為鍵的位元組數組。
-串流:對於非常大的文檔,請使用PDF 記憶體流而不是位元組數組,以避免分配大的連續記憶體區塊。
-線性化:啟用線性化(快速網頁視圖)輸出,以便瀏覽器可以在完整文件下載完成之前開始渲染。
-壓縮:在網路連線受限的情況下提供文件時,套用PDF 壓縮來減少檔案大小。
IronPDF 效能指南涵蓋了高通量場景下的其他最佳化策略。
優化後的PDF輸出會產生什麼效果?
! PDF 文件檢視器顯示一份"改進報告",日期為 2025-11-18,使用者為"Test",以 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 顯示。 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 並使用 Content-Disposition: inline 傳回它,並將該終點嵌入到 Razor 面板中的 <iframe> 中。 透過 AJAX 模式,您可以根據使用者操作動態載入文檔,而無需重新載入頁面。
立即開始IronPDF 的免費試用,在您自己的專案中測試這些模式—無需信用卡。 試用版包含所有功能的完整存取權限,包括 HTML 轉 PDF 渲染、URL 擷取和進階 PDF 操作。
一旦基本顯示功能實現正常,可以考慮以下自然的擴充功能:
-合併或分割 PDF 文件,以用於文件組裝工作流程
- 從 HTML 表單建立可填寫的 PDF 表單 -新增數位簽章以進行文件認證 -編輯現有 PDF 文件,新增印章、註釋或編輯內容 -將 HTML 轉換為 PDF ,並完全支援 CSS 和 JavaScript,以實現複雜的報表佈局。
IronPDF 文件詳細介紹了這些功能,並提供了完整的程式碼範例和配置參考。
常見問題解答
在 ASP.NET 面板中顯示 PDF 的目的是什麼?
在 ASP.NET 面板中顯示 PDF,可讓開發人員直接將 PDF 文件整合到 Web 應用程式中,為文件管理、報表檢視或發票顯示創造無縫的使用者體驗。
IronPDF 如何幫助在 ASP.NET 中顯示 PDF?
IronPDF for .NET 提供的工具可讓開發人員毫不費力地在 ASP.NET 面板中呈現和顯示 PDF 文件,確保順暢的整合和一致的使用者介面。
使用 IronPDF 在 ASP.NET 應用程式中顯示 PDF 有什麼好處?
使用 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 文件,確保現代化的網頁整合。



