跳至頁尾內容
使用IRONPDF

如何在 ASP.NET Core 中新增 PDF 數位簽章

IronPDF 提供一個簡單的 API,用於將 HTML 轉換為 PDF,並內建 Chrome 的渲染功能。 相比之下,像 PuppeteerSharp 這樣的開源選項提供免費的解決方案,但需要更多的設置和維護來進行大規模的 PDF 生成。

在現代的 .NET 專案中,將 HTML 轉換為 PDF 是必不可少的。 無論您是在生成報告、發票或是存檔整個網頁,選擇正確的.NET PDF 程式庫 對您的開發過程影響重大。 本文比較了流行的 HTML 轉 PDF C# 開源解決方案與 IronPDF,幫助您在需要生成 PDF 時做出明智決策。

有哪些開源 HTML 到 PDF 的 C# 選項存在?

.NET 生態系統提供多個開源程式庫,用於 HTML 到 PDF 的轉換。 每個都有自己的優勢和限制,您應在生產環境使用之前仔細評估。 這些程式庫通常處理不同的檔案格式,並且在 CSS 支援、JavaScript 邏輯執行和整體渲染準確度上有所不同。

為什麼 PuppeteerSharp 是最受歡迎的開源選擇?

PuppeteerSharp 標誌和介面顯示了在 C# 開發環境中的 HTML 到 PDF 轉換能力

PuppeteerSharp 是在 C# 中將 HTML 轉為 PDF 格式的最受歡迎的開源選擇。 它作為一個 NuGet 包 可用,是 Google 的 Puppeteer 的 .NET 移植版本,使用無頭的 Chromium 瀏覽器來渲染網頁內容,支持現代網路技術。 轉換過程包括一個被 Chromium 基於 PDF 引擎渲染的 HTML 文件,能夠逼真的再現瀏覽器體驗。

PuppeteerSharp 使用相同的 Chrome 渲染引擎推動 Google Chrome,確保 CSS3、JavaScript 和複雜佈局的準確渲染。 這使它特別適合於現代 Web 應用的轉化,這些應用具有回應式設計和由客戶端腳本框架驅動的動態內容。

如何使用 PuppeteerSharp 實現基礎 HTML 到 PDF 的轉換?

using PuppeteerSharp;

// Download Chromium browser
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();

// Launch browser and convert HTML string
using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
using var page = await browser.NewPageAsync();

// HTML content with CSS styling and JavaScript
var html = @"
    <html>
    <head>
        <style>
            body { font-family: Arial, sans-serif; }
            .header { color: #2563eb; font-size: 24px; }
            .content { margin: 20px; }
        </style>
    </head>
    <body>
        <div class='header'>Invoice #12345</div>
        <div class='content'>
            <p>Generated on: <span id='date'></span></p>
            <script>
                document.getElementById('date').innerText = new Date().toLocaleDateString();
            </script>
        </div>
    </body>
    </html>";

await page.SetContentAsync(html);
await page.PdfAsync("output.pdf", new PdfOptions
{
    Format = PaperFormat.A4,
    PrintBackground = true
});
using PuppeteerSharp;

// Download Chromium browser
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();

// Launch browser and convert HTML string
using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
using var page = await browser.NewPageAsync();

// HTML content with CSS styling and JavaScript
var html = @"
    <html>
    <head>
        <style>
            body { font-family: Arial, sans-serif; }
            .header { color: #2563eb; font-size: 24px; }
            .content { margin: 20px; }
        </style>
    </head>
    <body>
        <div class='header'>Invoice #12345</div>
        <div class='content'>
            <p>Generated on: <span id='date'></span></p>
            <script>
                document.getElementById('date').innerText = new Date().toLocaleDateString();
            </script>
        </div>
    </body>
    </html>";

await page.SetContentAsync(html);
await page.PdfAsync("output.pdf", new PdfOptions
{
    Format = PaperFormat.A4,
    PrintBackground = true
});
Imports PuppeteerSharp

' Download Chromium browser
Dim browserFetcher = New BrowserFetcher()
Await browserFetcher.DownloadAsync()

' Launch browser and convert HTML string
Using browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {.Headless = True})
    Using page = Await browser.NewPageAsync()

        ' HTML content with CSS styling and JavaScript
        Dim html = "
            <html>
            <head>
                <style>
                    body { font-family: Arial, sans-serif; }
                    .header { color: #2563eb; font-size: 24px; }
                    .content { margin: 20px; }
                </style>
            </head>
            <body>
                <div class='header'>Invoice #12345</div>
                <div class='content'>
                    <p>Generated on: <span id='date'></span></p>
                    <script>
                        document.getElementById('date').innerText = new Date().toLocaleDateString();
                    </script>
                </div>
            </body>
            </html>"

        Await page.SetContentAsync(html)
        Await page.PdfAsync("output.pdf", New PdfOptions With {
            .Format = PaperFormat.A4,
            .PrintBackground = True
        })
    End Using
End Using
$vbLabelText   $csharpLabel

上面的程式碼演示了 PuppeteerSharp 的 PDF 生成方法。 注意它需要手動的瀏覽器管理和異步操作,這可能會使錯誤处理和部署場景變得複雜。 該程式庫還需要謹慎的記憶體管理以避免在生產環境中的資源洩漏。

PuppeteerSharp 在處理具有複雜模板和 JavaScript 執行的網頁方面表現出色。 然而,它要求下載和管理一個 Chromium 實例(約 150MB),這會使部署複雜化並增加資源消耗。 這一大小要求對於部署到具有嚴格大小限制的 Azure Functions 或 AWS Lambda 等環境時尤其具有挑戰性。

您應該考慮哪些其他開源替代方案?

wkhtmltopdf 曾是一個受歡迎的選擇但具有顯著的缺點。 這個命令行工具自 2020 年以來就沒有重大的維護,且有已知的安全漏洞永遠不會被修補。 儘管它可以處理基本的 HTML 到 PDF 的轉換,但在現代 CSS3 和 JavaScript 渲染上表現不佳。 關心 SOC2 合規或 HIPAA 法規的組織應避免使用含有已知安全問題的舊版程式庫。

HtmlRenderer.PdfSharp 提供了一個輕量解決方案,但缺少原生 HTML 轉換功能。 它需要手動的 HTML 解析和定位,使其僅適合於沒有複雜樣式或 JavaScript 支援的簡單 HTML 片段。 您常常需要為基本的格式要求如多列佈局或漸變背景編寫自己的渲染邏輯。

SelectPdfRotativa 是額外的開源相近選項。 SelectPdf 免費層在頁數和功能上受到嚴重限制,而 Rotativa 包裝了 wkhtmltopdf,繼承了所有的維護和渲染限制。 兩者都未提供企業 .NET 應用程式通常需要的全功能 PDF 操作流水線。

IronPDF 如何簡化 PDF 生成?

IronPDF 標誌和其以 Chrome 為基礎的 PDF 渲染引擎架構的視覺表現

IronPDF 提供了一種完整的方法來進行 HTML 到 PDF 的轉換,並內建 Chrome 渲染引擎。與開源替代方案不同,它提供了一個簡單的 API 處理複雜的 HTML 元素,無需外部依賴。 您可以通過 NuGet 安裝 IronPDF,並在幾分鐘內生成生產質量的 PDF。 這個程式庫還同樣支持從 URL 和本地 HTML 檔案轉換文件。

IronPDF 的架構消除了開源解決方案中的常見痛點。 它內部處理瀏覽器依賴性,提供對 Windows、Linux 和 macOS 的原生支持,並包含 完整文件,為每個功能提供程式碼例子。 該程式庫帶有內建的渲染引擎,因而,部署期間無需單獨下載瀏覽器。

如何使用 IronPDF 的 API 進行 HTML 到 PDF 的轉換?

開始使用,請透過 NuGet 使用 Package Manager Console 或 .NET CLI 安裝 IronPDF。 IronPDF 被發佈在 NuGet.org 上,並相容 .NET 10、.NET Framework 和 .NET Standard 目標:

Install-Package IronPdf

一旦安裝,轉換 HTML 成為 PDF 文件只需幾行 C# 程式碼,使用頂層陳述:

using IronPdf;

// Initialize renderer
var renderer = new ChromePdfRenderer();

// Configure rendering options
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.EnableJavaScript = true;

// HTML with advanced CSS and JavaScript
var html = @"
    <html>
    <head>
        <style>
            body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
            .invoice-header {
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                color: white;
                padding: 20px;
                border-radius: 8px;
            }
            table { width: 100%; border-collapse: collapse; }
            th, td { padding: 10px; border-bottom: 1px solid #ddd; }
        </style>
    </head>
    <body>
        <div class='invoice-header'>
            <h1>Professional Invoice</h1>
        </div>
        <table>
            <tr><th>Item</th><th>Price</th></tr>
            <tr><td>Service A</td><td>$100</td></tr>
        </table>
        <script>
            console.log('PDF generated with IronPDF');
        </script>
    </body>
    </html>";

// Generate PDF from HTML string
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("professional-invoice.pdf");

// Convert from URL or HTML file
var urlPdf = renderer.RenderUrlAsPdf("https://ironpdf.com/");
var filePdf = renderer.RenderHtmlFileAsPdf("template.html");
using IronPdf;

// Initialize renderer
var renderer = new ChromePdfRenderer();

// Configure rendering options
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.EnableJavaScript = true;

// HTML with advanced CSS and JavaScript
var html = @"
    <html>
    <head>
        <style>
            body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
            .invoice-header {
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                color: white;
                padding: 20px;
                border-radius: 8px;
            }
            table { width: 100%; border-collapse: collapse; }
            th, td { padding: 10px; border-bottom: 1px solid #ddd; }
        </style>
    </head>
    <body>
        <div class='invoice-header'>
            <h1>Professional Invoice</h1>
        </div>
        <table>
            <tr><th>Item</th><th>Price</th></tr>
            <tr><td>Service A</td><td>$100</td></tr>
        </table>
        <script>
            console.log('PDF generated with IronPDF');
        </script>
    </body>
    </html>";

// Generate PDF from HTML string
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("professional-invoice.pdf");

// Convert from URL or HTML file
var urlPdf = renderer.RenderUrlAsPdf("https://ironpdf.com/");
var filePdf = renderer.RenderHtmlFileAsPdf("template.html");
Imports IronPdf

' Initialize renderer
Dim renderer As New ChromePdfRenderer()

' Configure rendering options
renderer.RenderingOptions.MarginTop = 10
renderer.RenderingOptions.MarginBottom = 10
renderer.RenderingOptions.EnableJavaScript = True

' HTML with advanced CSS and JavaScript
Dim html As String = "
    <html>
    <head>
        <style>
            body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
            .invoice-header {
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                color: white;
                padding: 20px;
                border-radius: 8px;
            }
            table { width: 100%; border-collapse: collapse; }
            th, td { padding: 10px; border-bottom: 1px solid #ddd; }
        </style>
    </head>
    <body>
        <div class='invoice-header'>
            <h1>Professional Invoice</h1>
        </div>
        <table>
            <tr><th>Item</th><th>Price</th></tr>
            <tr><td>Service A</td><td>$100</td></tr>
        </table>
        <script>
            console.log('PDF generated with IronPDF');
        </script>
    </body>
    </html>"

' Generate PDF from HTML string
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("professional-invoice.pdf")

' Convert from URL or HTML file
Dim urlPdf = renderer.RenderUrlAsPdf("https://ironpdf.com/")
Dim filePdf = renderer.RenderHtmlFileAsPdf("template.html")
$vbLabelText   $csharpLabel

IronPDF 的簡單性立刻脫穎而出。 沒有瀏覽器管理,沒有複雜的設置——只需實例化渲染器並開始轉化。 IronPDF 自動處理 JavaScript 執行、CSS 渲染和字型嵌入。 該程式庫還支持進階功能如 自定義頁眉和頁腳浮水印PDF 表單而無需額外配置。

您對 IronPDF 輸出質量有何期望?

IronPDF 生成的專業發票 PDF 顯示漸變頁眉、表格和像素完美的 CSS 渲染

IronPDF 的 API 驅動設計使 HTML 到 PDF 的轉換變得簡單直接。 這個程式庫內部處理所有的 PDF 生成的複雜性,從管理渲染引擎到處理 CSS 樣式和 JavaScript 的執行。 當從指定的 URL 進行轉換時,您還可以指定自定義頁眉。 程式庫為所有常見的轉換場景提供豐富的程式碼樣本。

輸出質量比肩桌面瀏覽器,支持網頁字體、SVG 圖形、回應佈局和針對列印的 CSS。 IronPDF 還確保在不同平台上的一致性結果,消除因依賴外部瀏覽器安裝的開源解決方案中常見的"在我機器上運行"的問題。

PDF 轉換能力有什麼主要差異?

PuppeteerSharp、wkhtmltopdf 和 IronPDF 之間的特徵比較,適用於 C# HTML 到 PDF 的轉換
功能 PuppeteerSharp wkhtmltopdf IronPDF
CSS3 支援 完整 有限 完整
JavaScript 渲染 基礎
安裝大小 ~150MB (Chromium) ~40MB ~20MB
外部依賴 Chromium 瀏覽器 Qt WebKit 否ne
API 複雜性 中等 簡單
PDF/A 支援
頁眉/頁腳 手動設置 內建
浮水印 手動 內建
表單建立
頁面操作 有限 完整
商業支持
活躍維護 否(2020年放棄)

除了基本的轉換之外,IronPDF 還提供廣泛的 PDF 操作能力,包括合併和拆分文件提取文字新增數位簽名將 PDF 轉換為圖片。 這些功能對於處理敏感文件或需要認證合規的企業應用是必不可少的。

這些程式庫如何處理複雜的 HTML 內容?

在轉換嵌入 CSS 和 JavaScript 的 HTML 字串時,程式庫之間的差異最明顯。 PuppeteerSharp 需要異步/等待模式和明確的瀏覽器管理來實現準確的 HTML 渲染:

// PuppeteerSharp -- complex setup for dynamic content
await page.WaitForSelectorAsync(".content");
await page.EvaluateFunctionAsync("() => window.scrollTo(0, document.body.scrollHeight)");
await page.WaitForTimeoutAsync(2000); // Wait for JavaScript completion
// PuppeteerSharp -- complex setup for dynamic content
await page.WaitForSelectorAsync(".content");
await page.EvaluateFunctionAsync("() => window.scrollTo(0, document.body.scrollHeight)");
await page.WaitForTimeoutAsync(2000); // Wait for JavaScript completion
Imports PuppeteerSharp

Await page.WaitForSelectorAsync(".content")
Await page.EvaluateFunctionAsync("() => window.scrollTo(0, document.body.scrollHeight)")
Await page.WaitForTimeoutAsync(2000) ' Wait for JavaScript completion
$vbLabelText   $csharpLabel

IronPDF 簡化了這一過程,透過智慧預設,完全去除猜測:

// IronPDF -- automatic handling of complex content
renderer.RenderingOptions.WaitFor.JavaScript();
var pdf = renderer.RenderHtmlAsPdf(complexHtml);
// IronPDF -- automatic handling of complex content
renderer.RenderingOptions.WaitFor.JavaScript();
var pdf = renderer.RenderHtmlAsPdf(complexHtml);
$vbLabelText   $csharpLabel

IronPDF 的 WaitFor 選項智能地檢測 JavaScript 執行完成,消除猜測,並減少不穩定的轉換。 該程式庫還處理複雜佈局,自定義字體及國際化,而無需額外配置。 對於更高級的轉換場景,IronPDF 提供細緻的 渲染選項自定義浮水印 控制。

從部署的角度看,PuppeteerSharp 需要 CI/CD 管道來提供 Chromium,處理可執行權限,並跨不同操作系統管理運行時路徑解析。 IronPDF 將所需的一切打包進入 NuGet 包,使部署體驗在所有環境中——從本地開發者機器到 Docker 容器和雲功能——都保持一致。 您可以查看 IronPDF 的完整功能列表 來了解包含哪些開箱即用的深度功能。

哪個解決方案適合您的 PDF 生成需求?

在選擇開源和商業 PDF 程式庫之間關鍵在於總擁有成本,而不是僅僅限制於授權費用。 對於具有基礎動態內容的簡單 PDF 生成任務,像 PuppeteerSharp 這樣的開源解決方案在短期內效果很好。 然而,它們帶來了隱藏成本:複雜的部署管道、隨著瀏覽器更新的持續維護負擔以及對現有 PDF 操作的有限功能。

開源程式庫亦缺乏商業支援。 當發生生產事故時——例如,Chromium 更新破壞了 PDF 渲染——您依賴於社區的時間表來修復。 對於受監管的行業或面向客戶的應用程式,這一風險通常是不可接受的。

當您需要以下內容時,IronPDF 表現出色:

  • 可在所有平台上提供一致結果的可靠 HTML 到 PDF 的轉換
  • 高級功能如 PDF/A 合規、數位簽章和表單建立
  • 大大減少開發時間的簡單 API
  • 生產環境的專業支援,具備保證的回應時間
  • 無配置麻煩的跨平台相容性
  • 為高容量文件生成場景的性能優化
  • 用於受監管行業如醫療和金融的安全功能

該程式庫提供免費試用版授權來評估所有功能,授權選項可從小型團隊擴展至企業部署。 您可以在 NuGet 包文件頁面找到詳細的安裝指導。

如何開始生成高質量 PDF 文件?

無論您選擇開源解決方案還是 IronPDF,這取決於您的具體需求,團隊規模和可接受的風險範圍。開源程式庫提供零授權費用,但需更多開發努力,並且在功能和支援質量上具有顯著的限制。

IronPDF 提供一個完整的解決方案,只需幾行程式碼即可將 HTML 內容轉換為專業的 PDF 文件。 對於構建發票系統、報告生成器或文件管理平台的團隊,減少開發和維護開銷通常在第一個專案里程碑內便可證明授權投資的合理性。

對於評估受監管環境的 PDF 解決方案的企業架構師,IronPDF 的合規功能、審計追踪能力和積極的安全修補使其特別適合醫療、金融和政府部門。 該程式庫保持與瀏覽器渲染標準同步發展的強大記錄,這意味著隨著網路標準的演進,PDF 輸出質量隨之提高而不是下降。

今天就可以開始,安裝 NuGet 包並立即開始轉換 HTML 為 PDF。 完整的 文件和 API 參考可在線獲取,並提供涵蓋場景的教程,從 HTML 字串轉換PDF 浮水印合併和拆分 PDF提取文字新增數位簽章的詳細指導也在 IronPDF 文件站點上提供。

對於有關哪些授權等級適合其部署模式的團隊問題,授權頁面按開發者數量、部署型別和 SaaS 使用權分解選項。 先從 免費試用開始,以在提交計劃前評估所有功能。 試用版包括所有 PDF 生成、操作和合規功能的完整存取,讓您對生產使用情況有一個實際的了解。

開源程式庫在 .NET 生態系統中扮演重要角色,但對於需求可靠性、安全性和完整功能集的生產 PDF 生成工作負載,IronPDF 是大多數開發團隊更實用和可擴展的選擇。

常見問題

using IronPDF 優於開源 HTML 到 PDF 程式庫的好處有哪些?

IronPDF 提供強大的 PDF 生成能力,包括高品質渲染、高級自訂選項和全面支持,這使其比開源替代方案更適合大規模的 .NET 專案。

IronPDF 如何增強 .NET 專案中的 PDF 生成?

IronPDF 與 .NET 無縫整合,提供精確的 HTML 渲染、現代 CSS 支援、JavaScript 執行能力,以及有效生成複雜網頁的 PDF。

為什麼 HTML 到 PDF 的轉換在 .NET 應用中很重要?

在 .NET 應用中,HTML 到 PDF的轉換對於建立可下載的報告、發票和保存網頁內容至關重要,確保資訊在不同平台和裝置中一致地呈現。

IronPDF 能否在轉換過程中處理複雜的網頁元素?

是的,IronPDF 可以準確地將複雜的網頁元素,包括 JavaScript、CSS 和多媒體內容,轉換成高品質的 PDF 文件。

IronPDF 是否適合大規模 PDF 生成?

IronPDF 是為了可擴展性而設計,提供性能優化和高效的資源管理,使其適合在企業級 .NET 專案中進行大規模的 PDF 生成。

IronPDF 在 PDF 生成方面提供了哪些自訂選項?

IronPDF 提供廣泛的自訂選項,如設定頁面大小、邊距、頁眉、頁腳和應用水印,讓開發者可以根據特定專案需求定制 PDF。

IronPDF 是否支持現代 Web 技術來渲染 PDF?

IronPDF 完全支持現代 Web 技術,包括 HTML5、CSS3 和 JavaScript,以確保 PDF 格式中準確渲染網頁內容。

IronPDF 如何確保高品質的 PDF 輸出?

IronPDF 使用先進的渲染引擎和演算法來確保輸出的 PDF 維持高品質,包含清晰的文字、清晰的圖像和精確的佈局。

有哪些支援選項可供 IronPDF 使用者使用?

IronPDF 使用者可以存取全面的支持資源,包括詳細的文件、教程和客戶支持,以協助實施和故障排除。

在商業專案中使用 IronPDF 是否有任何授權要求?

是的,IronPDF 需要商業授權,以便在專有專案中使用,為企業提供法律保障和專屬支持。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話