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 格式呈現現代網路內容。
Expert PDF 使用PdfConverter類作為其主要的轉換介面,針對各種轉換情境提供 GetPdfBytesFromHtmlString(), GetPdfBytesFromUrl(), 以及 GetPdfBytesFromHtmlFile() 等方法。 該函式庫透過轉換器上的 PdfDocumentOptions, PdfHeaderOptions, 和PdfFooterOptions屬性來組織組態。
Expert PDF 的一個顯著限制是它依賴較舊版本的 Chrome 來呈現 PDF。 現代網路標準和後續 Chromium 版本中的渲染改進並未反映在專家級 PDF的輸出中,這可能會導致在使用 CSS3 功能(如 Flexbox 和 Grid)的現代網頁設計時渲染精度降低。
Expert PDF 的文档自 2018 年以来一直处于冻结状态 - 超过六年没有更新,这使得开发人员越来越难以找到最新的信息、示例和最佳实践。 該函式庫是以分散的產品套件形式銷售,其中包含各個獨立的套件 (HtmlToPdf、PDFMerge、PDFSecurity、PDFSplit、PdfToImage),每個套件都需要獨立的授權,價位從 550 美元到 1,200 美元不等。
了解 IronPDF
IronPDF 是一個以持續更新和改進著稱的 .NET PDF 函式庫。 該函式庫使用最新的 Chromium 渲染引擎,確保符合現代網路標準,並可精確地渲染 HTML,完全支援 CSS3,包括 Flexbox 和 Grid 布局。
IronPDF 使用ChromePdfRenderer作為其主要的轉換類,而 RenderingOptions 則提供頁面大小、方向、邊界、頁首和頁尾的配置。 該函式庫會傳回 PdfDocument 物件,這些物件可在儲存前進一步處理,提供後處理作業的彈性。
IronPDF 提供詳盡的文檔,每月持續發布新版本,原生支援 .NET 6/7/8/9+,並真正實現跨 Windows、Linux、macOS 和 Docker 環境的跨平台相容性。
架構與產品型號比較
這些 .NET PDF 函式庫的根本差異在於它們的產品組織和渲染技術。
| 範疇 | 專家級 PDF | IronPDF |
|---|---|---|
| 說明文件 | 自 2018 年起凍結 | 持續更新 |
| 渲染引擎 | 舊版 Chrome | 最新的 Chromium |
| CSS 支援 | 有限的 CSS3 | 完整的 CSS3 (Flexbox、Grid) |
| 價格 | $550-$1,200 | 有競爭力的定價 |
| 更新頻率 | 不經常 | 每月發佈 |
| 產品模式 | 零散 (5+ DLL) | 多合一程式庫 |
| 現代 .NET | 限額 | .NET 6/7/8/9+ 原生 |
| Async 支援 | 限額 | 完整的 async/await |
| 安全性更新 | 不經常 | 常規補丁 |
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!");
}
}Imports ExpertPdf.HtmlToPdf
Imports System
Module Program
Sub Main()
' Create the PDF converter
Dim pdfConverter As New PdfConverter()
' Convert HTML string to PDF
Dim pdfBytes As Byte() = 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!")
End Sub
End ModuleIronPDF:
// 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!");
}
}Imports IronPdf
Imports System
Class Program
Shared Sub Main()
' Create a PDF from HTML string
Dim renderer = New ChromePdfRenderer()
Dim 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!")
End Sub
End ClassExpert PDF 直接從 GetPdfBytesFromHtmlString() 傳回 byte[] ,需要使用 File.WriteAllBytes() 手動寫入檔案。IronPDF返回一個具有 SaveAs() 方法的 PdfDocument 物件,提供一個更乾淨的儲存操作,並可在儲存前進行其他操作。
如需進階的 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!");
}
}Imports ExpertPdf.HtmlToPdf
Imports System
Module Program
Sub Main()
' Create the PDF converter
Dim pdfConverter As New PdfConverter()
' Set page size and orientation
pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4
pdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait
' Convert URL to PDF
Dim pdfBytes As Byte() = pdfConverter.GetPdfBytesFromUrl("https://www.example.com")
' Save to file
System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes)
Console.WriteLine("PDF from URL created successfully!")
End Sub
End ModuleIronPDF:
// 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!");
}
}Imports IronPdf
Imports System
Class Program
Shared Sub Main()
' Create a PDF renderer
Dim renderer = New ChromePdfRenderer()
' Set page size and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait
' Convert URL to PDF
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
' Save to file
pdf.SaveAs("webpage.pdf")
Console.WriteLine("PDF from URL created successfully!")
End Sub
End Class兩個函式庫均提供頁面大小與方向設定。專家級 PDF使用 PdfDocumentOptions.PdfPageSize 和 PdfDocumentOptions.PdfPageOrientation ,而IronPDF則使用 RenderingOptions.PaperSize 和 RenderingOptions.PaperOrientation 。 命名遵循類似模式,但IronPDF使用"Paper"前綴,以便與印刷術語保持一致。
在 URL to PDF 文件中了解更多關於 URL 渲染的資訊。
帶有頁碼的頁首和頁尾
加入頁首和頁尾展示了 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!");
}
}Imports ExpertPdf.HtmlToPdf
Imports System
Class Program
Shared Sub Main()
' Create the PDF converter
Dim pdfConverter As 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
Dim pdfBytes As Byte() = 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!")
End Sub
End ClassIronPDF:
// 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!");
}
}Imports IronPdf
Imports System
Class Program
Shared Sub Main()
' Create a PDF renderer
Dim renderer = New ChromePdfRenderer()
' Configure header
renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
.CenterText = "Document Header",
.DrawDividerLine = True
}
' Configure footer with page numbers
renderer.RenderingOptions.TextFooter = New TextHeaderFooter() With {
.RightText = "Page {page} of {total-pages}",
.DrawDividerLine = True
}
' Convert HTML file to PDF
Dim pdf = renderer.RenderHtmlFileAsPdf("input.html")
' Save to file
pdf.SaveAs("output-with-header-footer.pdf")
Console.WriteLine("PDF with headers and footers created successfully!")
End Sub
End ClassExpert PDF 需要使用布林旗標來啟用頁首/頁尾 (ShowHeader = true),並使用基於文字的設定,分別使用 &p; 和 &P; 來表示目前頁面和總頁數。 IronPdf 使用具有特定位置屬性 (CenterText, RightText) 和{page}/{總頁數}占位符的 TextHeaderFooter 物件。IronPDF還提供 DrawDividerLine 以進行視覺分隔。
對於完整的 HTML 控制,IronPDF 也支援 HtmlHeaderFooter 允許在頁首和頁尾中使用完整的 HTML/CSS 造型。
方法映射參考
對於評估專家級 PDF遷移或比較功能的開發人員而言,此對應會顯示等效的操作:
核心類映射
| 專家級 PDF | IronPDF |
|---|---|
PdfConverter | ChromePdfRenderer |
PdfDocumentOptions | ChromePdfRenderOptions |
PdfSecurityOptions | PdfDocument.SecuritySettings |
PdfHeaderOptions | HtmlHeaderFooter 或 TextHeaderFooter |
PdfFooterOptions | HtmlHeaderFooter 或 TextHeaderFooter |
PDFMerge | PdfDocument.Merge() |
方法映射
| 專家級 PDF | IronPDF |
|---|---|
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)。 |
配置映射
| 專家級 PDF | IronPDF |
|---|---|
PdfDocumentOptions.PdfPageSize=PdfPageSize.A4。 | RenderingOptions.PaperSize=PdfPaperSize.A4渲染選項。 |
PdfDocumentOptions.PdfPageOrientation = Portrait。 | RenderingOptions.PaperOrientation=PdfPaperOrientation.Portrait渲染選項。 |
PdfDocumentOptions.MarginTop | RenderingOptions.MarginTop |
pdfConverter.LicenseKey = "..." | IronPdf.License.LicenseKey="..."。 |
頁碼代號
| 專家級 PDF | IronPDF |
|---|---|
&p; (目前頁面) | {page} |
&P; (總頁數) | {總頁數} |
功能比較摘要
| 特點 | 專家級 PDF | IronPDF |
|---|---|---|
| HTML 至 PDF | ✅ | ✅ |
| URL 至 PDF | ✅ | ✅ |
| HTML 檔案轉 PDF | ✅ | ✅ |
| 標題/頁腳 | ✅(以文字為基礎) | ✅ (HTML 或文字) |
| 頁面編號 | ✅ (&p;/&P;) | ✅ ({page}/{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 的轉換,但它們代表了技術時間線上的不同點。Expert PDF 提供既有的功能,但自 2018 年起文件就被凍結、傳統的 Chrome 渲染引擎限制了 CSS3 支援,以及需要多重授權的零散產品模式。
IronPdf 提供了一個現代化的選擇,採用最新的 Chromium 渲染技術、每月持續更新、全面的說明文件,以及整合功能的多合一套件。 對於需要當前 CSS3 支援、主動維護或跨平台部署的團隊,IronPDF 可滿足這些特定需求。
由於組織會規劃 .NET 10、C# 14 以及到 2026 年的應用程式開發,因此選擇取決於特定的優先順序。 擁有已建立的專家級 PDF實作和簡單 HTML 佈局的團隊可能會繼續找到足夠的結果。 對於現代網頁設計、主動安全修補程式和整合授權,IronPdf 提供了更適合的方法。