使用 C# 和 IronPDF 在 .NET Core 中進行 HTML轉PDF
在現代.NET應用程式中,直接從 HTML 產生高保真 PDF 是一項常規要求——報告、發票和工單都需要像素級完美的輸出,以匹配 Web UI。 IronPDF透過公開 C# API 來簡化此工作流程,該 API 可將 HTML、 Razor視圖和完整的網站渲染成符合標準的 PDF 文件。 看完本指南後,開發人員將能夠轉換ASP.NET Core專案中的 URL、原始 HTML 或 MVC 視圖,並將相同的程式碼部署到 Windows、Linux、Docker 或無伺服器環境中。
快速入門:在.NET Core中從 HTML 建立 PDF
使用IronPDF庫,在.NET Core中輕鬆將 HTML 轉換為 PDF。 本指南提供了一個簡單的範例,幫助您快速入門,只需編寫最少的程式碼即可將 HTML 內容渲染成高品質的 PDF。 非常適合希望輕鬆將 PDF 創建功能整合到應用程式中的開發人員。
最簡工作流程(5個步驟)
- 安裝`IronPdf` NuGet套件
- 使用`RenderUrlAsPdf`轉換網站 URL
- 透過`RenderHtmlAsPdf`渲染原始 HTML
- 將 MVC 視圖匯出為 PDF
- 調整紙張尺寸、頁邊距、頁首和頁尾
快速入門清單
1.安裝– Install-Package IronPdf
2.渲染 URL – ChromePdfRenderer.RenderUrlAsPdf()
3.渲染原始 HTML – ChromePdfRenderer.RenderHtmlAsPdf()
4.導出Razor視圖– ChromePdfRenderer.RenderHtmlAsPdfAsync()
5.微調輸出– 利用 ChromePdfRenderer.RenderingOptions
本教學涵蓋的內容
- URL、HTML 字串和Razor視圖轉換
紙張、頁邊距和媒體類型配置 - 跨平台部署(Windows、Linux、Docker)
- 後製:合併、新增浮水印、密碼保護和數位簽章 PDF 文件
- 端到端範例:票務預訂 MVC 應用
如何在.NET Core安裝PDF庫?
在任何.NET 8 專案中,安裝程式庫只需一行命令,並且與.NET 9 預覽版和即將發布的.NET 10 版本保持向前相容。 使用 NuGet 的套件管理器控制台,套件管理器將自動解析 Windows、Linux、Docker 和無伺服器目標的所有相依性。
PM> Install-Package IronPdf # .NET 8 LTS and higher
PM> Install-Package IronPdf # .NET 8 LTS and higher
需要命令列介面 (CLI) 嗎?同樣的指令也適用於專案資料夾內的 dotnet add package IronPdf。
安裝完成後,透過轉換任意公用 URL 來確認所有連線均已正確配置:
// Program.cs — .NET 8 LTS
using IronPdf;
var renderer = new ChromePdfRenderer();
// Render a live website to PDF
using PdfDocument pdf = renderer.RenderUrlAsPdf("https://example.com");
// Persist to disk
pdf.SaveAs("website-snapshot.pdf");
// Program.cs — .NET 8 LTS
using IronPdf;
var renderer = new ChromePdfRenderer();
// Render a live website to PDF
using PdfDocument pdf = renderer.RenderUrlAsPdf("https://example.com");
// Persist to disk
pdf.SaveAs("website-snapshot.pdf");
' Program.cs — .NET 8 LTS
Imports IronPdf
Private renderer = New ChromePdfRenderer()
' Render a live website to PDF
Private PdfDocument As using
' Persist to disk
pdf.SaveAs("website-snapshot.pdf")
工作原理
ChromePdfRenderer在底層啟動一個沙盒化的 Chromium 實例-無需單獨安裝 Chrome。RenderUrlAsPdf捕捉完全渲染的 DOM,包括 JavaScript 驅動的內容、CSS 媒體查詢和字型。- 產生的
PdfDocument提供了用於合併、密碼保護或對輸出進行數位簽章的輔助方法—這些功能將在本教學的後面部分介紹。
有關部署細節(Azure 應用程式服務、AWS Lambda、本地 Linux)的更多詳細信息,請參閱專用安裝指南和高級NuGet設定頁面。 Docker 部署最佳實務中涵蓋了 Docker 和 K8s 叢集的內部 CI/CD 技巧。
.NET Core服務如何將即時網站 URL 轉換為 PDF?
只需呼叫一次 RenderUrlAsPdf 即可:傳遞任何可公開存取的 URL, IronPDF即可返回完全渲染的、符合標準的 PDF。 以下程式碼針對.NET 8 LTS,並且在.NET 9 預覽版以及即將於 2025 年發布的.NET 10 版本上編譯保持不變。
逐步範例
// Program.cs — .NET 8 LTS-compatible
using IronPdf;
// 1. Activate a license (or trial key)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// 2. Create a reusable renderer instance
var renderer = new ChromePdfRenderer
{
RenderingOptions =
{
// Force A4 portrait output and apply @media print styles
PaperSize = PdfPaperSize.A4,
CssMediaType = PdfCssMediaType.Print
}
};
// 3. Convert Microsoft Docs home page to PDF
using PdfDocument pdf = renderer.RenderUrlAsPdf("https://learn.microsoft.com/");
// 4. Save the PDF or stream it from a Web API
pdf.SaveAs("docs-offline-copy.pdf");
// Program.cs — .NET 8 LTS-compatible
using IronPdf;
// 1. Activate a license (or trial key)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// 2. Create a reusable renderer instance
var renderer = new ChromePdfRenderer
{
RenderingOptions =
{
// Force A4 portrait output and apply @media print styles
PaperSize = PdfPaperSize.A4,
CssMediaType = PdfCssMediaType.Print
}
};
// 3. Convert Microsoft Docs home page to PDF
using PdfDocument pdf = renderer.RenderUrlAsPdf("https://learn.microsoft.com/");
// 4. Save the PDF or stream it from a Web API
pdf.SaveAs("docs-offline-copy.pdf");
' Program.cs — .NET 8 LTS-compatible
Imports IronPdf
' 1. Activate a license (or trial key)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
' 2. Create a reusable renderer instance
Dim renderer = New ChromePdfRenderer With {
.RenderingOptions = {
PaperSize = PdfPaperSize.A4,
CssMediaType = PdfCssMediaType.Print
}
}
' 3. Convert Microsoft Docs home page to PDF
Using pdf As PdfDocument = renderer.RenderUrlAsPdf("https://learn.microsoft.com/")
' 4. Save the PDF or stream it from a Web API
pdf.SaveAs("docs-offline-copy.pdf")
End Using
為什麼有效
ChromePdfRenderer啟動一個沙盒化的 Chromium 實例-沒有系統 Chrome 依賴,保持 Docker 映像精簡。RenderUrlAsPdf等待 DOM 和JavaScript完成後再進行快照,以便單頁應用程式能夠正確渲染。- 將
CssMediaType設定為Print會告訴引擎使用特定於列印的規則,以符合瀏覽器的 Print → Save as PDF 輸出。 - 產生的
PdfDocument可以加密、數位簽章、合併或柵格化-這些功能將在後面的章節中介紹。
renderer.LoggingOptions.DebugMode = true 並按照無頭 Chrome 調試指南操作,以在渲染期間檢查即時開發者工具。 相關資源
- API 參考 –
ChromePdfRenderer.RenderUrlAsPdf - API 參考 –
PdfDocument.SaveAs - 教學 –在 Docker 容器中部署IronPDF
如何在.NET Core中將原始HTML轉換為PDF?
將 HTML 字串(或Razor視圖的渲染標記)傳遞給 ChromePdfRenderer.RenderHtmlAsPdf 即可立即產生符合標準的 PDF。 此方法會啟動 IronPDF 內建的 Chromium 引擎,因此無需安裝外部瀏覽器或依賴 WebView。 下面所示的相同程式碼目前可以在.NET 8 LTS 上編譯,並且與.NET 9 和計劃於 2025 年 11 月發布的.NET 10 保持向前相容。
範例-從 HTML 片段產生 PDF
// Program.cs — compatible with .NET 8 and newer
using IronPdf;
// Sample HTML fragment (could also be read from a file, Razor view, or CMS)
const string html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Quarterly Report</title>
<style>
body { font-family:'Segoe UI', sans-serif; margin:1.2rem; }
header { margin-bottom:2rem; }
h1 { color:#3056d3; }
table { width:100%; border-collapse:collapse; margin-top:1rem; }
th,td { border:1px solid #ddd; padding:0.5rem; text-align:right; }
tr:nth-child(even){ background-color:#f8f9fa; }
</style>
</head>
<body>
<header><h1>Q2 Revenue Summary</h1></header>
<table>
<thead><tr><th>Product</th><th>Revenue ($)</th></tr></thead>
<tbody>
<tr><td>IronPDF for .NET</td><td>1,200,000</td></tr>
<tr><td>IronOCR for .NET</td><td>890,000</td></tr>
<tr><td>IronXL for .NET</td><td>610,000</td></tr>
</tbody>
</table>
</body>
</html>
""";
// 1. Create a renderer once and reuse it across conversions
var renderer = new ChromePdfRenderer
{
RenderingOptions =
{
PaperSize = PdfPaperSize.A4, // ISO-standard paper size
PaperOrientation = PdfPaperOrientation.Portrait,
CssMediaType = PdfCssMediaType.Screen, // Respect on-screen CSS
RenderDelay = 100, // Wait 100 ms for JS/animations
FallbackEncoding = "utf-8" // Handle non-ASCII correctly
}
};
// 2. Render the HTML fragment
using PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
// 3. Persist to disk or return via ASP.NET Core FileStreamResult
pdf.SaveAs("q2-report.pdf");
// Program.cs — compatible with .NET 8 and newer
using IronPdf;
// Sample HTML fragment (could also be read from a file, Razor view, or CMS)
const string html = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Quarterly Report</title>
<style>
body { font-family:'Segoe UI', sans-serif; margin:1.2rem; }
header { margin-bottom:2rem; }
h1 { color:#3056d3; }
table { width:100%; border-collapse:collapse; margin-top:1rem; }
th,td { border:1px solid #ddd; padding:0.5rem; text-align:right; }
tr:nth-child(even){ background-color:#f8f9fa; }
</style>
</head>
<body>
<header><h1>Q2 Revenue Summary</h1></header>
<table>
<thead><tr><th>Product</th><th>Revenue ($)</th></tr></thead>
<tbody>
<tr><td>IronPDF for .NET</td><td>1,200,000</td></tr>
<tr><td>IronOCR for .NET</td><td>890,000</td></tr>
<tr><td>IronXL for .NET</td><td>610,000</td></tr>
</tbody>
</table>
</body>
</html>
""";
// 1. Create a renderer once and reuse it across conversions
var renderer = new ChromePdfRenderer
{
RenderingOptions =
{
PaperSize = PdfPaperSize.A4, // ISO-standard paper size
PaperOrientation = PdfPaperOrientation.Portrait,
CssMediaType = PdfCssMediaType.Screen, // Respect on-screen CSS
RenderDelay = 100, // Wait 100 ms for JS/animations
FallbackEncoding = "utf-8" // Handle non-ASCII correctly
}
};
// 2. Render the HTML fragment
using PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
// 3. Persist to disk or return via ASP.NET Core FileStreamResult
pdf.SaveAs("q2-report.pdf");
' Program.cs — compatible with .NET 8 and newer
Imports IronPdf
' Sample HTML fragment (could also be read from a file, Razor view, or CMS)
Private Const html As String = "<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""utf-8"">
<title>Quarterly Report</title>
<style>
body { font-family:'Segoe UI', sans-serif; margin:1.2rem; }
header { margin-bottom:2rem; }
h1 { color:#3056d3; }
table { width:100%; border-collapse:collapse; margin-top:1rem; }
th,td { border:1px solid #ddd; padding:0.5rem; text-align:right; }
tr:nth-child(even){ background-color:#f8f9fa; }
</style>
</head>
<body>
<header><h1>Q2 Revenue Summary</h1></header>
<table>
<thead><tr><th>Product</th><th>Revenue ($)</th></tr></thead>
<tbody>
<tr><td>IronPDF for .NET</td><td>1,200,000</td></tr>
<tr><td>IronOCR for .NET</td><td>890,000</td></tr>
<tr><td>IronXL for .NET</td><td>610,000</td></tr>
</tbody>
</table>
</body>
</html>"
' 1. Create a renderer once and reuse it across conversions
Private renderer = New ChromePdfRenderer With {
.RenderingOptions = {
PaperSize = PdfPaperSize.A4,
PaperOrientation = PdfPaperOrientation.Portrait,
CssMediaType = PdfCssMediaType.Screen,
RenderDelay = 100,
FallbackEncoding = "utf-8"
}
}
' 2. Render the HTML fragment
Private PdfDocument As using
' 3. Persist to disk or return via ASP.NET Core FileStreamResult
pdf.SaveAs("q2-report.pdf")
這段程式碼示範了什麼
-內建 Chromium -- IronPDF捆綁了Chromium 引擎,保證了HTML5、CSS3 和JavaScript與現代瀏覽器的一致性。
-單一依賴項--輕量級的NuGet安裝涵蓋 Windows、Linux、Docker 和 Azure/AWS,無需額外的系統程式庫。
-渲染選項-- CssMediaType 和 RenderDelay 鏡像瀏覽器列印設置,以便 PDF 與螢幕佈局相符。
-面向未來的目標-- .NET 8、 .NET 9 STS 和即將推出的.NET 10 的 API 介面相同,因此長期維護工作量極少。
-後處理鉤子-- PdfDocument 公開了合併、密碼保護和數位簽章的輔助函數-本指南稍後將分別介紹這些函數。
進一步閱讀:請參閱逐步HTML 字串到 PDF 教學課程和完整的ChromePdfRenderer API 文件。
如何將 ASP.NET .NET Core MVC 視圖匯出為 PDF?
IronPDF以與瀏覽器相同的方式渲染完全處理的Razor視圖(.cshtml),並將結果作為 PdfDocument 串流傳輸。 以下工作流程保持控制器邏輯清晰,無需瀏覽器插件,並且適用於.NET 8 LTS、 .NET 9 預覽版以及計劃於 2025 年 11 月發布的.NET 10。
端到端控制器範例
// TicketsController.cs — .NET 8 LTS / MVC
using IronPdf;
using Microsoft.AspNetCore.Mvc;
using YourApp.Models; // TicketViewModel
public class TicketsController : Controller
{
private readonly ChromePdfRenderer _renderer;
public TicketsController()
{
_renderer = new ChromePdfRenderer
{
RenderingOptions =
{
PaperSize = PdfPaperSize.A5, // Compact ticket size
PaperOrientation = PdfPdfOrientation.Portrait,
FitToPaperWidth = true,
CssMediaType = PdfCssMediaType.Print,
Margins = new PdfMargins(5, 10, 5, 10) // mm
}
};
}
// GET /Tickets/Print/42
public async Task<IActionResult> Print(int id)
{
TicketViewModel vm = await _service.GetTicketAsync(id);
// 1. Render the Razor view to an HTML string
string html = await RazorTemplateEngine.RenderViewAsync(
HttpContext, "~/Views/Tickets/Print.cshtml", vm);
// 2. Convert HTML → PDF
using PdfDocument pdf = _renderer.RenderHtmlAsPdf(html);
// 3. Stream back as a file
return File(pdf.BinaryData, "application/pdf",
$"ticket-{id}.pdf");
}
}
// TicketsController.cs — .NET 8 LTS / MVC
using IronPdf;
using Microsoft.AspNetCore.Mvc;
using YourApp.Models; // TicketViewModel
public class TicketsController : Controller
{
private readonly ChromePdfRenderer _renderer;
public TicketsController()
{
_renderer = new ChromePdfRenderer
{
RenderingOptions =
{
PaperSize = PdfPaperSize.A5, // Compact ticket size
PaperOrientation = PdfPdfOrientation.Portrait,
FitToPaperWidth = true,
CssMediaType = PdfCssMediaType.Print,
Margins = new PdfMargins(5, 10, 5, 10) // mm
}
};
}
// GET /Tickets/Print/42
public async Task<IActionResult> Print(int id)
{
TicketViewModel vm = await _service.GetTicketAsync(id);
// 1. Render the Razor view to an HTML string
string html = await RazorTemplateEngine.RenderViewAsync(
HttpContext, "~/Views/Tickets/Print.cshtml", vm);
// 2. Convert HTML → PDF
using PdfDocument pdf = _renderer.RenderHtmlAsPdf(html);
// 3. Stream back as a file
return File(pdf.BinaryData, "application/pdf",
$"ticket-{id}.pdf");
}
}
Imports IronPdf
Imports Microsoft.AspNetCore.Mvc
Imports YourApp.Models ' TicketViewModel
Public Class TicketsController
Inherits Controller
Private ReadOnly _renderer As ChromePdfRenderer
Public Sub New()
_renderer = New ChromePdfRenderer With {
.RenderingOptions = New PdfRenderingOptions With {
.PaperSize = PdfPaperSize.A5, ' Compact ticket size
.PaperOrientation = PdfPdfOrientation.Portrait,
.FitToPaperWidth = True,
.CssMediaType = PdfCssMediaType.Print,
.Margins = New PdfMargins(5, 10, 5, 10) ' mm
}
}
End Sub
' GET /Tickets/Print/42
Public Async Function Print(id As Integer) As Task(Of IActionResult)
Dim vm As TicketViewModel = Await _service.GetTicketAsync(id)
' 1. Render the Razor view to an HTML string
Dim html As String = Await RazorTemplateEngine.RenderViewAsync(
HttpContext, "~/Views/Tickets/Print.cshtml", vm)
' 2. Convert HTML → PDF
Using pdf As PdfDocument = _renderer.RenderHtmlAsPdf(html)
' 3. Stream back as a file
Return File(pdf.BinaryData, "application/pdf", $"ticket-{id}.pdf")
End Using
End Function
End Class
這段程式碼說明了什麼
-沒有臨時檔案-- Razor視圖在記憶體中渲染,然後直接傳遞給RenderHtmlAsPdf ,避免磁碟 I/O 和臨時資料夾競爭條件。
-票據大小的輸出-- PaperSize = A5 和窄邊距使在家中列印的票據保持緊湊。
-一致的列印樣式-- CssMediaType = Print 應用與瀏覽器相同的 @media print CSS 規則。
-二進位串流-- pdf.BinaryData 無需存取檔案系統即可傳輸文件; 非常適合 API 端點和 Lambda 函數。
-可重複使用的渲染器-- ChromePdfRenderer 每個控制器實例化一次,然後重複使用,從而最大限度地減少進程產生開銷。
`PaperSize` 、 `PaperOrientation` 、 `FitToPaperWidth`
`Margins` 、 `Header` 、 `Footer` 、 `Watermark`
下一步:新增加密、數位簽章或將多個票據合併到一個文件中。請參閱合併範例和數位簽章操作指南。
如何在渲染前微調紙張尺寸、頁邊距、頁首、浮水印和安全設定?
IronPDF公開了一個 ChromePdfRenderOptions 對象,該對象控制輸出的各個方面——紙張尺寸、方向、頁眉和頁腳、 JavaScript計時、水印、加密和數位簽名——所有這些都無需額外的瀏覽器插件。
程式碼範例-一次套用多個選項
// AdvancedOptions.cs — .NET 8 compatible
using IronPdf;
var renderer = new ChromePdfRenderer();
// Configure everything in one place
renderer.RenderingOptions = new ChromePdfRenderOptions
{
// 1. Page layout
PaperSize = PdfPaperSize.A4, // ISO size
PaperOrientation = PdfPdfOrientation.Portrait,
Margins = new PdfMargins { Top = 20, Bottom = 25, Left = 15, Right = 15 }, // mm
// 2. Timing & media
CssMediaType = PdfCssMediaType.Print, // Respect @media print
EnableJavaScript = true,
RenderDelay = 200, // Wait 200 ms for animations
// 3. Headers & footers (HTML gives full design freedom)
HtmlHeader = "<header style='font:14px Segoe UI'>Invoice — {{date}}</header>",
HtmlFooter = "<footer style='text-align:right;font-size:10px'>Page {{page}} / {{total-pages}}</footer>",
// 4. Watermark
Watermark = new HtmlStamp
{
HtmlTemplate = "<div style='font-size:50px;color:#cccccc;opacity:0.3;'>CONFIDENTIAL</div>",
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Center
},
// 5. Security
SecurityOptions = new PdfSecurityOptions
{
OwnerPassword = "StrongOwnerPwd!",
UserPassword = "ReadOnly",
AllowUserPrinting = false,
AllowUserCopyPasteContent = false
}
};
// Render any HTML
using PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Advanced Options Demo</h1>");
// Digitally sign with a PFX certificate (optional)
pdf.SignAndStamp("./certs/company.pfx", "Iron Software", "Bangkok", "Approval");
// Save
pdf.SaveAs("advanced-options-demo.pdf");
// AdvancedOptions.cs — .NET 8 compatible
using IronPdf;
var renderer = new ChromePdfRenderer();
// Configure everything in one place
renderer.RenderingOptions = new ChromePdfRenderOptions
{
// 1. Page layout
PaperSize = PdfPaperSize.A4, // ISO size
PaperOrientation = PdfPdfOrientation.Portrait,
Margins = new PdfMargins { Top = 20, Bottom = 25, Left = 15, Right = 15 }, // mm
// 2. Timing & media
CssMediaType = PdfCssMediaType.Print, // Respect @media print
EnableJavaScript = true,
RenderDelay = 200, // Wait 200 ms for animations
// 3. Headers & footers (HTML gives full design freedom)
HtmlHeader = "<header style='font:14px Segoe UI'>Invoice — {{date}}</header>",
HtmlFooter = "<footer style='text-align:right;font-size:10px'>Page {{page}} / {{total-pages}}</footer>",
// 4. Watermark
Watermark = new HtmlStamp
{
HtmlTemplate = "<div style='font-size:50px;color:#cccccc;opacity:0.3;'>CONFIDENTIAL</div>",
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Center
},
// 5. Security
SecurityOptions = new PdfSecurityOptions
{
OwnerPassword = "StrongOwnerPwd!",
UserPassword = "ReadOnly",
AllowUserPrinting = false,
AllowUserCopyPasteContent = false
}
};
// Render any HTML
using PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Advanced Options Demo</h1>");
// Digitally sign with a PFX certificate (optional)
pdf.SignAndStamp("./certs/company.pfx", "Iron Software", "Bangkok", "Approval");
// Save
pdf.SaveAs("advanced-options-demo.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' Configure everything in one place
renderer.RenderingOptions = New ChromePdfRenderOptions With {
' 1. Page layout
.PaperSize = PdfPaperSize.A4, ' ISO size
.PaperOrientation = PdfPdfOrientation.Portrait,
.Margins = New PdfMargins With {.Top = 20, .Bottom = 25, .Left = 15, .Right = 15}, ' mm
' 2. Timing & media
.CssMediaType = PdfCssMediaType.Print, ' Respect @media print
.EnableJavaScript = True,
.RenderDelay = 200, ' Wait 200 ms for animations
' 3. Headers & footers (HTML gives full design freedom)
.HtmlHeader = "<header style='font:14px Segoe UI'>Invoice — {{date}}</header>",
.HtmlFooter = "<footer style='text-align:right;font-size:10px'>Page {{page}} / {{total-pages}}</footer>",
' 4. Watermark
.Watermark = New HtmlStamp With {
.HtmlTemplate = "<div style='font-size:50px;color:#cccccc;opacity:0.3;'>CONFIDENTIAL</div>",
.VerticalAlignment = VerticalAlignment.Center,
.HorizontalAlignment = HorizontalAlignment.Center
},
' 5. Security
.SecurityOptions = New PdfSecurityOptions With {
.OwnerPassword = "StrongOwnerPwd!",
.UserPassword = "ReadOnly",
.AllowUserPrinting = False,
.AllowUserCopyPasteContent = False
}
}
' Render any HTML
Using pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Advanced Options Demo</h1>")
' Digitally sign with a PFX certificate (optional)
pdf.SignAndStamp("./certs/company.pfx", "Iron Software", "Bangkok", "Approval")
' Save
pdf.SaveAs("advanced-options-demo.pdf")
End Using
這些選項為何重要
Margins和CssMediaType映像瀏覽器的列印對話框,因此在 Windows、Linux 和 Docker 上,螢幕佈局和 PDF 保持相同。- HTML 頁首和頁尾支援Razor代幣、CSS 和JavaScript-- 方便實現動態頁碼或品牌識別。
HtmlStamp允許使用一行程式碼建立具有完整 HTML + CSS 控制的品牌浮水印。
-安全選項支援 128 位元加密、擁有者/使用者密碼和細粒度權限,無需第三方工具。
-數位簽名直接在代碼中添加加密印章,以保持法律真實性和防篡改性。- 提取輔助程序(例如
ExtractAllText和ExtractAllImages)在需要分析時會反轉該過程。
快速參考 — 常用設定
`PaperSize` 、 `PaperOrientation` 、 `Margins` 、 `CssMediaType` 、 `RenderDelay`
`HtmlHeader` 、 `HtmlFooter` 、動態Razor佔位符、頁碼標記
`Watermark` 、 `HtmlStamp` 、不透明度、對齊方式
`SecurityOptions` 、 `SignAndStamp` 、所有者/用戶密碼、證書密封
後續任務:合併多個 PDF 文件,提取文字和映像,並部署到 Docker 或無伺服器平台。 請繼續執行部署部分,以確保跨平台一致性。
如何在Linux和Windows系統上將PDF產生程式碼部署到Docker容器中?
IronPDF以單一自包含的NuGet套件的形式提供,因此在Windows 和 Linux上容器化ASP.NET Core (或控制台)應用程式非常簡單。 關鍵是將已發布的二進位檔案複製到精簡的執行時間映像中,並且在 Linux 上,新增IronPDF所需的兩個本機程式庫(libnss3 和 libatk1.0-0)。
多階段 Dockerfile(Ubuntu 22.04)
####### ---------- stage 1 ----------
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyPdfApp.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish
####### ---------- stage 2 ----------
FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy
######## Install two native libs required by Chromium
RUN apt-get update && \
apt-get install -y --no-install-recommends libnss3 libatk1.0-0 && \
rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyPdfApp.dll"]
Windows 容器?請將第二階段替換為 mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022——由於 Chromium DLL 已打包,因此無需其他軟體包。
端對端驗證腳本
docker build -t pdf-demo .
docker run --rm -p 8080:80 pdf-demo
######### ↳ Navigate to http://localhost:8080/api/pdf?url=https://example.com
docker build -t pdf-demo .
docker run --rm -p 8080:80 pdf-demo
######### ↳ Navigate to http://localhost:8080/api/pdf?url=https://example.com
- API 操作內部呼叫
ChromePdfRenderer.RenderUrlAsPdf,就像第 2 部分一樣。
IronPDF在容器內啟動其沙盒化的 Chromium 進程——由於它是無頭渲染,因此不需要 X 伺服器。 - 即使在進行大型渲染時,記憶體佔用也保持在 200 MB 以下。
libnss3 和 libatk1.0-0 都存在。 由於 musl C 庫缺少必要的符號,因此不支援 Alpine 鏡像。
內部資源
- 教學 –在 Docker 容器中部署IronPDF
- 操作指南 –在 Azure 應用服務 Linux 上執行IronPDF
- API 參考 –
ChromePdfRenderer類
如何在.NET Core中開啟、合併、新增浮水印和提取現有PDF的內容?
IronPDF將每個 PDF 檔案(無論是IronPDF、Adobe® Acrobat 或第三方工具產生的 PDF 檔案)視為一流的 PdfDocument 對象,可以開啟、編輯、保護和重新儲存而不會損失品質。 同樣的 API 介面目前在.NET 8 LTS 上運作良好,並且在.NET 9 預覽版和即將發布的.NET 10 版本中無需任何修改即可編譯。
統一樣本 — 開啟 → 合併 → 新增浮水印 → 擷取
// ManipulateExistingPdf.cs — .NET 8 LTS compatible
using IronPdf;
using System.Linq;
// Step 1: Open two existing files (password-protected PDFs are supported)
PdfDocument invoice = PdfDocument.FromFile("invoice.pdf", "ReadOnly"); // open with user pwd
PdfDocument tAndCs = PdfDocument.FromFile("terms.pdf"); // no pwd required
// Step 2: Merge them (invoice pages first, then T&Cs)
PdfDocument mergedPdf = PdfDocument.Merge(invoice, tAndCs); // 1-liner merge
// Step 3: Apply a diagonal CONFIDENTIAL watermark to every page
mergedPdf.ApplyStamp(
"<div style='font-size:60px;color:#d9534f;opacity:0.2;transform:rotate(-45deg);"
+ "width:100%;text-align:center;'>CONFIDENTIAL</div>",
verticalAlignment : VerticalAlignment.Center,
horizontalAlignment : HorizontalAlignment.Center);
// Step 4: Extract all text and the first image for audit purposes
string fullText = mergedPdf.ExtractAllText();
var image = mergedPdf.ExtractAllImages().FirstOrDefault();
// Step 5: Save or stream
mergedPdf.SaveAs("invoice-with-terms.pdf");
// ManipulateExistingPdf.cs — .NET 8 LTS compatible
using IronPdf;
using System.Linq;
// Step 1: Open two existing files (password-protected PDFs are supported)
PdfDocument invoice = PdfDocument.FromFile("invoice.pdf", "ReadOnly"); // open with user pwd
PdfDocument tAndCs = PdfDocument.FromFile("terms.pdf"); // no pwd required
// Step 2: Merge them (invoice pages first, then T&Cs)
PdfDocument mergedPdf = PdfDocument.Merge(invoice, tAndCs); // 1-liner merge
// Step 3: Apply a diagonal CONFIDENTIAL watermark to every page
mergedPdf.ApplyStamp(
"<div style='font-size:60px;color:#d9534f;opacity:0.2;transform:rotate(-45deg);"
+ "width:100%;text-align:center;'>CONFIDENTIAL</div>",
verticalAlignment : VerticalAlignment.Center,
horizontalAlignment : HorizontalAlignment.Center);
// Step 4: Extract all text and the first image for audit purposes
string fullText = mergedPdf.ExtractAllText();
var image = mergedPdf.ExtractAllImages().FirstOrDefault();
// Step 5: Save or stream
mergedPdf.SaveAs("invoice-with-terms.pdf");
' ManipulateExistingPdf.cs — .NET 8 LTS compatible
Imports IronPdf
Imports System.Linq
' Step 1: Open two existing files (password-protected PDFs are supported)
Private invoice As PdfDocument = PdfDocument.FromFile("invoice.pdf", "ReadOnly") ' open with user pwd
Private tAndCs As PdfDocument = PdfDocument.FromFile("terms.pdf") ' no pwd required
' Step 2: Merge them (invoice pages first, then T&Cs)
Private mergedPdf As PdfDocument = PdfDocument.Merge(invoice, tAndCs) ' 1-liner merge
' Step 3: Apply a diagonal CONFIDENTIAL watermark to every page
mergedPdf.ApplyStamp("<div style='font-size:60px;color:#d9534f;opacity:0.2;transform:rotate(-45deg);" & "width:100%;text-align:center;'>CONFIDENTIAL</div>", verticalAlignment := VerticalAlignment.Center, horizontalAlignment := HorizontalAlignment.Center)
' Step 4: Extract all text and the first image for audit purposes
Dim fullText As String = mergedPdf.ExtractAllText()
Dim image = mergedPdf.ExtractAllImages().FirstOrDefault()
' Step 5: Save or stream
mergedPdf.SaveAs("invoice-with-terms.pdf")
為什麼這很重要
-開啟並合併– PdfDocument.FromFile 載入任何符合標準的 PDF,包括加密文件,而 PdfDocument.Merge 可在一次呼叫中連接任意數量的文件。
-浮水印– ApplyStamp(別名 HtmlStamp)在選定的頁面上嵌入完全樣式化的 HTML/CSS 疊加層-標誌、二維碼或對角線文字-而無需柵格化。
-內容擷取– ExtractAllText 和 ExtractAllImages 擷取原始 UTF-8 文字或二進位影像流,用於下游歸檔或 AI 管道。
-數位簽章已準備就緒– 同一個 PdfDocument 實例可用 SignAndStamp 進行密封,產生符合 RFC 3161 標準且與ISO 32000-2 數位簽章要求一致的雜湊值。
-開放標準合規性– IronPDF保留了原始 PDF 結構(字體、圖層、XMP 元資料),因此輸出與 Adobe® Reader 和其他ISO 32000-1檢視器相容。
-面向未來– 該 API 避免了互通組件和 Win32 GDI 調用,因此程式碼可以在 Windows、Linux、Docker 和即將推出的.NET 10 無伺服器 SKU 上保持不變地運行。
需要拆分、旋轉或刪除頁面?請參閱頁面層級編輯教學課程,以了解更細緻的操作。
如何在.NET Core中對PDF進行加密和數位簽章?
IronPDF透過兩步驟保護文件:基於 AES 的加密(使用者/所有者密碼 + 細粒度權限)和X.509 數位簽名,使用加密雜湊對檔案進行密封。 這兩個 API 都存在於同一個 PdfDocument 物件上,因此在今天的.NET 8 LTS 上工作流程是相同的,並且在.NET 9 預覽版和即將發布的.NET 10 版本上編譯也不會改變。
範例-套用 256 位元 AES 加密,鎖定列印權限,並新增可見簽名
// SecureAndSign.cs — .NET 8 LTS compatible
using IronPdf;
// Step 1: Load an existing PDF (or produce one with RenderHtmlAsPdf)
PdfDocument pdf = PdfDocument.FromFile("financial-report.pdf");
// Step 2: Configure AES-256 encryption & permissions
pdf.SecuritySettings = new PdfSecuritySettings
{
EncryptionAlgorithm = PdfEncryptionAlgorithm.AES256Bit,
OwnerPassword = "IronAdmin!2025",
UserPassword = "ReadOnly",
AllowUserPrinting = PdfPrintSecurity.Disabled,
AllowUserCopyPasteContent = false,
AllowUserAnnotations = false
};
// Step 3: Digitally sign with a PFX certificate
pdf.SignAndStamp(
certificatePath : "./certs/ironsoftware.pfx",
authority : "Iron Software Ltd.",
location : "Chicago, IL",
reason : "Final approval"
);
// Step 4: Persist or stream
pdf.SaveAs("financial-report-secured-signed.pdf");
// SecureAndSign.cs — .NET 8 LTS compatible
using IronPdf;
// Step 1: Load an existing PDF (or produce one with RenderHtmlAsPdf)
PdfDocument pdf = PdfDocument.FromFile("financial-report.pdf");
// Step 2: Configure AES-256 encryption & permissions
pdf.SecuritySettings = new PdfSecuritySettings
{
EncryptionAlgorithm = PdfEncryptionAlgorithm.AES256Bit,
OwnerPassword = "IronAdmin!2025",
UserPassword = "ReadOnly",
AllowUserPrinting = PdfPrintSecurity.Disabled,
AllowUserCopyPasteContent = false,
AllowUserAnnotations = false
};
// Step 3: Digitally sign with a PFX certificate
pdf.SignAndStamp(
certificatePath : "./certs/ironsoftware.pfx",
authority : "Iron Software Ltd.",
location : "Chicago, IL",
reason : "Final approval"
);
// Step 4: Persist or stream
pdf.SaveAs("financial-report-secured-signed.pdf");
' SecureAndSign.cs — .NET 8 LTS compatible
Imports IronPdf
' Step 1: Load an existing PDF (or produce one with RenderHtmlAsPdf)
Private pdf As PdfDocument = PdfDocument.FromFile("financial-report.pdf")
' Step 2: Configure AES-256 encryption & permissions
pdf.SecuritySettings = New PdfSecuritySettings With {
.EncryptionAlgorithm = PdfEncryptionAlgorithm.AES256Bit,
.OwnerPassword = "IronAdmin!2025",
.UserPassword = "ReadOnly",
.AllowUserPrinting = PdfPrintSecurity.Disabled,
.AllowUserCopyPasteContent = False,
.AllowUserAnnotations = False
}
' Step 3: Digitally sign with a PFX certificate
pdf.SignAndStamp(certificatePath := "./certs/ironsoftware.pfx", authority := "Iron Software Ltd.", location := "Chicago, IL", reason := "Final approval")
' Step 4: Persist or stream
pdf.SaveAs("financial-report-secured-signed.pdf")
幕後花絮
- AES-256 加密-- IronPDF使用 NIST 核准的AES 金鑰對有效載荷進行封裝,阻止未經授權的開啟、列印或複製貼上。
-權限粒度-- 諸如AllowUserPrinting和AllowUserFormData之類的屬性切換每個操作的權限; 任何限制措施都需要所有者密碼才能生效。
-數位簽章--SignAndStamp嵌入 RFC 3161 時間戳與憑證鏈,建立 Adobe® Acrobat 和其他 ISO 32000-2 檢視器可識別的防篡改雜湊值。
-一站式 API -- 加密和簽名都修改同一個PdfDocument實例,避免多次文件傳遞,並保留內部字體、圖層和元資料。
location 字串符合 ASCII 編碼規範。 核心安全設定
`PdfSecuritySettings` → `OwnerPassword` 、 `UserPassword` 、 `EncryptionAlgorithm` 、 `AllowUserPrinting`
`PdfDocument.SignAndStamp` — PFX 路徑、權限、位置、原因、時間戳
用於深入研究的內部資源
教學課程-如何為PDF檔案設定密碼保護
-範例–對 PDF 檔案進行數位簽名
- API 參考–
PdfSecuritySettings
如何在.NET Core中優化和擴展 HTML 到 PDF 的效能?
IronPDF 的 Chromium 引擎在現代硬體上已經可以在不到 1 秒的時間內渲染大多數頁面,但透過大量渲染、啟用多執行緒和減少無頭 Chrome 開銷,吞吐量可以倍增。 以下提示同樣適用於所有.NET版本。
1. 在後台執行緒池上進行批次渲染
// BatchRender.cs — Thread-safe on .NET 8+
using IronPdf;
using System.Threading.Tasks;
var htmlSources = Directory.GetFiles("./html", "*.html");
var renderer = new ChromePdfRenderer(); // reuse 1 instance
Parallel.ForEach(htmlSources, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, file =>
{
string html = File.ReadAllText(file);
using PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(Path.ChangeExtension(file, ".pdf"));
});
// BatchRender.cs — Thread-safe on .NET 8+
using IronPdf;
using System.Threading.Tasks;
var htmlSources = Directory.GetFiles("./html", "*.html");
var renderer = new ChromePdfRenderer(); // reuse 1 instance
Parallel.ForEach(htmlSources, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, file =>
{
string html = File.ReadAllText(file);
using PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(Path.ChangeExtension(file, ".pdf"));
});
' BatchRender.cs — Thread-safe on .NET 8+
Imports IronPdf
Imports System.Threading.Tasks
Private htmlSources = Directory.GetFiles("./html", "*.html")
Private renderer = New ChromePdfRenderer() ' reuse 1 instance
Parallel.ForEach(htmlSources, New ParallelOptions With {.MaxDegreeOfParallelism = Environment.ProcessorCount}, Sub(file)
Dim html As String = File.ReadAllText(file)
Using pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs(Path.ChangeExtension(file, ".pdf"))
End Using
End Sub)
ChromePdfRenderer是線程安全的; 單一實例可以同時處理數十個任務而不會發生死鎖。Parallel.ForEach使每個 CPU 核心飽和; 與單線程循環相比,典型伺服器的吞吐量可提高 4-6 倍。- 如果ASP.NET請求排隊, 請將繁重的渲染任務移至託管的後台服務或訊息佇列,以保持較低的回應時間。
2. 降低無頭Chrome的啟動成本
IronPDF自備 Chromium 版本,但每次渲染都會產生少量啟動費用。 使用連線池會有所幫助, Linux 容器必須包含兩個本機程式庫:
RUN apt-get update && \
apt-get install -y --no-install-recommends libnss3 libatk1.0-0
Missing either library manifests as a libnss3.so not found error in Docker logs.
Recommended Chrome flags (automatically applied by IronPDF) include --disable-gpu and --no-sandbox to reduce memory and root-user issues in containers.
3. 使用 RenderDelay 或 WaitFor 等待延遲的JavaScript
在 DOMContentLoaded 之後,需要動畫計數器或取得資料的頁面可能需要短暫延遲:
renderer.RenderingOptions.RenderDelay = 200; // ms
// OR: renderer.RenderingOptions.JavaScript = "WaitFor('window.doneLoading')";
renderer.RenderingOptions.RenderDelay = 200; // ms
// OR: renderer.RenderingOptions.JavaScript = "WaitFor('window.doneLoading')";
renderer.RenderingOptions.RenderDelay = 200 ' ms
' OR: renderer.RenderingOptions.JavaScript = "WaitFor('window.doneLoading')";
有關自訂 Promise 和 DOM 輪詢的專門WaitFor 教程,請參閱相關文件。
4. 為一個請求啟用調試日誌記錄
renderer.LoggingOptions.DebugMode = true;
renderer.LoggingOptions.LogsToConsole = true;
renderer.LoggingOptions.LogFilePath = "./logs/ironpdf-debug.log";
renderer.LoggingOptions.DebugMode = true;
renderer.LoggingOptions.LogsToConsole = true;
renderer.LoggingOptions.LogFilePath = "./logs/ironpdf-debug.log";
renderer.LoggingOptions.DebugMode = True
renderer.LoggingOptions.LogsToConsole = True
renderer.LoggingOptions.LogFilePath = "./logs/ironpdf-debug.log"
即時 DevTools 追蹤可以顯示缺少的字體、404 圖像和計時事件,而無需重新編譯程式碼。
5. 重複使用範本PDF,而不是重新渲染
對於發票運行,建立一個帶有佔位符(如 [[name]])的模板 PDF ,並執行文字替換,而不是重建複雜的 HTML。 速度提升 10 倍,而且佔用記憶體更少。
快速調校檢查清單
`Parallel.ForEach` 、 `async/await` 、重用單一`ChromePdfRenderer`
使用`aspnet:8.0-jammy` ;安裝`libnss3` + `libatk1.0-0` ;標誌`--no-sandbox` , `--disable-gpu`
`RenderDelay` 、 `WaitFor()` 、記錄 DevTools 時間軸以了解 SPA 的緩慢水合情況
延伸閱讀
- 操作指南 – 如何使用非同步/多執行緒產生 PDF
- 故障排除 –效能協助中心
- 範例 –線程渲染演示
我可以在哪裡下載免費試用版、選擇授權並獲得專家支援? {#anchor-10-resources}
透過"開始免費試用"表單即可立即獲得30 天試用金鑰,解鎖所有功能(包括 HTML 轉 PDF、數位簽章和加密),且不含浮水印。
評估庫之後,選擇永久開發者許可證、部署許可證或企業許可證; 每個套餐都包含免費的小版本更新、開發/測試/生產環境使用權以及 30 天退款保證。 應用金鑰只需一行程式碼(IronPdf.License.LicenseKey = "YOUR-KEY";),並且可以在 CI/CD 管道中自動化。
全面的文件——快速入門指南、 API 參考和教學影片——位於文件門戶,並會隨著每個.NET版本的發布而更新。
工程方面的問題可以透過線上聊天、電子郵件或電話在一個工作天內得到芝加哥支援團隊的回應。
效能調優和部署常見問題匯總在效能幫助中心。
快速連結
| 資源 | URL | 為什麼這很重要 |
|---|---|---|
| 取得 30 天試用金鑰 | https://ironpdf.com/demos/ |
解鎖所有功能,無浮水印 |
| 授權和定價 | https://ironpdf.com/licensing/ |
永久或訂閱計劃; Iron Suite捆綁了 10 個庫 |
| API 參考 | https://ironpdf.com/object-reference/api/ |
完整的課程文檔,例如 ChromePdfRenderer |
| 文件入口網站 | https://ironpdf.com/docs/ |
指南、教學、範例項目 |
| 績效輔助 | https://ironpdf.com/troubleshooting/ironpdf-performance-assistance/ |
優化和擴展技巧 |
| 聯絡客服 | https://ironsoftware.com/contact-us/ |
線上聊天、電子郵件、電話支持 |
下一步
- 克隆範例儲存庫,其中演示了所有主要功能——從 MVC 視圖渲染到 AES-256 加密。
2.將試用金鑰插入現有解決方案並執行單元測試以驗證跨平台相容性。 - 與工程團隊預約現場演示,以獲取特定項目的建議。
有了這些資源,任何.NET團隊都可以在一個迭代周期內將像素級完美的 PDF 交付到生產環境——無論是在本地、Docker 還是無伺服器環境中。
常見問題解答
如何在 .NET Core 中將 HTML 轉換為 PDF?
您可以使用 IronPDF 庫在 .NET Core 中將 HTML 轉換為 PDF。首先,安裝 IronPDF 的 NuGet 套件,然後創建一個 ChromePdfRenderer 實例。使用 RenderHtmlAsPdf 方法來將 HTML 字串轉換為 PDF。
如何將網站 URL 轉換為 PDF 文檔?
要將網站 URL 轉換為 PDF 文檔,請安裝 IronPDF NuGet 套件,創建一個 ChromePdfRenderer 實例,然後使用 RenderUrlAsPdf 方法將 URL 轉換為 PDF。結果可以使用 SaveAs 方法保存。
轉換 Razor 視圖為 PDF 的最佳方法是什麼?
轉換 Razor 視圖為 PDF 的最佳方法是使用 IronPDF。首先,將 Razor 視圖渲染為 HTML 字串,然後將此字串傳遞給 RenderHtmlAsPdf 方法以創建 PDF 文檔。
如何增強我的 PDF 文檔的安全性?
通過使用 IronPDF 應用 AES-256 加密、設置密碼和控制用戶許可權來增強 PDF 安全性。通過 SecuritySettings 屬性配置這些設定以限制打印和編輯等操作。
有哪些選項可以自訂 PDF 渲染?
IronPDF 提供了多種渲染選項,可以使用 ChromePdfRenderOptions 類設置紙張大小、方向、邊距和應用 CSS 媒體類型。您還可以添加頁眉、頁腳和水印以自訂文件輸出。
如何在 Docker 容器中部署 PDF 生成應用程序?
要在 Docker 容器中部署 PDF 生成應用程序,請在 Dockerfile 中配置 Linux 依賴項並設定用戶許可權。使用 IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig 自動管理依賴項。
如何使用 C# 向 PDF 添加水印?
您可以使用 IronPDF 利用 Watermark 屬性和 HtmlStamp 對象向 PDF 添加水印。對於高級選項,可以使用 HtmlStamper 類來進行自定義定位和透明效果。
我可以為 PDF 文檔添加數位簽名嗎?
是的,您可以使用 IronPDF 的 PdfSignature 類為 PDF 添加數位簽名。對 PdfDocument 使用 Sign 方法並提供證書文件以確保文檔的完整性和真實性。
如何在 .NET Core 中優化 PDF 生成性能?
通過重用一個線程安全的 ChromePdfRenderer 實例、啟用多線程和修剪不必要的無頭 Chrome 啟動標誌來優化 PDF 生成性能。這些做法有助於提高您的應用程序的效率。
本教學中的 .NET Core HTML 轉 PDF 範例是否也適用於 .NET 10?
是的。 IronPDF 完全相容於 .NET 10,因此您可以在 .NET 10 專案中使用本教學中的 ChromePdfRenderer HTML 轉 PDF 範例,而無需更改核心程式碼。主要差異在於,您需要在建立專案時指定目標框架為 .NET 10,然後從 NuGet 安裝最新的 IronPDF 包,即可從 HTML、Razor 視圖或 URL 產生像素級精確的 PDF 檔案。

