跳過到頁腳內容
產品比較

How to Convert HTML to PDF in C# for .NET 10 Using IronPDF

一切的起源:C# PDF 函式庫問題

IronPDF

早在 2016 年,我們 Iron Software 的顧問團隊就深陷HTML 轉 PDF 轉換的惡夢之中。 我們受聘為財富 500 強客戶實現文件生成現代化,但我們嘗試的每一個庫都像是一場即將發生的災難。 每個"解決方案"起初看起來都很有希望,但一旦遇到現實世界的複雜性——動態內容、CSS3 佈局、大量使用 JavaScript 的頁面——這些庫要么默默地失敗,要么徹底崩潰。

Jeff Fritz 在最近的 .NET 大會上對此做了完美的總結:

".NET 中的 PDF 生成領域充斥著大量廢棄項目和半成品解決方案。"

他沒有誇張。 我們對此深有體會,因為我們測試過市面上幾乎所有的庫,從維護不善的庫到擁有華麗企業銷售簡報的庫。 經過數月的反覆試驗、不斷失敗和令人抓狂的挫敗感,我們痛苦地意識到:現有的解決方案根本無法滿足現代需求。

這就是IronPDF的故事開始的地方——它誕生於無奈,源自於我們嘗試過的所有其他替代方案的失敗。

為什麼現有解決方案對我們無效(而且至今仍然無效)

坦白說:我們開發 IronPDF 是因為其他所有軟體都有問題,即使八年過去了,大多數軟體仍然有問題。 失敗的原因並不總是技術性的; 它們有的合法,有的符合建築規範,有的則純粹是瘋狂之舉。

以下是我們諮詢工作中遇到的情況,以及實際的程式碼,這些程式碼說明了為什麼這些"解決方案"促使我們建立更好的東西。

C# PDF 庫的誘餌和轉換騙局

讓我們先來看看那些在開發者圍繞它們構建了整個應用程式之後更改了許可證的庫:

iTextSharp-一個名不副實的"免費"函式庫

早在 2009 年,iTextSharp 就被宣傳為一個免費開源的 PDF 函式庫。 當時,該軟體以 LGPL 授權發布,這對開發者來說似乎是一個合理的選擇。 然而,到 2012 年,授權條款改為 AGPL。 根據 AGPL 協議,開發者面臨一個艱難的選擇:要么開源整個應用程序,要么付費購買商業許可證。

快進到 2025 年,商業 iText 許可證可能要花費數千美元——通常每個伺服器大約 2500 美元。 這就造成了許多開發者所說的"AGPL陷阱":使用iTextSharp,要麼發布完整的原始碼,要麼支付一大筆許可費。

除了授權問題之外,iText 本身並沒有提供 HTML 到 PDF 的原生轉換功能。 沒有簡單的 RenderHtml(html) 方法。 相反,開發人員必須依賴 XMLWorker 或 pdfHTML 外掛程式等其他元件,而這些元件會帶來自身的依賴項和進一步的授權複雜性。

由於許可限制和缺少內建的 HTML 轉 PDF 支持,許多團隊如今都避免使用 iTextSharp。

iTextSharp並非孤例。 QuestPDF 是另一個陷阱:它在網路上被大力宣傳為"最好的 C# PDF 庫",但它根本不支援 HTML 轉 PDF。 開發人員花了數天時間試圖將其強行整合到它原本並非為之設計的流程中。

QuestPDF-一個出乎你意料的PDF庫

QuestPDF 經常在網路上,尤其是在 Reddit 社群中被推廣為 C# 最好的 PDF 庫之一。 然而,有一個不總是顯而易見的重要限制:QuestPDF 完全不支援 HTML 轉 PDF。

QuestPDF 不會渲染 HTML,而是要求開發人員使用其流暢的 API 以程式設計方式建立文件。 例如,您可以直接在 C# 程式碼中定義頁面、容器和文字區塊。 雖然在某些使用場景下功能強大,但感覺更像是手動佈局文件——幾乎就像"費力地"建立 PDF,而不是簡單地轉換現有的 HTML。

許可證是另一個需要考慮的因素。 所謂的"社群許可證"是 AGPL,它強制你要麼將整個專案開源,要麼購買商業許可證。 商業定價大致在 699 美元到 7,999 美元之間,對於一個不包含 HTML 到 PDF 渲染功能的庫來說,這個價格可能顯得很高。

由於這些限制,QuestPDF 可能不是那些在 .NET 中尋求簡單可靠的 HTML 到 PDF 轉換的開發人員的理想解決方案。

wkhtmltopdf 災難(2016-2024)

在生產環境中使用WkHtmlToPdf非常麻煩。 它的所有包裝似乎都遵循著同樣的令人沮喪的模式:

  1. 將一個神秘的二進位檔案複製到伺服器上。
  2. 希望已安裝正確的本機相依性。
  3. 觀察它在生產環境中發生不可預測的崩潰。

即使有了外包裝,可靠性也遠遠不能保證。 開發人員經常遇到以下錯誤:

  • "無法載入 DLL 'wkhtmltox'"
  • "位址 0x00000000 處發生存取衝突"
  • "應用程式已停止運作"
  • "Qt:無法初始化 OLE(錯誤 80010106)"

這些故障通常需要人工幹預。 在某些情況下,團隊甚至必須重新啟動應用程式集區才能使進程再次運行——這是一種脆弱且不可持續的解決方案。

這種不穩定性,再加上繁瑣的部署過程,使得 WkHtmlToPdf 對於嚴肅的生產工作負載來說是一個冒險的選擇。

2024年,wkhtmltopdf 最終被棄用。 所有基於它構建的 C# PDF 庫都立即產生了技術債:

  • TuesPechkin - 最後更新於 2015 年,多執行緒說法純屬虛構 Rotativa-僅支援MVC架構,2025年仍在發布已失效的二進位文件
  • DinkToPdf——一個號稱"相容.NET Core"但實際上並非如此的分支
  • Haukcode.DinkToPdf - 已失效變體的變體
  • NReco.PdfGenerator - 為廢棄軟體打包收費 150 美元以上
  • OpenHtmlToPdf-名稱暗示它與其他函數不同,但實際上並非如此。

使用 wkhtmltopdf 包裝器將 HTML 轉換為 PDF 的 C# 開發人員必須不斷管理檔案權限、相對 URL 和二進位依賴項。 為整個網頁產生 PDF 文件不穩定,HTML 元素內的分頁符號也無法預測。

"只要使用Chrome瀏覽器"的惡夢

然後,瀏覽器自動化技術也出現了。 "直接用 Puppeteer 就行了!"他們說。 儘管 PuppeteerSharp 和 Playwright 在技術上可以產生 PDF,但它們並不是真正的 C# PDF 函式庫。 它們需要龐大的瀏覽器二進位、複雜的部署,並且缺乏 PDF/A 或 PDF/UA 等合規功能。

實際情況是這樣的:

// PuppeteerSharp - The "Simple" Solution That Wasn't
public class PuppeteerNightmare
{
    private Browser _browser;

    public async Task Initialize()
    {
        // Step 1: Download 300MB of Chrome
        await new BrowserFetcher().DownloadAsync();
        // Customer: "Why is your app 300MB?"
        // Us: "Uh... for PDFs?"

        // Step 2: Launch Chrome with magic arguments nobody understands
        _browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true,
            Args = new[] 
            { 
                "--no-sandbox",
                "--disable-setuid-sandbox",
                "--disable-dev-shm-usage",
                "--disable-gpu",
                "--no-first-run",
                "--no-zygote",
                "--single-process"
            }
        });
    }

    public async Task<byte[]> GeneratePdf(string html)
    {
        // This works great until:
        // 1. Chrome auto-updates and breaks your args
        // 2. You need to generate 100 PDFs simultaneously
        // 3. You deploy to Azure Functions (spoiler: it won't work)
        // 4. A memory leak eats 5GB of RAM

        var page = await _browser.NewPageAsync();
        await page.SetContentAsync(html);

        // Wait for... something? Nobody knows the right value
        await Task.Delay(1000); 

        return await page.PdfDataAsync();
    }
}
// PuppeteerSharp - The "Simple" Solution That Wasn't
public class PuppeteerNightmare
{
    private Browser _browser;

    public async Task Initialize()
    {
        // Step 1: Download 300MB of Chrome
        await new BrowserFetcher().DownloadAsync();
        // Customer: "Why is your app 300MB?"
        // Us: "Uh... for PDFs?"

        // Step 2: Launch Chrome with magic arguments nobody understands
        _browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true,
            Args = new[] 
            { 
                "--no-sandbox",
                "--disable-setuid-sandbox",
                "--disable-dev-shm-usage",
                "--disable-gpu",
                "--no-first-run",
                "--no-zygote",
                "--single-process"
            }
        });
    }

    public async Task<byte[]> GeneratePdf(string html)
    {
        // This works great until:
        // 1. Chrome auto-updates and breaks your args
        // 2. You need to generate 100 PDFs simultaneously
        // 3. You deploy to Azure Functions (spoiler: it won't work)
        // 4. A memory leak eats 5GB of RAM

        var page = await _browser.NewPageAsync();
        await page.SetContentAsync(html);

        // Wait for... something? Nobody knows the right value
        await Task.Delay(1000); 

        return await page.PdfDataAsync();
    }
}
Imports PuppeteerSharp

Public Class PuppeteerNightmare
    Private _browser As Browser

    Public Async Function Initialize() As Task
        ' Step 1: Download 300MB of Chrome
        Await (New BrowserFetcher()).DownloadAsync()
        ' Customer: "Why is your app 300MB?"
        ' Us: "Uh... for PDFs?"

        ' Step 2: Launch Chrome with magic arguments nobody understands
        _browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {
            .Headless = True,
            .Args = {
                "--no-sandbox",
                "--disable-setuid-sandbox",
                "--disable-dev-shm-usage",
                "--disable-gpu",
                "--no-first-run",
                "--no-zygote",
                "--single-process"
            }
        })
    End Function

    Public Async Function GeneratePdf(html As String) As Task(Of Byte())
        ' This works great until:
        ' 1. Chrome auto-updates and breaks your args
        ' 2. You need to generate 100 PDFs simultaneously
        ' 3. You deploy to Azure Functions (spoiler: it won't work)
        ' 4. A memory leak eats 5GB of RAM

        Dim page = Await _browser.NewPageAsync()
        Await page.SetContentAsync(html)

        ' Wait for... something? Nobody knows the right value
        Await Task.Delay(1000)

        Return Await page.PdfDataAsync()
    End Function
End Class
$vbLabelText   $csharpLabel

除了對 Chrome 的嚴重依賴之外,開發人員還面臨著動態內容、CSS 支援以及 HTML 到 PDF 轉換的列印 CSS 方面的挑戰。 以這種方式自動產生網頁通常會導致分頁符號錯誤、記憶體佔用過大以及 PDF 頁面大小無法預測。

那些不值得使用的商業 C# PDF 庫

我們評估了所有商業化的 C# HTML 轉 PDF 庫。 從理論上講,這些圖書館看起來很有前景,但實際上,它們都存在一些隱藏成本、限製或過時的技術。 以下是500到5000美元通常能買到的東西:

GemBox.Document – 段落計數器

GemBox.Document 宣稱免費,但僅限最多 20 個段落。問題在於,每個表格單元格也算一個段落。 所以,即使你創建像 5×5 表格這樣簡單的內容,也已經佔了 25 段——而且你還需要支付許可證費用。

GemBox.Document 的完整版本售價約為 680 美元,而這只是基本的 HTML 轉 PDF 功能。 由於免費版功能限制嚴格,而完整版許可證價格昂貴,因此使用該庫擴展項目很快就會變得困難。

SelectPdf— "跨平台"的謊言

SelectPdf 通常被宣傳為跨平台的 HTML 轉 PDF 解決方案,但實際上它只能在 Windows 系統上運行。 購買許可證(起價 499 美元)的開發者很快就會發現,該程式庫與 Linux 或 macOS 不相容。

免費版本也受到許多限制。 它最多只能產生五頁; 從第六頁開始,輸出內容上會印上一個大大的"購買許可證"浮水印。

對於期望獲得真正的跨平台支援或希望在不立即遇到付費牆的情況下測試庫的開發人員來說,這些限制使得 SelectPdf 成為一個有風險的選擇。

EO.Pdf – 遺留問題

EO.Pdf 的售價高達 799 美元,而這個圖書館多年來承載著大量的歷史包袱。 最初,它使用 Internet Explorer 作為渲染引擎。最近,它改用 Chrome,但這導致其佔用 126 MB 的儲存空間。 儘管聲稱支援跨平台,但 EO.Pdf 仍然主要以 Windows 為中心。

從技術上講,HtmlToPdf.ConvertHtml(html, pdfStream) 方法可行,但考慮到成本和限制,EO.Pdf 不被認為是處理現代 HTML 功能的經濟有效的解決方案。

HiQPdf – 三頁奇蹟

HiQPdf 宣稱自己有免費版本,但其實功能相當有限:你最多只能產生三頁。 一旦翻到第四頁,文件上就會出現一個很大的浮水印。

如果你想解除限制,你需要購買商業許可證,起價約為 595 美元。

實際上,這使得免費版本僅適用於非常小的文件。 任何更大的頁面都會很快達到頁面限制,迫使開發者進行付費升級。

Spire.PDF – 當圖片並非真正的 PDF 檔案時

Spire.PDF 宣稱可以進行 HTML 轉 PDF 轉換,但實際上它通常只是透過截圖來"轉換"HTML。 結果會產生一個很大的 PDF 檔案(有時高達 10MB),其中的文字不可選。 使用者經常問:"為什麼我不能搜尋 PDF 文件?"答案很簡單:因為它實際上只是嵌入在 PDF 文件中的圖像,而不是真正的文字。

LoadFromHTML 方法接受幾個布林參數,但它們的用途尚不明確,官方文件也鮮有提供指導。 很多情況下,獲得明確資訊的唯一途徑是聯繫銷售部門。

這種方法使得 Spire.PDF 對於任何需要可搜尋、可複製或結構良好的 PDF 的使用者來說都存在問題。

ABCpdf-許可迷宮

ABCpdf 宣稱提供"免費許可",但實際上必須註冊,有時間限制,並且會添加浮水印。 完整版依賴 Gecko 引擎(Firefox 的舊版)或 Trident(Internet Explorer)。 令人驚訝的是,即使到了 2025 年,Internet Explorer 仍然被列為渲染選項之一。

使用 ABCpdf 時,新增 HTML 內容意味著您只能使用這些較舊的渲染引擎。 例如,呼叫 AddImageHtml(html) 將根據您的選擇,使用 IE 或過時的 Firefox 引擎進行渲染。

ExpertPdf-高價專家

ExpertPdf 的價格不菲,從 550 美元到 1200 美元不等。那麼,花這麼多錢你能得到什麼呢?本質上只是一個舊版 Chrome 瀏覽器的封裝程序,以及自 2018 年以來就未更新過的文件。

Winnovative-創新在2016年停止

Winnovative 的 HTML 轉 PDF 轉換器仍然基於 2016 年的 WebKit 引擎。儘管名稱如此,但該程式庫並沒有跟上現代 Web 標準。 這些技術可以追溯到歐巴馬擔任總統時期,定價從 750 美元到 1600 美元不等。

該轉換器不支援 CSS Grid 或現代 JavaScript 功能。 雖然它可以產生 PDF 文件,但與當前的 HTML 轉 PDF 解決方案相比,它顯然已經過時了。

PDFmyURL——甚至不算是圖書館

PDFmyURL 不是一個真正的 C# 函式庫; 它本質上只是一個 API 封裝器。 使用這項服務,您需要付費讓別人的伺服器處理您的文檔,如果您的文檔包含敏感訊息,這可能會令人擔憂。最低費用為每月 39 美元。

從功能上講,在 C# 中使用 PDFmyURL 意味著向其 Web 服務發出 HTTP 請求——您不是在使用本機程式庫。 例如,您向他們的 API 端點發送一個 URL,並收到一個 PDF 作為回應。 雖然它可以產生 PDF,但它不是一個獨立的 C# PDF 庫,而是一個需要網路存取的 Web 服務。

GrabzIt – 螢幕截圖,而非 PDF

GrabzIt 最初是為截取網站螢幕截圖而設計的。 PDF生成與其說是核心功能,不如說是事後增加的功能。 該服務按捕獲次數收費,並且不提供真正的 C# HTML 轉 PDF 解決方案。

PDF Duo .NET – 神秘圖書館

PDF Duo .NET 聲稱無需任何額外的 DLL 檔案即可運行。 實際上,它在開發者社群中鮮為人知,也幾乎無人使用。 文件幾乎不存在,支援論壇也只有寥寥幾個帖子,全部可以追溯到 2019 年。

即使這些庫在技術上能夠正常運行,它們也帶來了實際的限制:

  • 大多數免費版本都有許多限制(頁面數量限制、浮水印、功能受限)。
  • 授權協議往往隱藏額外費用或限制性條款。
  • 瀏覽器引擎已過時(IE、舊版 Chrome、WebKit 2016),無法相容於現代 HTML/CSS。
  • 跨平台支援要麼具有誤導性,要麼不完整。 大規模部署需要變通方法和額外的調試。

簡而言之,商業庫通常在紙面上看起來很有吸引力,但在生產中會產生技術債務,迫使團隊要么花費大量資金,要么最終轉向像 IronPDF 這樣"開箱即用"的庫。

那些看似"免費"的 C# PDF 解決方案,其實代價高昂

有時候,"免費"並非真的免費。 許多 C# 開源或"試用版"PDF 庫都存在隱藏成本——無論是開發人員時間的損失、不完整的 HTML 到 PDF 支持,還是微妙的許可陷阱。 你可能以為自己省錢了,但實際上卻是要花幾個月的時間進行調試和尋找變通方法。

HtmlRenderer.PdfSharp – 歡迎來到 2005 年

HtmlRenderer.PdfSharp 只支持非常古老的 CSS——基本上就是喬治·W·布希執政時期存在的 CSS。 布希是總統。 不支援 flexbox、網格佈局或 border-radius 等現代 CSS 特性。 任何使用它們的嘗試都會失敗。

要佈局內容,您必須依賴傳統的基於表格的佈局,類似於 1999 年網頁的建構方式。現代 HTML 框架或函式庫(例如 Bootstrap)將無法使用,並且完全不支援 JavaScript。

如果嘗試渲染現代 HTML,則該庫可能會崩潰或產生不正確的結果,因此不適合現代網頁到 PDF 的轉換需求。

PdfSharp-一個讓所有人都感到困惑的函式庫

PdfSharp 是一個功能強大的函式庫,可用於以程式設計方式建立 PDF 檔案。 但是它並不能將HTML 轉換為 PDF。 如果您需要HTML轉PDF功能,則需要使用像HtmlRenderer.PdfSharp這樣的額外函式庫。問題在於HtmlRenderer.PdfSharp自2019年以來就沒有更新過,因此它可能已經過時或不穩定。

使用 PdfSharp,您主要需要手動繪製形狀、文字和圖形。 例如,您可以建立一個新的 PDF 文檔,新增頁面,並在頁面上繪製字串或形狀,但這與將 HTML 內容渲染成 PDF 非常不同。

HTMLDOC-來自網路泡沫時代

HTMLDOC 採用 GPL 許可,這使得它在許可方面具有"病毒式傳播"的特性。 圖書館上一次進行有意義的更新是在 2001 年,因此它已經跟不上現代標準了。 它無法正確處理 CSS,而且只能透過命令列運行。文件甚至還在引用 Netscape。

要產生 PDF,您可以執行類似 htmldoc --webpage -f output.pdf input.html 的命令。 換句話說,如今使用 HTMLDOC 很大程度上是上世紀 90 年代末期的產物。

雖然這些"免費"庫在小型專案中進行 HTML 轉 PDF 轉換時可能看起來很有吸引力,但它們在處理以下情況時往往會失敗:

*完整的網頁內容:動態 HTML 頁面、現代 CSS、JavaScript 程式碼片段。

  • PDF 相容性:不支援 PDF/A、PDF/UA 或輔助功能。 *檔案權限和表單欄位:*受限或不存在。 跨平台部署:**有些程式只能在 Windows 上執行,或依賴 Internet Explorer 引擎。

嘗試使用這些工具渲染整個網頁通常會導致 HTML 內容不完整、佈局損壞,或者產生的 PDF 本質上只是螢幕截圖,而不是可搜尋的結構化文件。 開發者很快就會意識到,"免費"背後隱藏著許多代價,例如浪費大量時間進行調試、手動變通以及輸出結果不一致——而這一切僅僅是因為一個本應讓他們的工作更輕鬆的庫。

IronPDF 專門用於解決這些問題,它提供了強大的方法,可以從 HTML 文件、字串或動態 Web 內容生成 PDF 文檔,並具有適當的 CSS 支援、分頁符處理以及與 .NET 應用程式的無縫整合。

Bootstrap 與現代 CSS 框架的兼容性

選擇 HTML 轉 PDF 函式庫時,一個關鍵的考慮因素是它是否支援 Bootstrap 和現代 CSS 框架。 許多 Web 應用程式都依賴 Bootstrap 進行響應式設計,而能夠將這些介面轉換為 PDF 而不進行修改,對於產生與 Web 應用程式外觀相符的報告、發票和文件至關重要。

IronPDF:全面支持現代框架

Bootstrap 5:完整的 Flexbox 佈局系統、CSS Grid、實用類別和所有元件庫

  • Bootstrap 4:完整的卡片系統、導航、彈性實用程式和響應式斷點
  • Tailwind CSS:所有實用優先的類別都能準確渲染。 *基礎:*完整的網格系統和組件支持 現代 CSS3:** Flexbox、CSS Grid、自訂屬性、動畫、轉換、變換和過濾器

實際驗證:IronPDF 能夠以像素級的保真度成功渲染Bootstrap 主頁和所有官方範例

程式碼範例:功能比較展示

using IronPdf;

// Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here";

var renderer = new ChromePdfRenderer();
string bootstrapShowcase = @"
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .feature-icon {
            width: 64px;
            height: 64px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 2rem;
            border-radius: 12px;
        }
        .comparison-badge { font-size: 0.875rem; font-weight: 600; }
    </style>
</head>
<body>
    <div class='container my-5'>
        <div class='text-center mb-5'>
            <h1>HTML to PDF Conversion Features</h1>
            <p class='lead text-muted'>Comprehensive feature comparison across rendering engines</p>
        </div>

        <div class='row g-4 mb-5'>
            <div class='col-md-4'>
                <div class='card h-100 border-primary border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-primary text-white mx-auto mb-3'>🚀</div>
                        <h4>Chromium Engine</h4>
                        <p class='text-muted mb-3'>Modern browser-grade rendering</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-success'>✓ Full CSS3 Support</span>
                            <span class='comparison-badge badge bg-success'>✓ JavaScript Execution</span>
                            <span class='comparison-badge badge bg-success'>✓ Bootstrap 5 Ready</span>
                            <span class='comparison-badge badge bg-success'>✓ Modern Standards</span>
                        </div>
                    </div>
                    <div class='card-footer bg-primary text-white text-center'>
                        <strong>IronPDF, Puppeteer Sharp</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-warning border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-warning text-dark mx-auto mb-3'>⚙️</div>
                        <h4>Custom Engines</h4>
                        <p class='text-muted mb-3'>Proprietary rendering implementations</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-warning text-dark'>~ 90% CSS3</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Limited JavaScript</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Partial Flexbox</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Testing Required</span>
                        </div>
                    </div>
                    <div class='card-footer bg-warning text-dark text-center'>
                        <strong>EvoPDF, Aspose, Spire, iText7</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-danger border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-danger text-white mx-auto mb-3'>⏳</div>
                        <h4>WebKit Legacy</h4>
                        <p class='text-muted mb-3'>Outdated rendering technology</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-danger'>✗ No Flexbox</span>
                            <span class='comparison-badge badge bg-danger'>✗ Limited CSS3</span>
                            <span class='comparison-badge badge bg-danger'>✗ Bootstrap 3 Max</span>
                            <span class='comparison-badge badge bg-danger'>✗ Security Issues</span>
                        </div>
                    </div>
                    <div class='card-footer bg-danger text-white text-center'>
                        <strong>WkHtmlToPdf, NReco, DinkToPdf</strong>
                    </div>
                </div>
            </div>
        </div>

        <div class='card shadow-sm mb-4'>
            <div class='card-header bg-white'>
                <h4>Detailed Feature Matrix</h4>
            </div>
            <div class='card-body p-0'>
                <div class='table-responsive'>
                    <table class='table table-striped mb-0'>
                        <thead class='table-dark'>
                            <tr>
                                <th style='width: 30%'>Feature</th>
                                <th class='text-center'>Chromium</th>
                                <th class='text-center'>Custom</th>
                                <th class='text-center'>WebKit</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td><strong>HTML5 Elements</strong></td>
                                <td class='text-center'><span class='badge bg-success'>100%</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>85-95%</span></td>
                                <td class='text-center'><span class='badge bg-danger'>60-70%</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS3 Flexbox</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Partial</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS Grid Layout</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Limited</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>JavaScript Execution</strong></td>
                                <td class='text-center'><span class='badge bg-success'>V8 Engine</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Basic</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Minimal</span></td>
                            </tr>
                            <tr>
                                <td><strong>Bootstrap 5 Support</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Perfect</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Needs Testing</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Not Supported</span></td>
                            </tr>
                            <tr>
                                <td><strong>Custom Fonts (Web Fonts)</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Variable</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Limited</span></td>
                            </tr>
                            <tr>
                                <td><strong>Modern Animations</strong></td>
                                <td class='text-center'><span class='badge bg-success'>CSS3 + JS</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>CSS3 Only</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Basic CSS</span></td>
                            </tr>
                            <tr>
                                <td><strong>Security Updates</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-danger'>2016 (EOL)</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>

        <div class='row g-4'>
            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-success text-white'>
                        <h5>✓ Chromium Advantages</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Browser-Accurate:</strong> Renders exactly as Chrome/Edge displays web content</li>
                            <li class='mb-2'><strong>Modern Standards:</strong> Full HTML5, CSS3, and ES6+ JavaScript support</li>
                            <li class='mb-2'><strong>Framework Ready:</strong> Bootstrap, Tailwind, Foundation work perfectly</li>
                            <li class='mb-2'><strong>Active Updates:</strong> Regular security patches and feature improvements</li>
                            <li class='mb-0'><strong>Developer Experience:</strong> Design in browser, convert to PDF with confidence</li>
                        </ul>
                    </div>
                </div>
            </div>

            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-danger text-white'>
                        <h5>✗ Legacy Engine Issues</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Rendering Gaps:</strong> Modern CSS features don't work or require workarounds</li>
                            <li class='mb-2'><strong>Maintenance Burden:</strong> Parallel CSS for web vs PDF increases complexity</li>
                            <li class='mb-2'><strong>Limited Frameworks:</strong> Bootstrap 4/5 and modern frameworks not supported</li>
                            <li class='mb-2'><strong>Security Risks:</strong> WebKit-based engines haven't received updates since 2016</li>
                            <li class='mb-0'><strong>Development Friction:</strong> Extensive testing required for each layout</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>

        <div class='alert alert-info mt-4 d-flex align-items-start'>
            <div class='me-3 fs-3'>💡</div>
            <div>
                <h5>Recommendation</h5>
                <p class='mb-0'>Choose Chromium-based engines (IronPDF) for production applications requiring modern web standards. Legacy engines force compromises in design and increase maintenance costs, while custom engines require extensive testing for framework compatibility.</p>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapShowcase);
pdf.SaveAs("feature-showcase.pdf");
using IronPdf;

// Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here";

var renderer = new ChromePdfRenderer();
string bootstrapShowcase = @"
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .feature-icon {
            width: 64px;
            height: 64px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 2rem;
            border-radius: 12px;
        }
        .comparison-badge { font-size: 0.875rem; font-weight: 600; }
    </style>
</head>
<body>
    <div class='container my-5'>
        <div class='text-center mb-5'>
            <h1>HTML to PDF Conversion Features</h1>
            <p class='lead text-muted'>Comprehensive feature comparison across rendering engines</p>
        </div>

        <div class='row g-4 mb-5'>
            <div class='col-md-4'>
                <div class='card h-100 border-primary border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-primary text-white mx-auto mb-3'>🚀</div>
                        <h4>Chromium Engine</h4>
                        <p class='text-muted mb-3'>Modern browser-grade rendering</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-success'>✓ Full CSS3 Support</span>
                            <span class='comparison-badge badge bg-success'>✓ JavaScript Execution</span>
                            <span class='comparison-badge badge bg-success'>✓ Bootstrap 5 Ready</span>
                            <span class='comparison-badge badge bg-success'>✓ Modern Standards</span>
                        </div>
                    </div>
                    <div class='card-footer bg-primary text-white text-center'>
                        <strong>IronPDF, Puppeteer Sharp</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-warning border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-warning text-dark mx-auto mb-3'>⚙️</div>
                        <h4>Custom Engines</h4>
                        <p class='text-muted mb-3'>Proprietary rendering implementations</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-warning text-dark'>~ 90% CSS3</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Limited JavaScript</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Partial Flexbox</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Testing Required</span>
                        </div>
                    </div>
                    <div class='card-footer bg-warning text-dark text-center'>
                        <strong>EvoPDF, Aspose, Spire, iText7</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-danger border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-danger text-white mx-auto mb-3'>⏳</div>
                        <h4>WebKit Legacy</h4>
                        <p class='text-muted mb-3'>Outdated rendering technology</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-danger'>✗ No Flexbox</span>
                            <span class='comparison-badge badge bg-danger'>✗ Limited CSS3</span>
                            <span class='comparison-badge badge bg-danger'>✗ Bootstrap 3 Max</span>
                            <span class='comparison-badge badge bg-danger'>✗ Security Issues</span>
                        </div>
                    </div>
                    <div class='card-footer bg-danger text-white text-center'>
                        <strong>WkHtmlToPdf, NReco, DinkToPdf</strong>
                    </div>
                </div>
            </div>
        </div>

        <div class='card shadow-sm mb-4'>
            <div class='card-header bg-white'>
                <h4>Detailed Feature Matrix</h4>
            </div>
            <div class='card-body p-0'>
                <div class='table-responsive'>
                    <table class='table table-striped mb-0'>
                        <thead class='table-dark'>
                            <tr>
                                <th style='width: 30%'>Feature</th>
                                <th class='text-center'>Chromium</th>
                                <th class='text-center'>Custom</th>
                                <th class='text-center'>WebKit</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td><strong>HTML5 Elements</strong></td>
                                <td class='text-center'><span class='badge bg-success'>100%</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>85-95%</span></td>
                                <td class='text-center'><span class='badge bg-danger'>60-70%</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS3 Flexbox</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Partial</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS Grid Layout</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Limited</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>JavaScript Execution</strong></td>
                                <td class='text-center'><span class='badge bg-success'>V8 Engine</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Basic</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Minimal</span></td>
                            </tr>
                            <tr>
                                <td><strong>Bootstrap 5 Support</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Perfect</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Needs Testing</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Not Supported</span></td>
                            </tr>
                            <tr>
                                <td><strong>Custom Fonts (Web Fonts)</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Variable</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Limited</span></td>
                            </tr>
                            <tr>
                                <td><strong>Modern Animations</strong></td>
                                <td class='text-center'><span class='badge bg-success'>CSS3 + JS</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>CSS3 Only</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Basic CSS</span></td>
                            </tr>
                            <tr>
                                <td><strong>Security Updates</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-danger'>2016 (EOL)</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>

        <div class='row g-4'>
            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-success text-white'>
                        <h5>✓ Chromium Advantages</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Browser-Accurate:</strong> Renders exactly as Chrome/Edge displays web content</li>
                            <li class='mb-2'><strong>Modern Standards:</strong> Full HTML5, CSS3, and ES6+ JavaScript support</li>
                            <li class='mb-2'><strong>Framework Ready:</strong> Bootstrap, Tailwind, Foundation work perfectly</li>
                            <li class='mb-2'><strong>Active Updates:</strong> Regular security patches and feature improvements</li>
                            <li class='mb-0'><strong>Developer Experience:</strong> Design in browser, convert to PDF with confidence</li>
                        </ul>
                    </div>
                </div>
            </div>

            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-danger text-white'>
                        <h5>✗ Legacy Engine Issues</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Rendering Gaps:</strong> Modern CSS features don't work or require workarounds</li>
                            <li class='mb-2'><strong>Maintenance Burden:</strong> Parallel CSS for web vs PDF increases complexity</li>
                            <li class='mb-2'><strong>Limited Frameworks:</strong> Bootstrap 4/5 and modern frameworks not supported</li>
                            <li class='mb-2'><strong>Security Risks:</strong> WebKit-based engines haven't received updates since 2016</li>
                            <li class='mb-0'><strong>Development Friction:</strong> Extensive testing required for each layout</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>

        <div class='alert alert-info mt-4 d-flex align-items-start'>
            <div class='me-3 fs-3'>💡</div>
            <div>
                <h5>Recommendation</h5>
                <p class='mb-0'>Choose Chromium-based engines (IronPDF) for production applications requiring modern web standards. Legacy engines force compromises in design and increase maintenance costs, while custom engines require extensive testing for framework compatibility.</p>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapShowcase);
pdf.SaveAs("feature-showcase.pdf");
Imports IronPdf

' Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here"

Dim renderer As New ChromePdfRenderer()
Dim bootstrapShowcase As String = "
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .feature-icon {
            width: 64px;
            height: 64px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 2rem;
            border-radius: 12px;
        }
        .comparison-badge { font-size: 0.875rem; font-weight: 600; }
    </style>
</head>
<body>
    <div class='container my-5'>
        <div class='text-center mb-5'>
            <h1>HTML to PDF Conversion Features</h1>
            <p class='lead text-muted'>Comprehensive feature comparison across rendering engines</p>
        </div>

        <div class='row g-4 mb-5'>
            <div class='col-md-4'>
                <div class='card h-100 border-primary border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-primary text-white mx-auto mb-3'>🚀</div>
                        <h4>Chromium Engine</h4>
                        <p class='text-muted mb-3'>Modern browser-grade rendering</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-success'>✓ Full CSS3 Support</span>
                            <span class='comparison-badge badge bg-success'>✓ JavaScript Execution</span>
                            <span class='comparison-badge badge bg-success'>✓ Bootstrap 5 Ready</span>
                            <span class='comparison-badge badge bg-success'>✓ Modern Standards</span>
                        </div>
                    </div>
                    <div class='card-footer bg-primary text-white text-center'>
                        <strong>IronPDF, Puppeteer Sharp</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-warning border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-warning text-dark mx-auto mb-3'>⚙️</div>
                        <h4>Custom Engines</h4>
                        <p class='text-muted mb-3'>Proprietary rendering implementations</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-warning text-dark'>~ 90% CSS3</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Limited JavaScript</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Partial Flexbox</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Testing Required</span>
                        </div>
                    </div>
                    <div class='card-footer bg-warning text-dark text-center'>
                        <strong>EvoPDF, Aspose, Spire, iText7</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-danger border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-danger text-white mx-auto mb-3'>⏳</div>
                        <h4>WebKit Legacy</h4>
                        <p class='text-muted mb-3'>Outdated rendering technology</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-danger'>✗ No Flexbox</span>
                            <span class='comparison-badge badge bg-danger'>✗ Limited CSS3</span>
                            <span class='comparison-badge badge bg-danger'>✗ Bootstrap 3 Max</span>
                            <span class='comparison-badge badge bg-danger'>✗ Security Issues</span>
                        </div>
                    </div>
                    <div class='card-footer bg-danger text-white text-center'>
                        <strong>WkHtmlToPdf, NReco, DinkToPdf</strong>
                    </div>
                </div>
            </div>
        </div>

        <div class='card shadow-sm mb-4'>
            <div class='card-header bg-white'>
                <h4>Detailed Feature Matrix</h4>
            </div>
            <div class='card-body p-0'>
                <div class='table-responsive'>
                    <table class='table table-striped mb-0'>
                        <thead class='table-dark'>
                            <tr>
                                <th style='width: 30%'>Feature</th>
                                <th class='text-center'>Chromium</th>
                                <th class='text-center'>Custom</th>
                                <th class='text-center'>WebKit</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td><strong>HTML5 Elements</strong></td>
                                <td class='text-center'><span class='badge bg-success'>100%</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>85-95%</span></td>
                                <td class='text-center'><span class='badge bg-danger'>60-70%</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS3 Flexbox</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Partial</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS Grid Layout</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Limited</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>JavaScript Execution</strong></td>
                                <td class='text-center'><span class='badge bg-success'>V8 Engine</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Basic</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Minimal</span></td>
                            </tr>
                            <tr>
                                <td><strong>Bootstrap 5 Support</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Perfect</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Needs Testing</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Not Supported</span></td>
                            </tr>
                            <tr>
                                <td><strong>Custom Fonts (Web Fonts)</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Variable</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Limited</span></td>
                            </tr>
                            <tr>
                                <td><strong>Modern Animations</strong></td>
                                <td class='text-center'><span class='badge bg-success'>CSS3 + JS</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>CSS3 Only</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Basic CSS</span></td>
                            </tr>
                            <tr>
                                <td><strong>Security Updates</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-danger'>2016 (EOL)</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>

        <div class='row g-4'>
            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-success text-white'>
                        <h5>✓ Chromium Advantages</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Browser-Accurate:</strong> Renders exactly as Chrome/Edge displays web content</li>
                            <li class='mb-2'><strong>Modern Standards:</strong> Full HTML5, CSS3, and ES6+ JavaScript support</li>
                            <li class='mb-2'><strong>Framework Ready:</strong> Bootstrap, Tailwind, Foundation work perfectly</li>
                            <li class='mb-2'><strong>Active Updates:</strong> Regular security patches and feature improvements</li>
                            <li class='mb-0'><strong>Developer Experience:</strong> Design in browser, convert to PDF with confidence</li>
                        </ul>
                    </div>
                </div>
            </div>

            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-danger text-white'>
                        <h5>✗ Legacy Engine Issues</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Rendering Gaps:</strong> Modern CSS features don't work or require workarounds</li>
                            <li class='mb-2'><strong>Maintenance Burden:</strong> Parallel CSS for web vs PDF increases complexity</li>
                            <li class='mb-2'><strong>Limited Frameworks:</strong> Bootstrap 4/5 and modern frameworks not supported</li>
                            <li class='mb-2'><strong>Security Risks:</strong> WebKit-based engines haven't received updates since 2016</li>
                            <li class='mb-0'><strong>Development Friction:</strong> Extensive testing required for each layout</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>

        <div class='alert alert-info mt-4 d-flex align-items-start'>
            <div class='me-3 fs-3'>💡</div>
            <div>
                <h5>Recommendation</h5>
                <p class='mb-0'>Choose Chromium-based engines (IronPDF) for production applications requiring modern web standards. Legacy engines force compromises in design and increase maintenance costs, while custom engines require extensive testing for framework compatibility.</p>
            </div>
        </div>
    </div>
</body>
</html>"

Dim pdf = renderer.RenderHtmlAsPdf(bootstrapShowcase)
pdf.SaveAs("feature-showcase.pdf")
$vbLabelText   $csharpLabel

輸出:包含 Bootstrap 5 卡片元件、響應式網格系統、徽章實用程式、色彩實用程式、條紋的表格元件和警報元件的全面功能比較 PDF——所有元件均以完美的色彩準確性、佈局保真度和排版進行渲染。

大多數 C# HTML 轉 PDF 庫:對 Bootstrap 的支援有限或根本不支援。

大多數 C# HTML 轉 PDF 庫都存在 Bootstrap 的重大限制:

基於 WebKit 的函式庫(WkHtmlToPdf、NReco、DinkToPdf、HiQPdf):

  • 不支援 Flexbox(Bootstrap 4/5 嚴重依賴 Flexbox)
  • 不使用 CSS Grid
  • 最高支援 Bootstrap 3(僅限以表格為基礎的佈局)
  • 最後更新於 2016 年-有安全漏洞且不具備現代 CSS 功能

自訂引擎庫(EvoPdf、Aspose、Spire、SelectPdf、iText7):

  • CSS3 支持率約為 90%,但在關鍵領域存在不足
  • 部分 flexbox 實現
  • 有限的 CSS Grid
  • 需要對每個 Bootstrap 元件進行廣泛的測試

不支援 HTML (PDFSharpCore、XFINIUM.PDF、GemBox,無需外掛程式):

  • 沒有原生 HTML 渲染引擎
  • 需要手動建立 PDF 文件
  • Bootstrap 不適用

開發影響:使用非 Chromium 引擎的團隊必須建立簡化的"PDF 安全"佈局或維護並行 CSS 文件,這將顯著增加開發時間並降低 Web 應用程式和 PDF 輸出之間的設計一致性。

有關 Bootstrap 框架的全面指導和 CSS3 渲染詳情,請參閱Bootstrap 和 Flexbox CSS 指南

實驗性和廢棄項目

一些 C# 中的 HTML 轉 PDF 庫起初很有前景,但很快就變成了技術死胡同,或者需要過於複雜的架構。 它們看起來可能很"現代",但實際上,它們會為試圖從 HTML 內容或完整網頁生成 PDF 文件的開發人員帶來隱藏的複雜性。

哥登堡——微服務噩夢

Gotenberg 以"只需運行 Docker 容器!"為口號,宣傳自己易於使用。但實際上,在生產環境中使用它通常需要更多:Docker、Kubernetes、服務發現、負載平衡和網路策略。

原本只是一個簡單的 C# HTML 轉 PDF 任務,卻可能迅速演變成一個分散式系統問題。 您需要確保 Gotenberg 正在運行,網路運作正常,並且 Docker 容器保持穩定。 操作複雜性的增加使得原本簡單的 PDF 轉換變得依賴性過高。

WebView2 控制項-僅限 Windows 的陷阱

微軟的 WebView2 控制項乍聽之下很有吸引力,但它有一些重大限制:它只能在 Windows 上運行,需要 Edge WebView2 運行時,無法在沒有桌面環境的伺服器上運行,並且可能存在安全沙盒問題。

像 Westwind.WebView.HtmlToPdf 這樣封裝了 WebView2 的函式庫也繼承了同樣的限制,以及額外的依賴項。

Chrome Headless – 流程。開始恐怖

一些開發者實際上嘗試在生產環境中產生 PDF,方法是使用 Process.Start("chrome", "--headless --print-to-pdf") 在無頭模式下執行 Chrome。

這種方法有幾個嚴重的問題:

  • 命令注入漏洞 Chrome 自動更新可能會意外地破壞一切。
  • 沒有內建錯誤處理機制
  • 系統中散落的暫存文件
  • 需要在伺服器上安裝 Chrome 瀏覽器

整體而言,在生產環境中,依賴 Chrome 無頭 PDF 產生過程中的直接 Process.Start 方法被認為是有風險且不穩定的。

Selenium WebDriver – 測試工具,而非 PDF 產生器

Selenium 是為測試而設計的,而不是為產生 PDF 而設計的。 用它來產生 PDF 檔案就像用推土機打蛋一樣。

雖然您可以使用 ChromeDriver 和 driver.Navigate().GoToUrl("data:text/html," + html) 之類的工具將瀏覽器實例導航到 HTML 內容,但 Selenium 無法直接產生 PDF。 要進行任何類似 PDF 輸出的操作,都需要使用 Chrome DevTools 協議,這會增加複雜性,並且經常會導致記憶體洩漏。

Selenium.WebDriver.ChromeDriver 套件只是為 Selenium 提供 Chrome 驅動程序,它並不是 PDF 生成解決方案。

這些實驗項目表明,為什麼嘗試使用已棄用或實驗性工具將 html 轉換為 pdf 通常得不償失:

  • Gotenberg:原本應該是簡單的 pdf 轉換任務,卻需要 Docker 和編排。 管理整個網頁和html檔案就變成了分散式系統問題。
  • WebView2:僅限 Windows 系統,依賴桌面環境,不適用於伺服器端產生 pdf 檔案。 *透過 Process.Start 實現 Chrome 無頭模式:會引入安全風險、暫存文件和平台相依性。
  • Selenium WebDriver:專為瀏覽器自動化而設計,而非建立 PDF 文件。 開發人員經常浪費時間試圖將測試工具當作 PDF 轉換器來使用。

嘗試使用這些庫渲染 HTML 元素、操作 PDF 文件或產生 PDF 文件通常會導致部署失敗、佈局損壞或 PDF 無法搜尋。 IronPDF 旨在消除這些難題,提供強大的方法將 HTML 轉換為 PDF,處理動態內容,並在所有平台上提供完整的 CSS 支援。

新興的 C# PDF 庫(劇透:它們還不成熟)

即使到了2025年,新的C# PDF庫仍然層出不窮。它們大多承諾功能強大,但現實卻並非如此。 這些"新興"解決方案在 GitHub 上看起來往往令人興奮,但尚未達到生產就緒狀態。

PeachPDF-概念產品

PeachPDF 被描述為"正在開發中,供社區使用",但實際上,它還不存在。 查看 GitHub 儲存庫,發現只有三次提交,最後一次提交是在八個月前。 PDF 庫生態系統已經有很多成熟的選擇,沒有必要再增加像這樣的半成品專案了。

劇作家-微軟瀏覽器自動化

Playwright本質上是微軟版的Puppeteer。 它面臨著許多相同的挑戰。 例如,它需要瀏覽器二進位文件,這會增加很大的開銷。 部署可能很複雜,而且它實際上不是 PDF 庫——HTML 到 PDF 的轉換並不是它的主要重點。

使用 Playwright 通常需要管理額外的 300MB 或更多 Chromium 瀏覽器二進位文件,這會增加任何專案的複雜性。

Syncfusion PDF 庫– 套件稅

如果你想使用 Syncfusion 的 HTML 轉 PDF 功能,實際上你需要購買他們的全套產品。 最低費用為每位開發人員 995 美元。 在 Linux 系統上,僅僅為了實現一個功能,還需要額外增加 147MB 的檔案。 換句話說,如果你只想使用一項功能,最終卻要買 70 項功能的使用權。

Aspose.PDF – 面向所有人的企業定價

Aspose.PDF 的起價為 1,199 美元,最高可達 11,997 美元。對於小型團隊或個人開發者而言,這樣的價格可能難以負擔。雖然其文件內容詳盡,但假定使用者俱備較高的專業知識水平,因此新手很難快速上手。

即使是簡單的任務也可能需要使用複雜的 API。 例如,建立新文件和新增頁面涉及多個步驟,與更直接的庫相比,這可能會讓人感覺過於複雜。

這些新興解決方案通常被宣傳為簡單的"HTML 轉 PDF C# 轉換器",但實際上,它們需要複雜的設定、手動操作或昂貴的套件購買。 他們承諾提供跨平台相容性、強大的 PDF 生成功能或完整的 CSS 支持,但在實際的 .NET 應用程式中進行測試後發現存在不足:

  • 瀏覽器二進位檔案必須手動下載和管理。
  • 對於動態內容或現代 HTML 元素,PDF 生成失敗。 CSS和JavaScript渲染通常不完整。
  • 文檔資料極少或已過時。

嘗試採用這些函式庫的開發人員經常要花費數天時間進行故障排除,最終還是會回到像 IronPDF 這樣成熟的解決方案,這些解決方案提供了強大的方法調用,並能可靠地處理整個網頁的渲染。

正在尋找更好的替代方案? 查看我們與 Aspose.PDF 的比較,或了解開發人員為何改用 IronPDF

我們為何以不同的方式建構 IronPDF?

在經歷了 C# HTML 轉 PDF 轉換中所有可能的失敗模式之後,我們圍繞著 2025 年開發者真正關心的原則設計了 IronPDF。我們的目標很簡單:可靠地將 HTML 內容轉換為 PDF,而無需擔心平台功能、授權陷阱或不受支援的功能。

1. 它就是好用™

IronPDF 提供了一種簡單可靠的產生 PDF 的方法。 無需複製外部二進位文件,無需安裝 Chrome,無需擔心特定於平台的程式碼,也無需額外的"祈禱"就能使其正常運作。

使用 IronPDF,您只需建立一個 ChromePdfRenderer,傳入您的 HTML,即可獲得 PDF 檔案。 就是這樣——它確實如預期那樣有效,無需任何複雜的設定或依賴項。

using IronPdf;

public class WhatPdfGenerationShouldBe
{
    public async Task<byte[]> GeneratePdf(string html)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}
using IronPdf;

public class WhatPdfGenerationShouldBe
{
    public async Task<byte[]> GeneratePdf(string html)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}
Imports IronPdf

Public Class WhatPdfGenerationShouldBe
    Public Async Function GeneratePdf(html As String) As Task(Of Byte())
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
        Return pdf.BinaryData
    End Function
End Class
$vbLabelText   $csharpLabel

使用 IronPDF,只需幾行程式碼即可完成 HTML 到 PDF 的轉換。 您可以從 HTML 文件、HTML 字串或動態渲染的網頁產生 PDF 文件,而無需擔心相對 URL、文件權限或缺少 CSS 支援。 無論是渲染整個網頁、HTML 片段或包含圖像的 HTML 程式碼,它都能可靠地運作。

還需要更多例子嗎? 請查看我們的HTML 轉 PDF 教學課程或查看實際程式碼範例

2. 他人無法匹敵的合規性

IronPDF 是唯一完全支援以下功能的函式庫:

*第 508 條(美國無障礙標準)

  • PDF/A(符合 ISO 19005 存檔標準)
  • PDF/UA(符合 ISO 14289 無障礙標準)

身為PDF 協會的成員,我們不僅達到標準,而且超越標準。 這就是政府機構信任我們的原因:

public class ComplianceThatMatters
{
    public async Task<byte[]> GenerateCompliantPdf(string html)
    {
        var renderer = new ChromePdfRenderer();

        // Full Section 508 compliance
        renderer.RenderingOptions.CreatePdfA = true;

        // Better accessibility than Chrome itself
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);

        // Add proper tags for screen readers
        pdf.AddAccessibilityTags();

        // This is why NASA, Tesla, and the US Government use IronPDF
        return pdf.BinaryData;
    }
}
public class ComplianceThatMatters
{
    public async Task<byte[]> GenerateCompliantPdf(string html)
    {
        var renderer = new ChromePdfRenderer();

        // Full Section 508 compliance
        renderer.RenderingOptions.CreatePdfA = true;

        // Better accessibility than Chrome itself
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);

        // Add proper tags for screen readers
        pdf.AddAccessibilityTags();

        // This is why NASA, Tesla, and the US Government use IronPDF
        return pdf.BinaryData;
    }
}
Imports System.Threading.Tasks

Public Class ComplianceThatMatters
    Public Async Function GenerateCompliantPdf(html As String) As Task(Of Byte())
        Dim renderer = New ChromePdfRenderer()

        ' Full Section 508 compliance
        renderer.RenderingOptions.CreatePdfA = True

        ' Better accessibility than Chrome itself
        Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)

        ' Add proper tags for screen readers
        pdf.AddAccessibilityTags()

        ' This is why NASA, Tesla, and the US Government use IronPDF
        Return pdf.BinaryData
    End Function
End Class
$vbLabelText   $csharpLabel

這意味著由 HTML 頁面創建的 PDF 文件符合表單欄位、文件權限和可訪問性的嚴格標準——而 PDF 轉換器庫和 HTML 渲染工具往往無法做到這一點。

使用其他圖書館遇到困難? 請參閱直接比較:

IronPDF 與 iTextSharp 的比較 IronPDF 與 wkhtmltopdf 的比較 IronPDF 與 SelectPDF 的比較

這不是行銷噱頭。 Puppeteer and Playwright 根本無法產生符合 PDF/A 或 PDF/UA 標準的文件。 他們使用的是 Chrome 的列印轉 PDF 功能,但該功能不具備這些功能。 當白宮需要無障礙 PDF 文件時,他們不會使用免費庫,而是使用 IronPDF。

3. 為現代發展而建

我們的進階 API 允許開發人員只需幾行程式碼即可從動態內容產生 PDF 文件:

public class AiGeneratedExample
{
    public async Task<byte[]> GenerateInvoiceWithAI(Invoice invoice)
    {
        var renderer = new ChromePdfRenderer
        {
            RenderingOptions =
            {
                MarginTop = 25,
                MarginBottom = 25,
                PaperOrientation = PdfPaperOrientation.Portrait,
                EnableJavaScript = true,
                CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
            }
        };

        var html = GenerateInvoiceHtml(invoice);
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);

        // Add metadata
        pdf.MetaData.Author = "AI-Generated";
        pdf.MetaData.Title = $"Invoice #{invoice.Number}";

        return pdf.BinaryData;
    }
}
public class AiGeneratedExample
{
    public async Task<byte[]> GenerateInvoiceWithAI(Invoice invoice)
    {
        var renderer = new ChromePdfRenderer
        {
            RenderingOptions =
            {
                MarginTop = 25,
                MarginBottom = 25,
                PaperOrientation = PdfPaperOrientation.Portrait,
                EnableJavaScript = true,
                CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
            }
        };

        var html = GenerateInvoiceHtml(invoice);
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);

        // Add metadata
        pdf.MetaData.Author = "AI-Generated";
        pdf.MetaData.Title = $"Invoice #{invoice.Number}";

        return pdf.BinaryData;
    }
}
Imports System.Threading.Tasks
Imports IronPdf

Public Class AiGeneratedExample
    Public Async Function GenerateInvoiceWithAI(invoice As Invoice) As Task(Of Byte())
        Dim renderer = New ChromePdfRenderer With {
            .RenderingOptions = New PdfRenderingOptions With {
                .MarginTop = 25,
                .MarginBottom = 25,
                .PaperOrientation = PdfPaperOrientation.Portrait,
                .EnableJavaScript = True,
                .CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
            }
        }

        Dim html = GenerateInvoiceHtml(invoice)
        Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)

        ' Add metadata
        pdf.MetaData.Author = "AI-Generated"
        pdf.MetaData.Title = $"Invoice #{invoice.Number}"

        Return pdf.BinaryData
    End Function
End Class
$vbLabelText   $csharpLabel

開發人員可以輕鬆地將 HTML 轉換為 PDF 格式,渲染支援 CSS、分頁符號(內部/外部)和列印 CSS 選項的網頁。 此 API 可處理相對 URL、圖片檔案和 HTML 元素,因此可完全控制 PDF 頁面大小、自訂頁首和檔案權限。

4. 真正的OCR集成

IronPDF支援使用OCR功能處理PDF文件:

public class BeyondHtmlToPdf
{
    public async Task<string> ProcessScannedDocument(byte[] scannedPdf)
    {
        var pdf = PdfDocument.FromBytes(scannedPdf);

        // OCR the content
        var text = pdf.ExtractTextFromPage(0);

        if (string.IsNullOrWhiteSpace(text))
        {
            text = await pdf.ApplyOcr();
        }

        var structuredData = await ExtractWithAI(text);
        var combined = PdfDocument.Merge(pdf, otherPdf);

        combined.SignWithCertificate(certificate);
        return structuredData;
    }

    private async Task<string> ExtractWithAI(string text)
    {
        return await OpenAIService.Extract(text);
    }
}
public class BeyondHtmlToPdf
{
    public async Task<string> ProcessScannedDocument(byte[] scannedPdf)
    {
        var pdf = PdfDocument.FromBytes(scannedPdf);

        // OCR the content
        var text = pdf.ExtractTextFromPage(0);

        if (string.IsNullOrWhiteSpace(text))
        {
            text = await pdf.ApplyOcr();
        }

        var structuredData = await ExtractWithAI(text);
        var combined = PdfDocument.Merge(pdf, otherPdf);

        combined.SignWithCertificate(certificate);
        return structuredData;
    }

    private async Task<string> ExtractWithAI(string text)
    {
        return await OpenAIService.Extract(text);
    }
}
Imports System.Threading.Tasks

Public Class BeyondHtmlToPdf
    Public Async Function ProcessScannedDocument(scannedPdf As Byte()) As Task(Of String)
        Dim pdf = PdfDocument.FromBytes(scannedPdf)

        ' OCR the content
        Dim text = pdf.ExtractTextFromPage(0)

        If String.IsNullOrWhiteSpace(text) Then
            text = Await pdf.ApplyOcr()
        End If

        Dim structuredData = Await ExtractWithAI(text)
        Dim combined = PdfDocument.Merge(pdf, otherPdf)

        combined.SignWithCertificate(certificate)
        Return structuredData
    End Function

    Private Async Function ExtractWithAI(text As String) As Task(Of String)
        Return Await OpenAIService.Extract(text)
    End Function
End Class
$vbLabelText   $csharpLabel

與其他 PDF 轉換工具不同,IronPDF 允許您從掃描的圖像文件或 HTML 內容生成 PDF 文檔,並自動提取結構化數據,從而簡化複雜 .NET 應用程式中的 PDF 生成。

了解更多:合併PDF | 數位簽名 | 從PDF中提取文本

5. 真正有效的部署

IronPDF部署環境

IronPDF 專為現代 .NET 應用程式中的跨平台 HTML 到 PDF 轉換而設計。 您可以直接從 HTML 內容產生 PDF 文檔,而無需擔心平台依賴性、二進位文件安裝或伺服器配置:

  • Windows Server
  • Linux 發行版(Ubuntu、Debian、Alpine) macOS
  • Docker容器
  • Azure Functions
  • AWS Lambda
  • Kubernetes

它還支援多個 .NET 目標:

  • .NET Framework 4.0 及更高版本
  • .NET Core 2.0 及更高版本
  • .NET 5、6、7、8、9 和 10

使用該庫非常簡單。 您可以簡單地建立一個渲染器,使用您的 HTML 內容呼叫 RenderHtmlAsPdfAsync,即可取得 PDF。 簡而言之:它在任何地方都能正常運作。

請參閱部署指南: Docker 部署 | Azure Functions | AWS Lambda | Linux 安裝

我們建構的技術優勢

1. 真正的 Chromium 渲染

Chromium 渲染與 IE/WebKit PDF 產生對比

IronPDF 底層使用現代 Chromium 內核,而不是 2016 年的 WebKit 或 Internet Explorer,從而確保對 CSS3、JavaScript 和 HTML 元素的完全支援。

public class ModernWebStandards
{
    public async Task<byte[]> GenerateModernPdf()
    {
        var renderer = new ChromePdfRenderer();

        var html = @"
        <style>
            .container {
                display: grid;
                grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
                gap: 2rem;
            }
            .card {
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                border-radius: 15px;
                box-shadow: 0 20px 40px rgba(0,0,0,0.1);
            }
            @media print { .no-print { display: none; } }
        </style>
        <div class='container'>
            <div class='card'>Modern CSS works!</div>
        </div>";

        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}
public class ModernWebStandards
{
    public async Task<byte[]> GenerateModernPdf()
    {
        var renderer = new ChromePdfRenderer();

        var html = @"
        <style>
            .container {
                display: grid;
                grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
                gap: 2rem;
            }
            .card {
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                border-radius: 15px;
                box-shadow: 0 20px 40px rgba(0,0,0,0.1);
            }
            @media print { .no-print { display: none; } }
        </style>
        <div class='container'>
            <div class='card'>Modern CSS works!</div>
        </div>";

        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}
Imports System.Threading.Tasks

Public Class ModernWebStandards
    Public Async Function GenerateModernPdf() As Task(Of Byte())
        Dim renderer = New ChromePdfRenderer()

        Dim html = "
        <style>
            .container {
                display: grid;
                grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
                gap: 2rem;
            }
            .card {
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                border-radius: 15px;
                box-shadow: 0 20px 40px rgba(0,0,0,0.1);
            }
            @media print { .no-print { display: none; } }
        </style>
        <div class='container'>
            <div class='card'>Modern CSS works!</div>
        </div>"

        Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
        Return pdf.BinaryData
    End Function
End Class
$vbLabelText   $csharpLabel

這種穩健的方法確保 PDF 文件保持正確的分頁符(包括內部和外部),圖像文件正確嵌入,並且來自任何指定 URL 的 HTML 字串或 HTML 文件都能可靠地轉換。 開發者只需幾行程式碼即可輕鬆將 HTML 轉換為 PDF 文件。

2.每月更新

IronPDF 每月發布更新,讓您的 PDF 產生工具與不斷發展的網路標準保持同步。

  • 2025年10月:從第一天起支援.NET 10
  • 2025年9月:增強型人工智慧整合API
  • 2025年8月:HTML到PDF渲染速度提升30%
  • 2025 年 7 月:原生支援 Apple Silicon

與競爭對手相比:

  • DinkToPdf:上次更新時間:2020年6月
  • HtmlRenderer:上次更新時間為 2019 年
  • TuesPechkin:最後更新於 2015 年

3. 實際支持

IronPDF 不會讓你束手無策。 當你發送郵件至 support@ironsoftware.com時,會有真正的開發人員回覆你。 沒有論壇,沒有聊天機器人——只需要一個了解 HTML 轉 PDF 流程、PDF 轉換器 API 和 PDF 文件權限的人。

人工智慧革命

這是其他任何 PDF 庫都沒有考慮過的功能:完全整合人工智慧。 IronPDF 的設計旨在與 AI 編碼助理完美配合,使開發人員能夠產生可立即轉換為 PDF 文件的 HTML 文件。 這對於將網頁、HTML 片段或動態 HTML 內容轉換為 PDF 格式尤其有用,同時也能保留 CSS 支援、相對 URL 和分頁符號設定。

public class AIPoweredDocuments
{
    private readonly ChromePdfRenderer _renderer = new();

    public async Task<byte[]> GenerateAIDocument(string prompt)
    {
        // Step 1: AI generates the HTML
        var html = await GenerateHtmlWithAI(prompt);

        // Step 2: IronPDF renders it perfectly as a PDF document
        var pdf = await _renderer.RenderHtmlAsPdfAsync(html);

        // Step 3: OCR and extract data from existing PDF files
        var existingData = await ExtractDataFromPdfs();

        // Step 4: AI enhances the PDF document
        var enhanced = await EnhanceWithAI(pdf, existingData);

        return enhanced.BinaryData;
    }

    private async Task<string> GenerateHtmlWithAI(string prompt)
    {
        // IronPDF's API is so clean that ChatGPT/Claude
        // can generate working code without training
        var response = await OpenAI.Complete($@"
            Generate HTML for: {prompt}
            Requirements:
            - Use modern CSS3/HTML5
            - Include responsive design
            - Add print-specific CSS for PDF page size
        ");

        return response.Html;
    }
}
public class AIPoweredDocuments
{
    private readonly ChromePdfRenderer _renderer = new();

    public async Task<byte[]> GenerateAIDocument(string prompt)
    {
        // Step 1: AI generates the HTML
        var html = await GenerateHtmlWithAI(prompt);

        // Step 2: IronPDF renders it perfectly as a PDF document
        var pdf = await _renderer.RenderHtmlAsPdfAsync(html);

        // Step 3: OCR and extract data from existing PDF files
        var existingData = await ExtractDataFromPdfs();

        // Step 4: AI enhances the PDF document
        var enhanced = await EnhanceWithAI(pdf, existingData);

        return enhanced.BinaryData;
    }

    private async Task<string> GenerateHtmlWithAI(string prompt)
    {
        // IronPDF's API is so clean that ChatGPT/Claude
        // can generate working code without training
        var response = await OpenAI.Complete($@"
            Generate HTML for: {prompt}
            Requirements:
            - Use modern CSS3/HTML5
            - Include responsive design
            - Add print-specific CSS for PDF page size
        ");

        return response.Html;
    }
}
Imports System.Threading.Tasks

Public Class AIPoweredDocuments
    Private ReadOnly _renderer As New ChromePdfRenderer()

    Public Async Function GenerateAIDocument(prompt As String) As Task(Of Byte())
        ' Step 1: AI generates the HTML
        Dim html = Await GenerateHtmlWithAI(prompt)

        ' Step 2: IronPDF renders it perfectly as a PDF document
        Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html)

        ' Step 3: OCR and extract data from existing PDF files
        Dim existingData = Await ExtractDataFromPdfs()

        ' Step 4: AI enhances the PDF document
        Dim enhanced = Await EnhanceWithAI(pdf, existingData)

        Return enhanced.BinaryData
    End Function

    Private Async Function GenerateHtmlWithAI(prompt As String) As Task(Of String)
        ' IronPDF's API is so clean that ChatGPT/Claude
        ' can generate working code without training
        Dim response = Await OpenAI.Complete($"
            Generate HTML for: {prompt}
            Requirements:
            - Use modern CSS3/HTML5
            - Include responsive design
            - Add print-specific CSS for PDF page size
        ")

        Return response.Html
    End Function
End Class
$vbLabelText   $csharpLabel

這種方法允許開發人員使用幾行程式碼,從 AI 創建的 HTML 內容(包括表單欄位、圖像和自訂標題)生成 PDF 文件。 IronPDF 可無縫處理 HTML 到 PDF 的轉換、OCR 和 AI 提取,產生完全可操作、易於存取且專業的 PDF 文件,適用於任何 .NET 應用程式。

開發者為何選擇 IronPDF

使用 IronPDF,入門非常快速簡單:您只需安裝軟體包,編寫三行程式碼,即可產生 PDF——整個過程大約只需五分鐘。

相較之下,其他 HTML 轉 PDF 解決方案通常需要更長的設定流程:您必須安裝軟體包、下載所需的二進位檔案、設定檔路徑、處理平台差異、偵錯崩潰以及處理其他複雜情況。 對於許多開發人員來說,這可能需要長達兩週的時間,這通常會導致他們轉而使用 IronPDF,因為它簡單可靠。

開發人員喜歡 IronPDF,因為它能夠快速、可靠且輕鬆地產生 PDF 文件。 該 API 非常簡單,因此只需幾行程式碼即可從 HTML 檔案或 HTML 內容產生 PDF。 最終用戶可以受益於易於存取且結構良好的 PDF 文件,其中包含合適的表單欄位、圖像以及與完整網頁一致的渲染效果。 IronPDF 消除了處理特定平台問題、複雜配置或損壞的第三方工具的麻煩。

自己動手試試

別再看文字了-體驗IronPDF生成PDF有多簡單吧!

// Install-Package IronPdf
using IronPdf;

class Program
{
    static async Task Main()
    {
        // Your first PDF in 3 lines of code
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Hello World</h1>");
        pdf.SaveAs("hello.pdf");

        // No configuration, no extra binaries, no complicated setup
        // It just works across Windows, Linux, macOS, and Docker
    }
}
// Install-Package IronPdf
using IronPdf;

class Program
{
    static async Task Main()
    {
        // Your first PDF in 3 lines of code
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Hello World</h1>");
        pdf.SaveAs("hello.pdf");

        // No configuration, no extra binaries, no complicated setup
        // It just works across Windows, Linux, macOS, and Docker
    }
}
Imports IronPdf

Class Program
    Shared Async Function Main() As Task
        ' Your first PDF in 3 lines of code
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = Await renderer.RenderHtmlAsPdfAsync("<h1>Hello World</h1>")
        pdf.SaveAs("hello.pdf")

        ' No configuration, no extra binaries, no complicated setup
        ' It just works across Windows, Linux, macOS, and Docker
    End Function
End Class
$vbLabelText   $csharpLabel

使用 IronPDF,只需幾行程式碼即可將任何 HTML 內容或動態產生的 Web 內容產生為專業的 PDF 文件。 該庫可處理 HTML 到 PDF 的轉換、頁面大小調整、CSS 支援、相對 URL、圖像等等——所有這些都無需複雜的設定。

無論您是建立發票、報告還是完整的網頁 PDF 文檔,IronPDF 都能無縫整合到 Visual Studio 和 .NET 應用程式中。 您可以獲得可靠的 HTML 元素渲染、正確的文件結構以及對文件權限和表單欄位的完全控制,同時保持程式碼的簡潔性和可維護性。

需要幫助? IronPDF 的支援團隊平均回應時間為 23 秒——由真正的工程師全天候 24 小時在線。沒有聊天機器人,沒有腳本,只有了解庫的專家。

入門資源:

快速入門指南

底線

我們創建 IronPDF 是因為我們厭倦了開發人員在使用其他庫時遇到的挫折:過時的程式碼、需要花費數週時間調試的"免費"解決方案、平台特定的怪癖以及未得到解答的支援問題。

八年後,IronPDF在 NuGet 上的下載量超過 1,000 萬次,仍是唯一符合以下條件的 HTML 轉 PDF 庫:

  • 每月更新,提供改進和 .NET 支持
  • 在 Windows、Linux、macOS 和 Docker 上均能穩定運作
  • 提供真正的開發者支持,而不是論壇或聊天機器人。
  • 與現代人工智慧編碼工具無縫集成
  • 包括 OCR 和 PDF 處理功能
  • 符合第 508 條款、PDF/A 和 PDF/UA 合規標準

我們明白-沒人願意為PDF庫付費。 但現實是:無論如何你都要付出代價。 你可以一次性支付$799購買 IronPDF,或者你可以花費數週時間進行調試、應對生產失敗,最終在所有其他方法都失敗後還是購買 IronPDF。

我們開發 IronPDF 的目的並非要成為另一種選擇。 我們打造它的目的就是為了解決這個問題。 我們之所以擁有 1000 萬次的下載量,並擁有像 NASA、特斯拉和白宮這樣的客戶,是有原因的——開發者們嘗試了"免費"選項,浪費了數週時間,然後才來找我們。 省去你的麻煩吧。

準備好告別PDF生成難題了嗎?

*開始使用 IronPDF

IronPDF:一次找到合適的解決方案。未來的你(以及你的用戶)都會感謝你。

常見問題解答

是什麼讓 IronPDF 在 C# 的其他 HTML to PDF 函式庫中脫穎而出呢?

與其他 HTML to PDF 解決方案相比,IronPDF 提供簡化的設定流程,減少安裝多個套件、下載額外的二進位檔案,以及設定檔案路徑的需要。這種簡化有助於避免平台差異,並將除錯降至最低。

為什麼 HTML to PDF 函式庫的易於設定很重要?

易於設定是至關重要的,因為這可節省開發人員的時間,並降低將程式庫整合至應用程式所涉及的複雜性。與其他解決方案相比,IronPDF 大幅簡化了這個過程。

IronPdf 如何處理平台差異?

IronPdf 可無縫管理平台差異,讓開發人員無需手動設定或調試不同作業系統的相容性問題。

其他 HTML to PDF 解決方案常面臨哪些挑戰?

其他解決方案通常需要冗長的設定,例如安裝額外的套件、設定檔案路徑,以及處理特定平台的問題,這可能導致花在除錯和維護上的時間增加。

IronPdf 如何改善調試過程?

IronPdf 可降低設定和執行過程中發生當機和複雜情況的可能性,因此相較於其他 HTML to PDF 函式庫,可減少除錯次數。

IronPdf 是否適合大型應用程式?

是的,IronPDF 旨在高效處理大型應用程式,提供企業級專案不可或缺的強大效能和可靠轉換流程。

開發人員使用 IronPDF 能獲得哪些好處?

開發人員受益於 IronPdf 的快速整合、降低設定複雜度,以及可靠的 HTML 至 PDF 轉換功能,從而節省軟體開發的時間與資源。

IronPdf 能否處理複雜的 HTML 結構?

IronPdf 能夠準確地將複雜的 HTML 結構轉換成 PDF 格式,以高保真的方式保留樣式、版面設計和互動元素。

IronPdf 如何確保跨平台相容性?

IronPdf 的設計是跨平台的,可確保它能在各種作業系統中一致運作,而不需要開發人員進行額外的設定。

是什麼讓 IronPDF 成為 HTML 至 PDF 轉換的可靠選擇?

IronPdf 的可靠性來自於它的易用性、強大的效能,以及在不降低品質或速度的情況下處理複雜 HTML 文件的能力。

Curtis Chau
技術撰稿人

Curtis Chau 擁有電腦科學學士學位(卡爾頓大學),專長於前端開發,精通 Node.js、TypeScript、JavaScript 和 React。Curtis 對製作直覺且美觀的使用者介面充滿熱情,他喜歡使用現代化的架構,並製作結構良好且視覺上吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 也有濃厚的興趣,他喜歡探索整合硬體與軟體的創新方式。在空閒時間,他喜歡玩遊戲和建立 Discord bots,將他對技術的熱愛與創意結合。