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

使用 C# 和 IronPDF 在 .NET Core 中将 HTML 转换为 PDF

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

直接从 HTML 生成高保真 PDF 是现代 .NET 应用程序的常规需求——报告、发票和票据都需要与 Web 用户界面完全一致的像素级精准输出。 IronPDF 通过提供单一的 C# API,将 HTML、Razor 视图和完整网站渲染为符合标准的 PDF 文档,从而简化了这一工作流程。 阅读完本指南后,开发者将能够转换 ASP.NET Core 项目中的 URL、原始 HTML 或 MVC 视图,并将相同的代码部署到 Windows、Linux、Docker 或无服务器环境中。

提示针对排版问题,IronPDF 随附了一个无头 Chrome 调试器,可在 PDF 渲染前帮助诊断 CSS、JavaScript 和媒体查询的异常情况。 (请参阅专门的像素级精准 HTML 转 PDF/A 指南,了解深入的技术技巧。

快速入门:在 .NET Core 中将 HTML 转换为 PDF using IronPDF 库,在 .NET Core 中轻松将 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 和无服务器环境解析所有依赖项。

PM> Install-Package IronPdf             # .NET 8 LTS and higher
PM> Install-Package IronPdf             # .NET 8 LTS and higher
SHELL

请注意需要命令行界面(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")
$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 版本上均可直接编译通过。

分步示例

// 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
$vbLabelText   $csharpLabel

为何有效

  • ChromePdfRenderer 会启动一个沙箱化的 Chromium 实例——无需依赖系统版 Chrome,从而保持 Docker 镜像的精简。
  • RenderUrlAsPdf 会在 DOM 和 JavaScript 加载完成后才进行快照,因此单页应用能正确渲染。
  • CssMediaType 设置为 PRINT 可指示引擎使用打印专用规则,其效果与浏览器的 PRINT → 另存为 PDF 输出功能一致。
  • 生成的 PdfDocument 可以进行加密、数字签名、合并或栅格化——这些功能将在后续章节中介绍。

提示像素级调试:启用 renderer.LoggingOptions.DebugMode = true 并遵循无头 Chrome 调试指南,在渲染过程中检查实时开发者工具。

相关资源


如何在 .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")
$vbLabelText   $csharpLabel

代码演示内容

  • 内置 Chromium — IronPDF 集成了 Chromium 引擎,确保在 HTML5、CSS3 和 JavaScript 方面与现代浏览器保持一致
  • 单一依赖项仅需安装一个轻量级的 NuGet 包,即可支持 Windows、Linux、Docker 以及 Azure/AWS,无需额外系统库。
  • 渲染选项CssMediaTypeRenderDelay 模拟浏览器的 PRINT 设置,确保 PDF 与屏幕布局一致。
  • 面向未来的兼容性 — .NET 8、.NET 9 STS 以及即将发布的 .NET 10 均采用相同的 API 接口,因此长期维护工作量极小
  • 后处理钩子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 及窄边距设计,确保在家打印的票据紧凑小巧。
  • 保持 PRINT 风格一致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
$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 或无服务器环境。 请继续阅读部署部分,以确保跨平台的一致性。


如何在 Linux 和 Windows 系统上将 PDF 生成代码部署到 Docker 中?

IronPdf 以单个自包含的 NuGet 包形式发布,因此在 Windows 和 Linux 系统上将 ASP.NET Core(或控制台)应用程序容器化都非常简单。 关键在于将已发布的二进制文件复制到精简的运行时映像中,并在 Linux 系统上添加 IronPDF 所需的两个原生库(libnss3libatk1.0-0)。

多阶段 Dockerfile(Ubuntu 22.04)

请注意为何采用多阶段?SDK 映像(第 1 阶段)负责编译项目; 最终的运行时镜像(第二阶段)保持精简——小于 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 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
SHELL
  • 该 API 操作在内部调用了 ChromePdfRenderer.RenderUrlAsPdf,与第 2 节中的情况相同。
  • IronPDF 在容器内部启动其沙箱化的 Chromium 进程——由于采用无头渲染,因此无需 X 服务器。
  • 即使在进行大规模渲染时,内存占用也始终低于 200 MB。

提示故障排除提示:如果容器日志显示"libnss3.so 未找到"错误,请确认 libnss3libatk1.0-0 均已存在。 (支持 Alpine 镜像,因为 musl C 库缺少所需的符号。

内部资源


如何在 .NET Core 中打开、合并、添加水印以及从现有 PDF 中提取内容?

IronPDF 将所有 PDF 文件(无论是由 IronPDF、Adobe® Acrobat 还是第三方工具生成的)都视为一流的 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")
$vbLabelText   $csharpLabel

为何这很重要

  • 打开与合并PdfDocument.FromFile 可加载任何符合标准的 PDF 文件(包括加密文件),而 PdfDocument.Merge 则能通过单次调用将任意数量的文档合并为一个文件。
  • WatermarkApplyStamp(别名 HtmlStamp)可在选定页面上嵌入完全格式化的 HTML/CSS 叠加层(如徽标、QR 码或斜体文本),且无需进行栅格化处理。
  • 内容提取ExtractAllTextExtractAllImages 可提取原始 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 加密、锁定 PRINT 权限并添加可见签名

// 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")
$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. 在后台线程池中批量渲染

// 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)
$vbLabelText   $csharpLabel

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,用于减少容器环境中的内存占用和 root 用户相关问题。

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 教程,了解自定义 Promise 和 DOM 轮询。

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"
$vbLabelText   $csharpLabel

Live 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 时间轴以排查单页应用加载缓慢问题

延伸阅读


在哪里可以下载免费试用版、选择许可证并获取专家支持? {#anchor-10-resources}

通过"开始免费试用"表单可立即获取 30天试用密钥,解锁所有功能——包括 HTML 转 PDF、数字签名和加密——且不添加水印。

评估该库后,请选择永久开发者部署Enterprise许可证; 每个套餐均包含免费的小版本更新、开发/预发布/生产环境的使用权限,以及 30 天退款保证。 应用该密钥仅需一行代码(IronPdf.License.LicenseKey = "YOUR-KEY";),并可在 CI/CD 管道中实现自动化。

完整的文档资料——包括快速入门指南API 参考教程视频——均发布在文档门户上,并随每次 .NET 版本发布进行更新。

针对技术问题,位于芝加哥的支持团队将通过实时聊天电子邮件或电话在1个工作日内予以回复。

性能调优和部署常见问题已汇总在性能辅助中心。

快速链接

资源 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 添加水印?

您可以通过使用 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。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。

Jacob 拥有曼彻斯特大学土木工程一级荣誉工程学士学位(BEng)(1998-2001 年)。他的旗舰产品 IronPDF 和 Iron Suite for .NET 库在全球的 NuGet 安装量已超过 3000 万次,其基础代码继续为全球使用的开发人员工具提供动力。Jacob 拥有 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 峰会在内的最大型微软开发者活动的内容。
准备开始了吗?
Nuget 下载 19,014,616 | 版本: 2026.5 just released
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package IronPdf
运行示例看着你的HTML代码变成PDF文件。