比較

Expert PDF vs IronPDF:技術比較指南

當.NET開發人員評估 HTML 到 PDF 轉換庫時,Expert PDF 是一個具有成熟 HTML5 支援的商業選項。 然而,它的文件自 2018 年以來就沒有更新過,它依賴過時的 Chrome 渲染引擎,而且其碎片化的產品模型導致許多團隊考慮其他替代方案。 IronPDF採用現代化的方法,利用最新的 Chromium 渲染技術,持續更新,並將所有功能整合到一個軟體包中。

本次比較從相關技術方面考察了這兩個程式庫,以幫助專業開發人員和架構師針對其.NET PDF 需求做出明智的決策。

了解專家 PDF

Expert PDF (ExpertPdf) 是一個商業的 HTML 轉 PDF 轉換庫,可協助將動態網頁轉換為 PDF 文件。 該程式庫聲稱支援 HTML5,這有利於以 PDF 格式渲染現代 Web 內容。

Expert PDF 使用 PdfConverter 類別作為其主要轉換接口,提供 GetPdfBytesFromUrl()GetPdfBytesFromHtmlFile() 等方法,用於各種轉換場景。 此庫透過轉換器上的 PdfHeaderOptionsPdfFooterOptions 屬性來組織配置。

Expert PDF 的一個重大限制在於它依賴舊版的 Chrome 瀏覽器來渲染 PDF 檔案。 現代網路標準和後續 Chromium 版本中的渲染改進並未反映在 專家級 PDF 的輸出中,這可能會導致在使用 CSS3 功能(如 Flexbox 和 Grid)的現代網頁設計時渲染精度降低。

Expert PDF 的文檔自 2018 年以來一直處於凍結狀態——超過六年沒有更新——這使得開發人員越來越難以找到最新的資訊、範例和最佳實踐。 該庫以碎片化產品套件的形式出售,包含多個獨立軟體包(HtmlToPdf、PDFMerge、PDFSecurity、PDFSplit、PdfToImage),每個軟體包都需要單獨授權,價格從 550 美元到 1200 美元不等。

了解IronPDF

IronPDF是一個.NET PDF 庫,以持續更新和改進而聞名。 該庫使用最新的 Chromium 渲染引擎,確保符合現代 Web 標準,並能準確渲染 HTML,同時完全支援 CSS3,包括 Flexbox 和 Grid 佈局。

IronPDF使用 ChromePdfRenderer 作為其主要轉換類,而 RenderingOptions 提供頁面大小、方向、邊距、頁首和頁腳的配置。 該庫返回 PdfDocument 對象,可以在保存之前對其進行進一步操作,從而為後處理操作提供靈活性。

IronPDF提供詳盡的文檔,每月持續發布新版本,原生支援.NET 6/7/8/9+,並真正實現跨 Windows、Linux、macOS 和 Docker 環境的跨平台相容性。

架構和產品模型比較

這些.NET PDF 庫之間的根本區別在於它們的產品組織和渲染技術。

方面專家級 PDFIronPDF
文件自2018年起冷凍持續更新
渲染引擎舊版 Chrome最新鉻
CSS 支援有限的 CSS3完整的 CSS3(Flexbox、Grid)
價格550-1200美元價格競爭力強
更新頻率不頻繁每月發布
產品模型碎片化(5個以上DLL檔)一體化圖書館
近代.NET有限的.NET 6/7/8/9+ 原生
非同步支援有限的完全異步/等待
安全性更新不頻繁常規補丁

Expert PDF 的產品套件較為分散,其中包括:

  • ExpertPdf.HtmlToPdf: HTML 轉 PDF 轉換
  • ExpertPdf.PDFMerge: PDF 合併 ExpertPdf.PDFSecurity:加密和密碼 ExpertPdf.PDFSplit: PDF 分割
  • ExpertPdf.PdfToImage: PDF 轉影像

每個軟體包都需要單獨的許可證。 IronPDF將所有等效功能整合到一個NuGet包中。

程式碼比較:常見 PDF 操作

HTML 轉 PDF

將 HTML 內容轉換為 PDF 可以反映 API 的根本差異。

專家級PDF:

// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Convert HTML string to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlString("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        System.IO.File.WriteAllBytes("output.pdf", pdfBytes);

        Console.WriteLine("PDF created successfully!");
    }
}
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Convert HTML string to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlString("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        System.IO.File.WriteAllBytes("output.pdf", pdfBytes);

        Console.WriteLine("PDF created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF from HTML string
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        pdf.SaveAs("output.pdf");

        Console.WriteLine("PDF created successfully!");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF from HTML string
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        pdf.SaveAs("output.pdf");

        Console.WriteLine("PDF created successfully!");
    }
}
$vbLabelText   $csharpLabel

Expert PDF 直接從 GetPdfBytesFromHtmlString() 返回 byte[],需使用 File.WriteAllBytes() 手動寫入檔案。 IronPDF返回一個 PdfDocument 對象,該對象具有 SaveAs() 方法,從而提供更簡潔的保存操作,並允許在保存之前進行額外的操作。

如需了解進階 HTML 渲染選項,請參閱HTML 轉 PDF 轉換指南

URL 轉 PDF

將網頁擷取為 PDF 文件會顯示設定模式的差異。

專家級PDF:

// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Set page size and orientation
        pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
        pdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;

        // Convert URL to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromUrl("https://www.example.com");

        // Save to file
        System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);

        Console.WriteLine("PDF from URL created successfully!");
    }
}
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Set page size and orientation
        pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
        pdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;

        // Convert URL to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromUrl("https://www.example.com");

        // Save to file
        System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);

        Console.WriteLine("PDF from URL created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Set page size and orientation
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;

        // Convert URL to PDF
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        // Save to file
        pdf.SaveAs("webpage.pdf");

        Console.WriteLine("PDF from URL created successfully!");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Set page size and orientation
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;

        // Convert URL to PDF
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        // Save to file
        pdf.SaveAs("webpage.pdf");

        Console.WriteLine("PDF from URL created successfully!");
    }
}
$vbLabelText   $csharpLabel

這兩個庫都提供頁面大小和方向配置。 專家級 PDF 使用 PdfDocumentOptions.PdfPageSizePdfDocumentOptions.PdfPageOrientation,而IronPDF使用 RenderingOptions.PaperSizeRenderingOptions.PaperOrientation。 命名遵循類似的模式,但IronPDF使用"Paper"前綴,以與印刷術語保持一致。

有關 URL 渲染的更多信息,請參閱URL 轉 PDF 文件

附頁碼的頁首和頁尾

加入頁首和頁尾反映了 API 設計上的顯著差異,尤其是在頁碼語法方面。

專家級PDF:

// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Enable header
        pdfConverter.PdfHeaderOptions.ShowHeader = true;
        pdfConverter.PdfHeaderOptions.HeaderText = "Document Header";
        pdfConverter.PdfHeaderOptions.HeaderTextAlignment = HorizontalTextAlign.Center;

        // Enable footer with page numbers
        pdfConverter.PdfFooterOptions.ShowFooter = true;
        pdfConverter.PdfFooterOptions.FooterText = "Page &p; of &P;";
        pdfConverter.PdfFooterOptions.FooterTextAlignment = HorizontalTextAlign.Right;

        // Convert HTML file to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlFile("input.html");

        // Save to file
        System.IO.File.WriteAllBytes("output-with-header-footer.pdf", pdfBytes);

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Enable header
        pdfConverter.PdfHeaderOptions.ShowHeader = true;
        pdfConverter.PdfHeaderOptions.HeaderText = "Document Header";
        pdfConverter.PdfHeaderOptions.HeaderTextAlignment = HorizontalTextAlign.Center;

        // Enable footer with page numbers
        pdfConverter.PdfFooterOptions.ShowFooter = true;
        pdfConverter.PdfFooterOptions.FooterText = "Page &p; of &P;";
        pdfConverter.PdfFooterOptions.FooterTextAlignment = HorizontalTextAlign.Right;

        // Convert HTML file to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlFile("input.html");

        // Save to file
        System.IO.File.WriteAllBytes("output-with-header-footer.pdf", pdfBytes);

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Configure header
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Document Header",
            DrawDividerLine = true
        };

        // Configure footer with page numbers
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            RightText = "Page {page} of {total-pages}",
            DrawDividerLine = true
        };

        // Convert HTML file to PDF
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");

        // Save to file
        pdf.SaveAs("output-with-header-footer.pdf");

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Configure header
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Document Header",
            DrawDividerLine = true
        };

        // Configure footer with page numbers
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            RightText = "Page {page} of {total-pages}",
            DrawDividerLine = true
        };

        // Convert HTML file to PDF
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");

        // Save to file
        pdf.SaveAs("output-with-header-footer.pdf");

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
$vbLabelText   $csharpLabel

Expert PDF 需要使用布林標誌 (ShowHeader = true) 啟用頁首/頁腳,並使用基於文字的配置,其中 &p;&P; 標記分別表示目前頁和總頁數。 IronPDF使用具有特定位置屬性的 TextHeaderFooter 物件(RightText)和 {page} / {total-pages} 佔位符。 IronPDF也提供 DrawDividerLine 視覺分離。

為了實現完全的 HTML 控制, IronPDF也支援 HtmlHeaderFooter,允許在頁首和頁尾中進行完整的 HTML/CSS 樣式設定。

方法映射參考

對於正在評估 專家級 PDF 遷移或比較功能的開發人員來說,此對應顯示了等效操作:

核心類別映射

專家級 PDFIronPDF
PdfConverterChromePdfRenderer
PdfDocumentOptionsChromePdfRenderOptions
PdfSecurityOptionsPdfDocument.SecuritySettings
PdfHeaderOptionsHtmlHeaderFooterTextHeaderFooter
PdfFooterOptionsHtmlHeaderFooterTextHeaderFooter
PDFMergePdfDocument.Merge()

方法映射

專家級 PDFIronPDF
pdfConverter.GetPdfBytesFromHtmlString(html)renderer.RenderHtmlAsPdf(html).BinaryData
pdfConverter.GetPdfBytesFromUrl(url)renderer.RenderUrlAsPdf(url).BinaryData
pdfConverter.GetPdfBytesFromHtmlFile(path)renderer.RenderHtmlFileAsPdf(path).BinaryData
pdfConverter.SavePdfFromUrlToFile(url, path)renderer.RenderUrlAsPdf(url).SaveAs(path)

配置映射

專家級 PDFIronPDF
PdfDocumentOptions.PdfPageSize = PdfPageSize.A4RenderingOptions.PaperSize = PdfPaperSize.A4
PdfDocumentOptions.PdfPageOrientation = PortraitRenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait
PdfDocumentOptions.MarginTopRenderingOptions.MarginTop
pdfConverter.LicenseKey = "..."IronPdf.License.LicenseKey = "..."

頁碼標記

專家級 PDFIronPDF
&p;(目前頁){page}
&P;(總頁數){total-pages}

功能對比總結

特徵專家級 PDFIronPDF
HTML 轉 PDF
PDF檔案的URL
HTML 檔案轉 PDF
頁首/頁尾✅(文字格式)✅(HTML 或文字)
頁碼✅ (&P;)✅ ({total-pages})
PDF合併✅(單獨包裝)✅(已包含)
PDF 安全性✅(單獨包裝)✅(已包含)
PDF分割✅(單獨包裝)✅(已包含)
PDF 轉影像✅(單獨包裝)✅(已包含)
CSS3 Flexbox/Grid❌(限量)✅(全力支持)
跨平台有限的支援

當團隊考慮從 專家級 PDF 遷移到IronPDF時

開發團隊基於以下幾個原因評估從 專家級 PDF 過渡到IronPDF :

文件時效性: 專家級 PDF 的文件自 2018 年以來一直處於凍結狀態——超過六年沒有更新。 對於尋求最新資訊、範例和最佳實踐的團隊來說,IronPDF 不斷更新的文件更適合現代開發工作流程。

現代 CSS 渲染: 專家級 PDF 依賴舊版 Chrome,可能無法正確渲染現代 CSS3 功能(Flexbox、Grid、CSS 變數)。 IronPDF 最新的 Chromium 引擎可確保對現代網頁設計進行精確渲染。

軟體包整合: 專家級 PDF 的分散產品套件(HtmlToPdf、PDFMerge、PDFSecurity、PDFSplit、PdfToImage)需要多個授權。 IronPDF將所有等效功能整合到一個NuGet包中,簡化了依賴項管理並降低了許可複雜度。

性價比評估: 專家級 PDF 的授權費用為 550 美元至 1200 美元,價格過高,但提供的卻是過時的渲染技術。 團隊會評估成本是否與所提供的傳統技術相符。

現代.NET支援: .NET 6/7/8/9+ 的應用程式可受益於 IronPDF 的原生支援和完整的 async/await 模式,而 專家級 PDF 的現代.NET支援則較為有限。

更新頻率: 專家級 PDF 的更新頻率較低,而 IronPDF 則每月發布一次,這影響了功能可用性和安全性修補程式的及時性。

優勢與考量

專家級PDF優勢

  • HTML5 支援:具備基本的 HTML5 渲染能力 -已建立的庫:已在生產環境中驗證 -熟悉的 API:簡潔的 PdfConverter 模式

專家級PDF考量

-文件已凍結:自 2018 年以來未更新 -舊版渲染:舊版 Chrome 瀏覽器對 CSS3 的支援有限 -產品分散:需要單獨的軟體包和許可證。 -高級定價:傳統技術定價為 550 美元至 1200 美元 -現代.NET功能有限:落後於當前的.NET版本 -更新頻率低:安全性更新和功能更新很少。

IronPDF 的優勢

-現代渲染:採用最新的 Chromium 引擎,實現像素級完美輸出 -一體化軟體包:在一個NuGet中完成 PDF 產生、合併、安全保護和提取。 -積極開發:每月更新,包含新功能和安全補丁 -更完善的文件:全面的教學與範例 -真正的跨平台:支援 Windows、Linux、macOS 和 Docker -現代.NET:原生支援.NET 6/7/8/9+ -完全支援非同步:全面採用現代 async/await 模式

IronPDF注意事項

-兩步驟儲存:渲染返回 PdfDocument,然後呼叫 SaveAs()(提供彈性) -不同的佔位符:使用 {page} 語法,而不是 &p;

結論

Expert PDF 和IronPDF都為.NET開發人員提供 HTML 轉 PDF 功能,但它們代表了技術發展歷程中的不同階段。 專家級 PDF 提供成熟的功能,但其文件自 2018 年以來就未更新,使用的舊版 Chrome 渲染引擎限制了對 CSS3 的支持,並且其產品模式較為分散,需要購買多個許可證。

IronPDF提供了一種現代化的替代方案,採用最新的 Chromium 渲染技術,每月持續更新,提供全面的文檔,並將所有功能整合到一個軟體包中。 對於需要目前 CSS3 支援、積極維護或跨平台部署的團隊, IronPDF可以滿足這些特定需求。

隨著各組織規劃.NET 10、C# 14 以及到 2026 年的應用程式開發,選擇取決於特定的優先順序。 擁有成熟的 專家級 PDF 實作和簡單 HTML 佈局的團隊可能會繼續獲得足夠的結果。 對於現代網頁設計、主動安全修補程式和統一許可, IronPDF提供了更合適的解決方案。

立即開始免費試用IronPDF ,並瀏覽其全面的文檔,以評估其是否符合您的特定需求。