在 .NET Core 中使用 IronPDF 將 HTML 轉換為 PDF
透過 HTML 直接生成高保真PDF是現代 .NET 應用程式中的常見需求——報告、發票和票證都需要像素完美的輸出,以匹配網頁 UI。 IronPDF 透過暴露單一的 C# API 來簡化此工作流程,將 HTML、Razor 頁面和整個網站渲染為符合標準的 PDF 文件。 到本指南結尾時,開發者將能夠在 ASP.NET Core 專案中轉換URL、原始HTML或MVC視圖,並將相同的程式部署到Windows、Linux、Docker或無伺服器環境。
以輕鬆在 .NET Core 中使用 IronPDF 程式庫將 HTML 轉換為 PDF。 本指南提供了一個簡單的範例,讓您能夠快速開始通過渲染HTML內容轉換成高品質的PDF,僅需最少的程式碼。 非常適合希望輕鬆將PDF建立整合到其應用程式中的開發者。
-
1Install IronPDF with NuGet Package Manager
-
2複製並運行這段程式碼片段。
var pdf = new IronPdf.ChromePdfRenderer().RenderHtmlAsPdf("<h1>Hello World</h1>");Dim pdf = New IronPdf.ChromePdfRenderer().RenderHtmlAsPdf("<h1>Hello World</h1>")Dim pdf = New IronPdf.ChromePdfRenderer().RenderHtmlAsPdf("<h1>Hello World</h1>") -
3部署以在您的實時環境中測試
今天就開始在您的專案中使用IronPDF,透過免費試用
最小的工作流(5 步驟)
- Install the
IronPdfNuGet package - 使用
RenderUrlAsPdf轉換網站 URL - 通過
RenderHtmlAsPdf渲染原始 HTML - 將 MVC 視圖匯出為 PDF
- 調整紙張大小、邊距、頁眉和頁尾
快速開始檢查表
- 安裝 –
Install-Package IronPdf - 渲染 URL –
ChromePdfRenderer.RenderUrlAsPdf() - 渲染原始 HTML –
ChromePdfRenderer.RenderHtmlAsPdf() - 匯出 Razor 視圖 –
ChromePdfRenderer.RenderHtmlAsPdfAsync() - 調整輸出 – 利用
ChromePdfRenderer.RenderingOptions
本教程涵蓋的內容
- URL、HTML 字串和 Razor 視圖轉換
- 紙張、頁邊距和媒體型別配置
- 跨平台部署(Windows、Linux、Docker)
- 後期處理:合併、水印、密碼保護和數位簽章 PDF
- 全端範例:訂票 MVC 應用程式
如何在 .NET Core 中安裝 PDF 程式庫?
安裝程式庫在任何 .NET 8 專案中只需執行一行命令,並且保持對 .NET 9 預覽版和即將推出的 .NET 10 發行版的前向相容。 使用 NuGet 的套件管理器控制台,套件管理器將會自動解析Windows、Linux、Docker 和無伺服器目標的所有相依性。
:ProductInstall # .NET 8 LTS and higher
dotnet add package IronPdf 在您的專案資料夾中。安裝後,透過轉換任何公共URL確認一切已接線完成:
public class ClientModel
{
[Required]
public string Name { get; set; }
[Required]
public string Phone { get; set; }
[Required]
public string Email { get; set; }
}public class ClientModel
{
[Required]
public string Name { get; set; }
[Required]
public string Phone { get; set; }
[Required]
public string Email { get; set; }
}Public Class ClientModel
<Required>
Public Property Name() As String
<Required>
Public Property Phone() As String
<Required>
Public Property Email() As String
End ClassPublic Class ClientModel
<Required>
Public Property Name() As String
<Required>
Public Property Phone() As String
<Required>
Public Property Email() As String
End Class如何運作
ChromePdfRenderer在底層啟動了一個沙盒化的 Chromium 實例 - 不需要單獨安裝 Chrome。RenderUrlAsPdf會捕捉完整渲染的 DOM,包括由 JavaScript 驅動的內容、CSS 媒體查詢和字體。- 結果
PdfDocument提供合併、密碼保護或數位簽章輸出的輔助方法 - 這些功能會在後面教程中涵蓋。
有關部署細節(Azure App Service、AWS Lambda、內部部署 Linux)的更多內容,請參閱專用的 安裝指南 和 進階 NuGet 設定 頁面。 Docker 和 K8s 集群的內部 CI/CD 提示在 Docker 部署最佳實踐 中有所涵蓋。
.NET Core 服務如何將一個即時網站URL轉換成 PDF?
只需單次呼叫 RenderUrlAsPdf:傳遞任何公開可存取的 URL,IronPDF 即會返回一個完整渲染且符合標準的 PDF。 以下程式碼目標 .NET 8 LTS,並在 .NET 9 預覽版以及即將到來的 2025 年 .NET 10 發行版上不變編譯。
逐步範例
public class ClientServices
{
private static ClientModel _clientModel;
public static void AddClient(ClientModel clientModel)
{
_clientModel = clientModel;
}
public static ClientModel GetClient()
{
return _clientModel;
}
}public class ClientServices
{
private static ClientModel _clientModel;
public static void AddClient(ClientModel clientModel)
{
_clientModel = clientModel;
}
public static ClientModel GetClient()
{
return _clientModel;
}
}Public Class ClientServices
Private Shared _clientModel As ClientModel
Public Shared Sub AddClient(ByVal clientModel As ClientModel)
_clientModel = clientModel
End Sub
Public Shared Function GetClient() As ClientModel
Return _clientModel
End Function
End ClassPublic Class ClientServices
Private Shared _clientModel As ClientModel
Public Shared Sub AddClient(ByVal clientModel As ClientModel)
_clientModel = clientModel
End Sub
Public Shared Function GetClient() As ClientModel
Return _clientModel
End Function
End Class為什麼它有效
ChromePdfRenderer啟動了一個沙盒化的 Chromium 實例 - 沒有系統 Chrome 相依性,保持 Docker 映像瘦小。RenderUrlAsPdf會等待 DOM 和 JavaScript 完成後再進行快照,因此單頁應用程式正確渲染。- 設定
CssMediaType為 Print 告訴引擎使用列印特定的規則,匹配瀏覽器的_列印 → 存為 PDF_輸出。 - 結果的
PdfDocument可以加密、數位簽章、合併或將其栅格化 - 功能會在後面的部分涵蓋。
renderer.LoggingOptions.DebugMode = true 並按照 無頭 Chrome 除錯指南 在渲染期間檢查即時 DevTools。相關資源
-API 參考– ChromePdfRenderer.RenderUrlAsPdf
-API 參考– PdfDocument.SaveAs
如何在 .NET Core 中將原始 HTML 轉換為 PDF?
傳遞 HTML 字串 - 或 Razor 視圖的渲染標記 - to ChromePdfRenderer.RenderHtmlAsPdf 馬上產生一個符合標準的 PDF。 該方法會啟動 IronPDF 的內嵌 Chromium 引擎,因此不需要外部瀏覽器安裝或 WebView 相依性。 以下顯示的相同程式碼在今天的 .NET 8 LTS 上編譯,而在 2025 年 11 月預定的 .NET 10 發行中仍保持向前相容。
範例 - 從 HTML 片段生成 PDF
@model IronPdfMVCHelloWorld.Models.ClientModel
@{
ViewBag.Title = "Book Ticket";
}
<h2>Index</h2>
@using (Html.BeginForm())
{
<div class="form-horizontal">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Phone, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Phone, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Phone, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-10 pull-right">
<button type="submit" value="Save" class="btn btn-sm">
<i class="fa fa-plus"></i>
<span>
Save
</span>
</button>
</div>
</div>
</div>
}@model IronPdfMVCHelloWorld.Models.ClientModel
@{
ViewBag.Title = "Book Ticket";
}
<h2>Index</h2>
@using (Html.BeginForm())
{
<div class="form-horizontal">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Phone, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Phone, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Phone, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-10 pull-right">
<button type="submit" value="Save" class="btn btn-sm">
<i class="fa fa-plus"></i>
<span>
Save
</span>
</button>
</div>
</div>
</div>
}model ReadOnly Property () As IronPdfMVCHelloWorld.Models.ClientModel
ViewBag.Title = "Book Ticket"
End Property
'INSTANT VB TODO TASK: The following line could not be converted:
(Of h2) Index</h2> [using](Html.BeginForm())
If True Then
'INSTANT VB TODO TASK: The following line uses invalid syntax:
' <div class="form-horizontal"> @Html.ValidationSummary(True, "", New { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.Name, htmlAttributes: New { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Name, New { htmlAttributes = New { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Name, "", New { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Phone, htmlAttributes: New { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Phone, New { htmlAttributes = New { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Phone, "", New { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Email, htmlAttributes: New { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Email, New { htmlAttributes = New { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Email, "", New { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-10 pull-right"> <button type="submit" value="Save" class="btn btn-sm"> <i class="fa fa-plus"></i> <span> Save </span> </button> </div> </div> </div> }model ReadOnly Property () As IronPdfMVCHelloWorld.Models.ClientModel
ViewBag.Title = "Book Ticket"
End Property
'INSTANT VB TODO TASK: The following line could not be converted:
(Of h2) Index</h2> [using](Html.BeginForm())
If True Then
'INSTANT VB TODO TASK: The following line uses invalid syntax:
' <div class="form-horizontal"> @Html.ValidationSummary(True, "", New { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.Name, htmlAttributes: New { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Name, New { htmlAttributes = New { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Name, "", New { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Phone, htmlAttributes: New { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Phone, New { htmlAttributes = New { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Phone, "", New { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.Email, htmlAttributes: New { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Email, New { htmlAttributes = New { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Email, "", New { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-10 pull-right"> <button type="submit" value="Save" class="btn btn-sm"> <i class="fa fa-plus"></i> <span> Save </span> </button> </div> </div> </div> }程式碼展示的內容
- 內嵌 Chromium - IronPDF 捆綁了 Chromium 引擎,保證與現代瀏覽器HTML5、CSS3 和 JavaScript 的一致性。
- 單一相依性 - 一個輕量化 NuGet 安裝支援 Windows、Linux、Docker 和 Azure/AWS,而不需要額外的系統庫。
- 渲染選項 -
CssMediaType和RenderDelay鏡像瀏覽器列印設定,因此 PDF 與螢幕上的佈局匹配。 - 面向未來的定位 - API 介面在 .NET 8、.NET 9 STS 和即將推出的 .NET 10 中保持一致,因此長期維護工作量最小。
- 後期處理掛鉤 -
PdfDocument提供合併、密碼保護和數位簽章的輔助函式 - 在本指南後面會詳述每一個部分。
深入閱讀: 參見逐步HTML 字串到 PDF 教學 和完整 ChromePdfRenderer API 文件。
ASP .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 ClassImports 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 printCSS 規則。 - 二進位流 -
pdf.BinaryData將文件流出而不觸碰文件系統; 理想用於 API 端點和 Lambda 函式。 - 可重用的渲染器 -
ChromePdfRenderer在每個控制器中實例化一次,然後重用,最大化減少進程啟動負荷。
Paper & Orientation
PaperSize, PaperOrientation, FitToPaperWidth
Margins & Headers / Footers
Margins, Header, Footer, Watermark
下一步: 新增加密、數位簽章,或將多個票券合併為一個文件。參見合併範例和數位簽章指南。
在渲染前如何微調紙張大小、邊距、頁眉、水印和安全性?
IronPDF 提供一個 ChromePdfRenderOptions 物件來控制輸出的各個方面 - 紙張尺寸、方向、頁眉和頁尾、JavaScript 時間控制、水印、加密和數位簽章 - 所有這一切都不需要任何額外瀏覽器插件。
程式碼範例 - 同時應用多個選項
[HttpPost]
public ActionResult Index(ClientModel model)
{
if (ModelState.IsValid)
{
ClientServices.AddClient(model);
return RedirectToAction("TicketView");
}
return View(model);
}[HttpPost]
public ActionResult Index(ClientModel model)
{
if (ModelState.IsValid)
{
ClientServices.AddClient(model);
return RedirectToAction("TicketView");
}
return View(model);
}<HttpPost>
Public Function Index(ByVal model As ClientModel) As ActionResult
If ModelState.IsValid Then
ClientServices.AddClient(model)
Return RedirectToAction("TicketView")
End If
Return View(model)
End Function<HttpPost>
Public Function Index(ByVal model As ClientModel) As ActionResult
If ModelState.IsValid Then
ClientServices.AddClient(model)
Return RedirectToAction("TicketView")
End If
Return View(model)
End Function為什麼這些選項重要
Margins和CssMediaType鏡像瀏覽器的列印對話框,因此在 Windows、Linux 和 Docker 上螢幕佈局和 PDF 保持一致。- HTML 頁眉和頁尾 支援 Razor 程式碼、CSS 和 JavaScript - 對於動態頁碼或品牌標識非常有用。
HtmlStamp讓一行建立品牌水印,具有完整 HTML + CSS 控制。- 安全選項 啟用 128 位加密,所有者/使用者密碼,和精細權限控制,無需第三方工具。
- 數位簽章 可以直接在程式中新增密碼學印章,保持法律有效性和防篡改證據。
- 提取助手如
ExtractAllText和ExtractAllImages在需要分析時逆轉過程。
快速參考 - 熱門設置
Page Layout & Media
PaperSize, PaperOrientation, Margins, CssMediaType, RenderDelay
Headers & Footers
HtmlHeader, HtmlFooter, 動態 Razor 佔位符,頁碼程式碼
Watermarking
Watermark, HtmlStamp, 不透明度,對齊
Encryption & Signatures
SecurityOptions, SignAndStamp, 所有者 / 使用者密碼,證書密封
下一步任務: 合併多個 PDF,提取文字與圖像,並部署到 Docker或無伺服器。 繼續到部署部分以確保跨平台的相同功能。
如何將 PDF 生成程式碼部署到 Docker 上的 Linux 和 Windows?
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"]
mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 - 不需要其他套件,因為 Chromium DLLs 已打包。全端驗證脚本
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就像在 Section2 一樣。 - IronPDF 在容器裡啟動其沙盒化的 Chromium 處理 - 不需要 X server,因為它無頭渲染。
- 即使在大型渲染期間,實際記憶體佔用保持在 200 MB 以下。
libnss3 和 libatk1.0-0 皆存在。 Alpine 映像不支持,因為 musl C 庫缺乏必要的符號。內部資源
- 教學 – 在 Docker 容器中部署 IronPDF
- 如何進行 – 在 Azure App Service Linux 上運行 IronPDF
-API 參考–
ChromePdfRendererclass
如何在 .NET Core 中打開、合併、水印和提取現有的 PDF 內容?
IronPDF 將每個 PDF - 無論是由 IronPDF、Adobe® Acrobat 或第三方工具生成的 - 視為一等 PdfDocument 數位物件,不會喪失質量地打開、編輯、保護和重儲存。 相同的 API 介面在今天的 .NET 8 LTS 上工作,並在 .NET 9 預覽版和即將到來的 .NET 10 發行上不變編譯。
統一範例 - 打開→合併→水印→提取
[HttpPost]
public ActionResult TicketView(TicketModel model)
{
IronPdf.Installation.TempFolderPath = $@"{Directory.GetParent}/irontemp/";
IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = true;
var html = this.RenderViewAsync("_TicketPdf", model);
var renderer = new IronPdf.ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf(html.Result, @"wwwroot/css");
return File(pdf.Stream.ToArray(), "application/pdf");
}[HttpPost]
public ActionResult TicketView(TicketModel model)
{
IronPdf.Installation.TempFolderPath = $@"{Directory.GetParent}/irontemp/";
IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = true;
var html = this.RenderViewAsync("_TicketPdf", model);
var renderer = new IronPdf.ChromePdfRenderer();
using var pdf = renderer.RenderHtmlAsPdf(html.Result, @"wwwroot/css");
return File(pdf.Stream.ToArray(), "application/pdf");
}<HttpPost>
Public Function TicketView(ByVal model As TicketModel) As ActionResult
IronPdf.Installation.TempFolderPath = $"{AddressOf Directory.GetParent}/irontemp/"
IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = True
Dim html = Me.RenderViewAsync("_TicketPdf", model)
Dim renderer = New IronPdf.ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html.Result, "wwwroot/css")
Return File(pdf.Stream.ToArray(), "application/pdf")
End Function<HttpPost>
Public Function TicketView(ByVal model As TicketModel) As ActionResult
IronPdf.Installation.TempFolderPath = $"{AddressOf Directory.GetParent}/irontemp/"
IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = True
Dim html = Me.RenderViewAsync("_TicketPdf", model)
Dim renderer = New IronPdf.ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html.Result, "wwwroot/css")
Return File(pdf.Stream.ToArray(), "application/pdf")
End Function為什麼這很重要
- 打開和合併 –
PdfDocument.FromFile載入任何符合標準的 PDF,包括加密文件,同時PdfDocument.Merge將任意數目的文件串聯在單次調用中。 - 水印 –
ApplyStamp(別名HtmlStamp)將完全設計的 HTML/CSS 覆蓋層(logo、QR 工具或斜體文字)嵌入選定頁面中而不進行栅格化。 - 內容提取 –
ExtractAllText和ExtractAllImages提取原始 UTF-8 文字或二進位圖像流,用於下游存檔或 AI 管道。 - 數位簽章準備好 – 相同的
PdfDocument實例可以與SignAndStamp密封,產生符合 RFC 3161 的雜湊,符合 ISO 32000-2 數位簽章要求。 - 開放標準合規 – IronPDF 保留了原始 PDF 結構(字體、圖層、XMP 詮釋資料)因此輸出保持同 Adobe® Reader 及其他 ISO 32000-1 瀏覽器的相容性。
- 面向未來 – API 避免使用 interop 程式庫和 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,加鎖列印權限,並新增可見簽名
using System.IO;
using System.Threading.Tasks;
public static class ControllerExtensions
{
public static async Task<string> RenderViewAsync<TModel>(this Controller controller, string viewName, TModel model, bool partial = false)
{
if (string.IsNullOrEmpty(viewName))
{
viewName = controller.ControllerContext.ActionDescriptor.ActionName;
}
controller.ViewData.Model = model;
using (var writer = new StringWriter())
{
IViewEngine viewEngine = controller.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
ViewEngineResult viewResult = viewEngine.FindView(controller.ControllerContext, viewName, !partial);
if (viewResult.Success == false)
{
return $"A view with the name {viewName} could not be found";
}
ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, writer, new HtmlHelperOptions());
await viewResult.View.RenderAsync(viewContext);
return writer.GetStringBuilder().ToString();
}
}
}using System.IO;
using System.Threading.Tasks;
public static class ControllerExtensions
{
public static async Task<string> RenderViewAsync<TModel>(this Controller controller, string viewName, TModel model, bool partial = false)
{
if (string.IsNullOrEmpty(viewName))
{
viewName = controller.ControllerContext.ActionDescriptor.ActionName;
}
controller.ViewData.Model = model;
using (var writer = new StringWriter())
{
IViewEngine viewEngine = controller.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
ViewEngineResult viewResult = viewEngine.FindView(controller.ControllerContext, viewName, !partial);
if (viewResult.Success == false)
{
return $"A view with the name {viewName} could not be found";
}
ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, writer, new HtmlHelperOptions());
await viewResult.View.RenderAsync(viewContext);
return writer.GetStringBuilder().ToString();
}
}
}Imports System.IO
Imports System.Threading.Tasks
Public Module ControllerExtensions
<System.Runtime.CompilerServices.Extension> _
Public Async Function RenderViewAsync(Of TModel)(ByVal controller As Controller, ByVal viewName As String, ByVal model As TModel, Optional ByVal As Boolean = False) As Task(Of String)
If String.IsNullOrEmpty(viewName) Then
viewName = controller.ControllerContext.ActionDescriptor.ActionName
End If
controller.ViewData.Model = model
Using writer = New StringWriter()
Dim viewEngine As IViewEngine = TryCast(controller.HttpContext.RequestServices.GetService(GetType(ICompositeViewEngine)), ICompositeViewEngine)
Dim viewResult As ViewEngineResult = viewEngine.FindView(controller.ControllerContext, viewName, Not partial)
If viewResult.Success = False Then
Return $"A view with the name {viewName} could not be found"
End If
Dim viewContext As New ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, writer, New HtmlHelperOptions())
Await viewResult.View.RenderAsync(viewContext)
Return writer.GetStringBuilder().ToString()
End Using
End Function
End ModuleImports System.IO
Imports System.Threading.Tasks
Public Module ControllerExtensions
<System.Runtime.CompilerServices.Extension> _
Public Async Function RenderViewAsync(Of TModel)(ByVal controller As Controller, ByVal viewName As String, ByVal model As TModel, Optional ByVal As Boolean = False) As Task(Of String)
If String.IsNullOrEmpty(viewName) Then
viewName = controller.ControllerContext.ActionDescriptor.ActionName
End If
controller.ViewData.Model = model
Using writer = New StringWriter()
Dim viewEngine As IViewEngine = TryCast(controller.HttpContext.RequestServices.GetService(GetType(ICompositeViewEngine)), ICompositeViewEngine)
Dim viewResult As ViewEngineResult = viewEngine.FindView(controller.ControllerContext, viewName, Not partial)
If viewResult.Success = False Then
Return $"A view with the name {viewName} could not be found"
End If
Dim viewContext As New ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, writer, New HtmlHelperOptions())
Await viewResult.View.RenderAsync(viewContext)
Return writer.GetStringBuilder().ToString()
End Using
End Function
End Module背後的運作
- AES-256 加密 - IronPDF 用 NIST 認可的 AES 鑰匙打包有效載荷,阻擋未授權的打開、列印或複製粘貼。
- 權限精細化 - 性質如
AllowUserPrinting和AllowUserFormData切換每個操作的權限; 需要所有者密碼才能使任何限制生效。 - 數位簽章 -
SignAndStamp嵌入RFC 3161的時間戳和證書鏈,創造出由 Adobe® Acrobat 和其他 ISO 32000-2 瀏覽器認識的防篡改雜湊。 - 單一API - 加密和簽名皆對相同
PdfDocument實例進行修改,避免多次文件傳遞並保留內部字體、圖層、以及詮釋資料。
location 字串是 ASCII 清潔的。核心安全設置
Encryption & Passwords
PdfSecuritySettings → OwnerPassword, UserPassword, EncryptionAlgorithm, AllowUserPrinting
Digital Signatures
PdfDocument.SignAndStamp - PFX 路徑,授權機構,位置,原因,時間戳
內部資源加深探索
- 教程 – 如何給 PDF 設置密碼保護
- 範例 – 數位簽章一個 PDF
- API reference –
PdfSecuritySettings
如何在 .NET Core 中優化並擴展 HTML 到 PDF 的效能?
IronPDF 的 Chromium 引擎在現代硬體上已經能夠在 < 1 秒內渲染大多數頁面,但隨著 批次渲染、啟用多執行緒和消除無頭 Chrome 負擔,還可以極大倍增吞吐量。 以下提示同樣適用於所有 .NET 版本。
1. 在背景執行緒池批量渲染
IronPdf.License.LicenseKey = "YourLicenseKey";
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Set rendering options
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Portrait;
renderer.RenderHtmlFileAsPdf(@"testFile.html").SaveAs("GeneratedFile.pdf");IronPdf.License.LicenseKey = "YourLicenseKey";
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Set rendering options
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Portrait;
renderer.RenderHtmlFileAsPdf(@"testFile.html").SaveAs("GeneratedFile.pdf");Imports IronPdf
License.LicenseKey = "YourLicenseKey"
Dim renderer As New ChromePdfRenderer()
' Set rendering options
renderer.RenderingOptions.PaperSize = Rendering.PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = Rendering.PdfPaperOrientation.Portrait
renderer.RenderHtmlFileAsPdf("testFile.html").SaveAs("GeneratedFile.pdf")Imports IronPdf
License.LicenseKey = "YourLicenseKey"
Dim renderer As New ChromePdfRenderer()
' Set rendering options
renderer.RenderingOptions.PaperSize = Rendering.PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = Rendering.PdfPaperOrientation.Portrait
renderer.RenderHtmlFileAsPdf("testFile.html").SaveAs("GeneratedFile.pdf")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
缺少任何一個庫會表現在 Docker 日誌中的 libnss3.so not found 錯誤。
推薦的 Chrome 標誌(將由 IronPDF 自動應用) 包括 --disable-gpu 和 --no-sandbox 以降低記憶體和容器中的根使用者問題。
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')";renderer.RenderingOptions.RenderDelay = 200 ' ms
' OR: renderer.RenderingOptions.JavaScript = "WaitFor('window.doneLoading')";請參見專門的 WaitFor 教學 獲取自定義承诺和 DOM 輪詢。
4. 打開除錯日誌記錄以進行一個請求
IronPdf.License.LicenseKey = "YourLicenseKey";
PdfDocument pdf = PdfDocument.FromFile("1.pdf");
PdfDocument pdf2 = PdfDocument.FromFile("2.pdf");
pdf.AppendPdf(pdf2);
pdf.SaveAs("appendedFile.pdf");IronPdf.License.LicenseKey = "YourLicenseKey";
PdfDocument pdf = PdfDocument.FromFile("1.pdf");
PdfDocument pdf2 = PdfDocument.FromFile("2.pdf");
pdf.AppendPdf(pdf2);
pdf.SaveAs("appendedFile.pdf");IronPdf.License.LicenseKey = "YourLicenseKey"
Dim pdf As PdfDocument = PdfDocument.FromFile("1.pdf")
Dim pdf2 As PdfDocument = PdfDocument.FromFile("2.pdf")
pdf.AppendPdf(pdf2)
pdf.SaveAs("appendedFile.pdf")IronPdf.License.LicenseKey = "YourLicenseKey"
Dim pdf As PdfDocument = PdfDocument.FromFile("1.pdf")
Dim pdf2 As PdfDocument = PdfDocument.FromFile("2.pdf")
pdf.AppendPdf(pdf2)
pdf.SaveAs("appendedFile.pdf")即時 DevTools 跡線中揭露缺失的字體、404 圖像和時間事件而不需重新編譯程式碼。
5. 重用模板 PDF 而不是重新渲染
對於發票運行,建立一個模板 PDF用占位符位於 [[name]] 而不是重建複雜的 HTML。 速度快10倍且記憶體輕巧。
快速調整檢查表
Multi-Thread & Async
Parallel.ForEach, async/await, reuse a single ChromePdfRenderer
Docker-Optimised Images
Use aspnet:8.0-jammy; install libnss3 + libatk1.0-0; flags --no-sandbox, --disable-gpu
JavaScript Timing
RenderDelay, WaitFor(), 日誌 DevTools 時間軸以適應慢速 SPA 強化
進一步閱讀
- 如何進行 – 使用非同步 / 多執行緒生成 PDF
- 故障排除 – 效能輔助中心
- 例子 – 執行緒式渲染演示
在哪裡可以下載免費試用、選擇授權和找到專家支援?
一鍵獲取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/ | 即時聊天,電子郵件,電話支援 |
下一步
利用這些資源,任何 .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增強PDF安全性,方法是應用AES-256加密、設定密碼並控管使用者權限。通過SecuritySettings屬性配置這些設定,以限制列印和編輯等行為。
有哪些選項可用於自定PDF渲染?
IronPDF通過ChromePdfRenderOptions類提供各種渲染選項,包括設定紙張尺寸、方向、邊距以及應用CSS媒體型別。您還可以新增標頭、頁尾和浮水印,以自訂文件輸出。
如何在Docker容器中部署PDF生成應用程式?
要在Docker容器中部署PDF生成應用程式,請在Dockerfile中配置Linux依賴項,並設定使用者權限。利用IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig進行自動依賴項管理。
如何使用C#向PDF新增浮水印?
您可以使用IronPDF通過HtmlStamp物件來設置Watermark屬性,向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。
Jacob Mellor是Iron Software的首席技術官,一位在C# PDF技術上開創先河的遠見工程師。作為Iron Software核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。