如何在 .NET Core 中生成 PDF 文件

在 .NET Core 中使用 IronPDF 將 HTML 轉換為 PDF

This article was translated from English: Does it need improvement?
Translated
View the article in English

透過 HTML 直接生成高保真PDF是現代 .NET 應用程式中的常見需求——報告、發票和票證都需要像素完美的輸出,以匹配網頁 UI。 IronPDF 透過暴露單一的 C# API 來簡化此工作流程,將 HTML、Razor 頁面和整個網站渲染為符合標準的 PDF 文件。 到本指南結尾時,開發者將能夠在 ASP.NET Core 專案中轉換URL、原始HTML或MVC視圖,並將相同的程式部署到Windows、Linux、Docker或無伺服器環境。

提示針對佈局問題,IronPDF 配備了一個無頭 Chrome 除錯器,幫助診斷 CSS、JavaScript 和媒體查詢問題,然後才渲染 PDF。 參閱專用的像素完美 HTML 到 PDF 指南以獲取深入技術。

快速開始:在 .NET Core 中從 HTML 建立 PDF

以輕鬆在 .NET Core 中使用 IronPDF 程式庫將 HTML 轉換為 PDF。 本指南提供了一個簡單的範例,讓您能夠快速開始通過渲染HTML內容轉換成高品質的PDF,僅需最少的程式碼。 非常適合希望輕鬆將PDF建立整合到其應用程式中的開發者。

  1. 使用NuGet套件管理器安裝https://www.nuget.org/packages/IronPdf

    PM > Install-Package IronPdf
  2. 複製並運行這段程式碼片段。

    var pdf = new IronPdf.ChromePdfRenderer().RenderHtmlAsPdf("<h1>Hello World</h1>");
  3. 部署以在您的實時環境中測試

    今天就開始在您的專案中使用IronPDF,透過免費試用

    arrow pointer

快速開始檢查表

  1. 安裝Install-Package IronPdf
  2. 渲染 URLChromePdfRenderer.RenderUrlAsPdf()
  3. 渲染原始 HTMLChromePdfRenderer.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 和無伺服器目標的所有相依性。

:ProductInstall            # .NET 8 LTS and higher
:ProductInstall            # .NET 8 LTS and higher
SHELL

請注意需要 CLI? 相同命令適用於 dotnet add package IronPdf 在您的專案資料夾中。

安裝後,透過轉換任何公共URL確認一切已接線完成:

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-3.cs
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 Class
$vbLabelText   $csharpLabel

如何運作

  • 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 發行版上不變編譯。

逐步範例

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-4.cs
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 Class
$vbLabelText   $csharpLabel

為什麼它有效

  • ChromePdfRenderer 啟動了一個沙盒化的 Chromium 實例—沒有系統 Chrome 相依性,保持 Docker 映像瘦小。
  • RenderUrlAsPdf 會等待 DOM 和 JavaScript 完成後再進行快照,因此單頁應用程式正確渲染。
  • 設定 CssMediaTypePrint 告訴引擎使用列印特定的規則,匹配瀏覽器的_列印 → 存為 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

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-5.cs
@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> }
$vbLabelText   $csharpLabel

程式碼展示的內容

  • 內嵌 Chromium — IronPDF 捆綁了 Chromium 引擎,保證與現代瀏覽器HTML5、CSS3 和 JavaScript 的一致性。
  • 單一相依性 — 一個輕量化 NuGet 安裝支援 Windows、Linux、Docker 和 Azure/AWS,而不需要額外的系統庫。
  • 渲染選項CssMediaTypeRenderDelay 鏡像瀏覽器列印設定,因此 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 Class
$vbLabelText   $csharpLabel

此程式碼所說明的內容

  • 無暫存檔案 — Razor 視圖在記憶體中渲染,然後直接傳遞給 RenderHtmlAsPdf,避免磁碟 I/O 及臨時文件夾競態條件
  • 票券大小輸出PaperSize = A5 與窄邊距保持列印票緊湊。
  • 一致的列印樣式CssMediaType = Print 使用與瀏覽器相同的 @media print CSS 規則。
  • 二進位流pdf.BinaryData 將文件流出而不觸碰文件系統; 理想用於 API 端點和 Lambda 函式。
  • 可重用的渲染器ChromePdfRenderer 在每個控制器中實例化一次,然後重用,最大化減少進程啟動負荷。

PaperSize, PaperOrientation, FitToPaperWidth

Margins, Header, Footer, Watermark

下一步: 新增加密、數位簽章,或將多個票券合併為一個文件。參見合併範例數位簽章指南


Icon Quote related to 此程式碼所說明的內容

我最喜歡的程式庫是IronPDF。它允許快速高效地操作PDF文件。它還有許多有價值的功能,例如導出到PDF/A格式和數位簽署PDF文件。

Milan Jovanovic related to 此程式碼所說明的內容

Milan Jovanovic

Microsoft MVP

查看案例研究
Icon Quote related to 此程式碼所說明的內容

IronOCR意味著我們每年可以從手動處理中節省$40,000,同時提高生產力,釋放資源以進行高影響的任務。我會強烈推薦它。

Brent Matzelle related to 此程式碼所說明的內容

Brent Matzelle

首席技術官,OPYN

查看案例研究
Icon Quote related to 此程式碼所說明的內容

IronSuite在我們的運營中扮演著至關重要的角色。這些工具增加了包括建立平面圖和改善庫存管理在內的業務效率。

David Jones related to 此程式碼所說明的內容

David Jones

首席軟體工程師,Agorus Build

查看案例研究

在渲染前如何微調紙張大小、邊距、頁眉、水印和安全性?

IronPDF 提供一個 ChromePdfRenderOptions 物件來控制輸出的各個方面—紙張尺寸、方向、頁眉和頁尾、JavaScript 時間控制、水印、加密和數位簽章—所有這一切都不需要任何額外瀏覽器插件。

程式碼範例—同時應用多個選項

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-7.cs
[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
$vbLabelText   $csharpLabel

為什麼這些選項重要

  • MarginsCssMediaType 鏡像瀏覽器的列印對話框,因此在 Windows、Linux 和 Docker 上螢幕佈局和 PDF 保持一致。
  • HTML 頁眉和頁尾 支援 Razor 程式碼、CSS 和 JavaScript—對於動態頁碼或品牌標識非常有用。
  • HtmlStamp 讓一行建立品牌水印,具有完整 HTML + CSS 控制。
  • 安全選項 啟用 128 位加密,所有者/使用者密碼,和精細權限控制,無需第三方工具。
  • 數位簽章 可以直接在程式中新增密碼學印章,保持法律有效性和防篡改證據。
  • 提取助手如 ExtractAllTextExtractAllImages 在需要分析時逆轉過程。

快速參考—熱門設置

##

PaperSize, PaperOrientation, Margins, CssMediaType, RenderDelay

##

`HtmlHeader`, `HtmlFooter`, 動態 Razor 佔位符,頁碼程式碼

##

`Watermark`, `HtmlStamp`, 不透明度,對齊

##

`SecurityOptions`, `SignAndStamp`, 所有者 / 使用者密碼,證書密封

下一步任務: 合併多個 PDF,提取文字與圖像,並部署到 Docker或無伺服器。 繼續到部署部分以確保跨平台的相同功能。


如何將 PDF 生成程式碼部署到 Docker 上的 Linux 和 Windows?

IronPdf 以一個自備的 NuGet 套件發行,因此在Windows 和 Linux上容器化一個 ASP.NET Core(或控制台)應用非常容易。 關鍵是在瘦運行時映像中複製發布的二進制文件,並在 Linux 上新增 IronPDF 需要的兩個本機庫 (libnss3libatk1.0-0)。

多階段 Dockerfile (Ubuntu 22.04)

請注意為什麼需要多階段? SDK 映像(階段 1)編譯專案; 最終運行時映像(階段 2)保持精簡—< 120 MB—因為構建工具被棄置。

####### ---------- 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 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
docker build -t pdf-demo .
docker run --rm -p 8080:80 pdf-demo
######### ↳ Navigate to http://localhost:8080/api/pdf?url=https://example.com
SHELL
  • API 操作內部調用 ChromePdfRenderer.RenderUrlAsPdf 就像在 Section2 一樣。
  • IronPDF 在容器裡啟動其沙盒化的 Chromium 處理—不需要 X server,因為它無頭渲染。
  • 即使在大型渲染期間,實際記憶體佔用保持在 200 MB 以下。

提示故障排除提示: 如果容器記錄顯示錯誤 "libnss3.so not found",請確認 libnss3libatk1.0-0 皆存在。 Alpine 映像不支持,因為 musl C 庫缺乏必要的符號。

內部資源


如何在 .NET Core 中打開、合併、水印和提取現有的 PDF 內容?

IronPDF 將每個 PDF—無論是由 IronPDF、Adobe® Acrobat 或第三方工具生成的—視為一等 PdfDocument 數位物件,不會喪失質量地打開、編輯、保護和重儲存。 相同的 API 介面在今天的 .NET 8 LTS 上工作,並在 .NET 9 預覽版和即將到來的 .NET 10 發行上不變編譯。

統一範例—打開→合併→水印→提取

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-10.cs
[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
$vbLabelText   $csharpLabel

為什麼這很重要

  • 打開和合併PdfDocument.FromFile 載入任何符合標準的 PDF,包括加密文件,同時 PdfDocument.Merge 將任意數目的文件串聯在單次調用中。
  • 水印ApplyStamp (別名 HtmlStamp)將完全設計的 HTML/CSS 覆蓋層(logo、QR 工具或斜體文字)嵌入選定頁面中而不進行栅格化。
  • 內容提取ExtractAllTextExtractAllImages 提取原始 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,加鎖列印權限,並新增可見簽名

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-11.cs
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 Module
$vbLabelText   $csharpLabel

背後的運作

  • AES-256 加密 — IronPDF 用 NIST 認可的 AES 鑰匙打包有效載荷,阻擋未授權的打開、列印或複製粘貼。
  • 權限精細化 — 性質如 AllowUserPrintingAllowUserFormData 切換每個操作的權限; 需要所有者密碼才能使任何限制生效。
  • 數位簽章SignAndStamp 嵌入RFC 3161的時間戳和證書鏈,創造出由 Adobe® Acrobat 和其他 ISO 32000-2 瀏覽器認識的防篡改雜湊。
  • 單一API — 加密和簽名皆對相同 PdfDocument 實例進行修改,避免多次文件傳遞並保留內部字體、圖層、以及詮釋資料。

提示故障排除提示:如果 Adobe Reader 報告"無效簽名",請確保 PFX 含有受信源證書而且 location 字串是 ASCII 清潔的。

核心安全設置

##

`PdfSecuritySettings` → `OwnerPassword`, `UserPassword`, `EncryptionAlgorithm`, `AllowUserPrinting`

##

`PdfDocument.SignAndStamp` — PFX 路徑,授權機構,位置,原因,時間戳

內部資源加深探索


如何在 .NET Core 中優化並擴展 HTML 到 PDF 的效能?

IronPDF 的 Chromium 引擎在現代硬體上已經能夠在 < 1 秒內渲染大多數頁面,但隨著 批次渲染、啟用多執行緒和消除無頭 Chrome 負擔,還可以極大倍增吞吐量。 以下提示同樣適用於所有 .NET 版本。

1. 在背景執行緒池批量渲染

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-12.cs
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")
$vbLabelText   $csharpLabel
  • 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. 使用 RenderDelayWaitFor 等待延遲 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')";
$vbLabelText   $csharpLabel

請參見專門的 WaitFor 教學 獲取自定義承诺和 DOM 輪詢。

4. 打開除錯日誌記錄以進行一個請求

:path=/static-assets/pdf/content-code-examples/tutorials/dotnet-core-pdf-generating-15.cs
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")
$vbLabelText   $csharpLabel

即時 DevTools 跡線中揭露缺失的字體、404 圖像和時間事件而不需重新編譯程式碼。

5. 重用模板 PDF 而不是重新渲染

對於發票運行,建立一個模板 PDF用占位符位於 [[name]] 而不是重建複雜的 HTML。 速度快10倍且記憶體輕巧。

快速調整檢查表

##

`Parallel.ForEach`, `async/await`, reuse a single `ChromePdfRenderer`

##

Use `aspnet:8.0-jammy`; install `libnss3` + `libatk1.0-0`; flags `--no-sandbox`, `--disable-gpu`

##

`RenderDelay`, `WaitFor()`, 日誌 DevTools 時間軸以適應慢速 SPA 強化

進一步閱讀


在哪裡可以下載免費試用、選擇授權和找到專家支援?

一鍵獲取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/ 即時聊天,電子郵件,電話支援

下一步

  1. 克隆範例倉庫,演示每個主要功能—從 MVC 視圖渲染到 AES-256 加密。
  2. 插入試用金鑰至現有方案中,並運行單元測試以驗證跨平台相容性。
  3. 預訂線上示範,以獲得工程團隊針對特定專案的建議。

利用這些資源,任何 .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,首席技術官 @ Team Iron
首席技術官

Jacob Mellor是Iron Software的首席技術官,一位在C# PDF技術上開創先河的遠見工程師。作為Iron Software核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

Jacob擁有曼徹斯特大學的土木工程一等榮譽學士學位(BEng),於1998-2001年之間獲得。在1999年於倫敦創辦他的第一家軟體公司並於2005年建立了他的第一批.NET元組件後,他專注於解決Microsoft生態系統中的複雜問題。

他的旗艦IronPDF和Iron Suite .NET程式庫在全球獲得了超過3000萬次NuGet安裝依據,他的基礎程式碼基繼續支援著世界各地開發者使用的工具。擁有25年的商業經驗和41年的程式設計專業知識,他仍專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

由...審核
Jeff Fritz
Jeffrey T. Fritz
首席計劃經理 - .NET社區團隊
Jeff還是.NET和Visual Studio團隊的首席計劃經理。他是.NET Conf虛擬會議系列的執行製作人,並主持每週兩次的開發者直播節目'Fritz and Friends',在節目中討論技術並與觀眾一起撰寫程式碼。Jeff撰寫工作坊、演講和內容計劃,為微軟開發者的最大活動如Microsoft Build、Microsoft Ignite、.NET Conf和Microsoft MVP Summit提供內容支援。
準備開始了嗎?
Nuget 下載 20,296,129 | 版本: 2026.7 剛剛發布
Still Scrolling Icon

還在捲動嗎?

想快速獲得證明嗎? PM > Install-Package IronPdf
執行範例 看您的HTML變成PDF。