iText vs IronPDF:技術比較指南
本次比較從相關技術方面考察了這兩個程式庫,以幫助開發人員和架構師針對其.NET PDF 需求做出明智的決策。
iText/iTextSharp 概述
iText 是一個雙重授權的 PDF 庫,允許從頭開始建立 PDF,修改現有文檔,並執行新增文字、影像和安全功能等任務。 本函式庫採用程式化 API 方法,開發人員可以使用諸如 Table 和 @--CODE-1775--@@、Table 和 @@CO-1775--@@、Table 和 @@CO-1777--DE-1777--DE-17772 內容。
iText 7 使用諸如 iText.Layout.Element 和 iText.Html2pdf 之類的命名空間。 PDF 建立包括建立一個 PdfWriter,將其包裝在 PdfDocument 中,然後建立一個 Document 用於內容佈局。 文字透過 Paragraph 物件添加,表格透過 Table 和 Cell 物件添加,圖像透過 Image 類別和 ImageDataFactory 新增。
對於 HTML 到 PDF 的轉換,iText 需要單獨的 pdfHTML 插件,可透過 iText.Html2pdf 命名空間和 HtmlConverter.ConvertToPdf() 方法取得。 此附加組件需單獨購買,並需額外付費。
iText 採用 AGPL 許可證,該許可證要求任何在 Web 應用程式中包含 AGPL 程式碼的軟體也必須以開源形式發布,否則開發者必須購買商業許可證。 iText 取消了永久授權,商業用途需每年續訂訂閱。
IronPDF概述
IronPDF是一個商業 PDF 庫,專為喜歡使用 HTML 和 CSS 而不是以程式設計方式建立 PDF 的.NET開發人員而設計。 本函式庫使用現代 Chromium 渲染引擎,可精確渲染 HTML5、CSS3、 JavaScript以及 Flexbox 和 Grid 等現代佈局系統。
IronPDF使用 ChromePdfRenderer 類別作為其主要的 PDF 生成機制,並具有 RenderUrlAsPdf() 和 RenderHtmlFileAsPdf() 等方法。 該庫返回 PdfDocument 對象,這些對象可以用 SaveAs() 保存,也可以用 BinaryData 存取。 配置使用 RenderingOptions 屬性來設定紙張大小、邊距、頁首和頁尾。
IronPDF提供永久許可和訂閱許可兩種選擇,且無病毒式許可要求。 此基礎產品內建了 HTML 轉 PDF 功能,無需單獨的插件。
授權和商業模式比較
這些庫之間最顯著的差異在於許可和商業影響。
| 特徵 | iText 7 / iTextSharp | IronPDF |
|---|---|---|
| 執照 | AGPL(病毒式傳播)或昂貴的訂閱 | 商業永續選擇權 |
| HTML 轉 PDF | 單獨的pdfHTML插件(需額外付費) | 內建 Chromium 渲染器 |
| 開源風險 | 必須以 AGPL 協定開源 Web 應用程式。 | 無病毒感染要求 |
| 定價模式 | 僅限訂閱用戶 | 永久或訂閱 |
| 永續選擇權 | 淘汰 | 可用的 |
AGPL 授權陷阱對商業 Web 應用程式來說尤其成問題。 如果您在未購買商業許可證的情況下在 Web 應用程式中使用 iText,則 AGPL 要求您開源整個應用程式——不僅僅是 PDF 程式碼,而是整個程式碼庫。
API範式比較
各個函式庫的基本 API 設計理念有顯著差異。
| 方面 | iText | IronPDF |
|---|---|---|
| API範式 | 程序化(段落、表格、單元格) | HTML優先,CSS優先 |
| CSS 支援 | 基礎 CSS(透過 pdfHTML 插件) | 完整的 CSS3、Flexbox 和 Grid 架構 |
| JavaScript | 沒有任何 | 全面執行 |
| 學習曲線 | 陡峭(PDF座標系) | 對網路開發人員友好 |
| 內容建構 | 手動低階對象 | HTML模板 |
iText 透過顯式物件建構以程式設計方式建構 PDF。 IronPDF使用 HTML/CSS,使 Web 開發人員能夠直接應用現有技能。
程式碼比較:常見 PDF 操作
HTML 轉 PDF
最基本的操作演示了不同的方法和附加要求。
iText(需要 pdfHTML 外掛程式):
// NuGet: Install-Package itext7
using iText.Html2pdf;
using System.IO;
class Program
{
static void Main()
{
string html = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>";
string outputPath = "output.pdf";
using (FileStream fs = new FileStream(outputPath, FileMode.Create))
{
HtmlConverter.ConvertToPdf(html, fs);
}
}
}
// NuGet: Install-Package itext7
using iText.Html2pdf;
using System.IO;
class Program
{
static void Main()
{
string html = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>";
string outputPath = "output.pdf";
using (FileStream fs = new FileStream(outputPath, FileMode.Create))
{
HtmlConverter.ConvertToPdf(html, fs);
}
}
}
Imports iText.Html2pdf
Imports System.IO
Class Program
Shared Sub Main()
Dim html As String = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
Dim outputPath As String = "output.pdf"
Using fs As FileStream = New FileStream(outputPath, FileMode.Create)
HtmlConverter.ConvertToPdf(html, fs)
End Using
End Sub
End Class
IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html As String = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
iText 需要單獨的 iText.Html2pdf 命名空間(來自 pdfHTML 外掛程式),手動建立 FileStream,並呼叫 HtmlConverter.ConvertToPdf() 直接寫入流。
IronPDF建立 ChromePdfRenderer,使用 HTML 字串呼叫 RenderHtmlAsPdf(),並使用 SaveAs() 儲存。 Chromium 核心無需額外插件即可提供完整的 CSS3 和JavaScript支援。
如需了解進階 HTML 渲染選項,請參閱HTML 轉 PDF 轉換指南。
建立包含文字和圖像的 PDF 文件
程式化 PDF 建置最清晰地展現了這種範式差異。
iText:
// NuGet: Install-Package itext7
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.IO.Image;
class Program
{
static void Main()
{
string outputPath = "document.pdf";
using (PdfWriter writer = new PdfWriter(outputPath))
using (PdfDocument pdf = new PdfDocument(writer))
using (Document document = new Document(pdf))
{
document.Add(new Paragraph("Sample PDF Document"));
document.Add(new Paragraph("This document contains text and an image."));
Image img = new Image(ImageDataFactory.Create("image.jpg"));
img.SetWidth(200);
document.Add(img);
}
}
}
// NuGet: Install-Package itext7
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.IO.Image;
class Program
{
static void Main()
{
string outputPath = "document.pdf";
using (PdfWriter writer = new PdfWriter(outputPath))
using (PdfDocument pdf = new PdfDocument(writer))
using (Document document = new Document(pdf))
{
document.Add(new Paragraph("Sample PDF Document"));
document.Add(new Paragraph("This document contains text and an image."));
Image img = new Image(ImageDataFactory.Create("image.jpg"));
img.SetWidth(200);
document.Add(img);
}
}
}
Imports iText.Kernel.Pdf
Imports iText.Layout
Imports iText.Layout.Element
Imports iText.IO.Image
Class Program
Shared Sub Main()
Dim outputPath As String = "document.pdf"
Using writer As New PdfWriter(outputPath),
pdf As New PdfDocument(writer),
document As New Document(pdf)
document.Add(New Paragraph("Sample PDF Document"))
document.Add(New Paragraph("This document contains text and an image."))
Dim img As New Image(ImageDataFactory.Create("image.jpg"))
img.SetWidth(200)
document.Add(img)
End Using
End Sub
End Class
IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = @"
<h1>Sample PDF Document</h1>
<p>This document contains text and an image.</p>
<img src='image.jpg' width='200' />";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("document.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string html = @"
<h1>Sample PDF Document</h1>
<p>This document contains text and an image.</p>
<img src='image.jpg' width='200' />";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("document.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html As String = "
<h1>Sample PDF Document</h1>
<p>This document contains text and an image.</p>
<img src='image.jpg' width='200' />"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("document.pdf")
End Sub
End Class
iText 需要建立一個 PdfWriter,將其包裝在 PdfDocument 中,建立一個 Document 用於佈局,然後新增 Paragraph 物件和透過 Paragraph 物件和透過 @@--CODE-1811--CODE-181-- 每個元素都需要明確的構造和配置。
IronPDF使用標準 HTML——標題、段落和 <img> 標籤——所有這些都使用熟悉的 HTML 屬性或 CSS 進行樣式設定。 Chromium 引擎負責渲染,用更少的程式碼就能產生相同的效果。
合併多個PDF文件
文件合併體現了 API 複雜性的差異。
iText:
// NuGet: Install-Package itext7
using iText.Kernel.Pdf;
using iText.Kernel.Utils;
using System.IO;
class Program
{
static void Main()
{
string outputPath = "merged.pdf";
string[] inputFiles = { "document1.pdf", "document2.pdf", "document3.pdf" };
using (PdfWriter writer = new PdfWriter(outputPath))
using (PdfDocument pdfDoc = new PdfDocument(writer))
{
PdfMerger merger = new PdfMerger(pdfDoc);
foreach (string file in inputFiles)
{
using (PdfDocument sourcePdf = new PdfDocument(new PdfReader(file)))
{
merger.Merge(sourcePdf, 1, sourcePdf.GetNumberOfPages());
}
}
}
}
}
// NuGet: Install-Package itext7
using iText.Kernel.Pdf;
using iText.Kernel.Utils;
using System.IO;
class Program
{
static void Main()
{
string outputPath = "merged.pdf";
string[] inputFiles = { "document1.pdf", "document2.pdf", "document3.pdf" };
using (PdfWriter writer = new PdfWriter(outputPath))
using (PdfDocument pdfDoc = new PdfDocument(writer))
{
PdfMerger merger = new PdfMerger(pdfDoc);
foreach (string file in inputFiles)
{
using (PdfDocument sourcePdf = new PdfDocument(new PdfReader(file)))
{
merger.Merge(sourcePdf, 1, sourcePdf.GetNumberOfPages());
}
}
}
}
}
Imports iText.Kernel.Pdf
Imports iText.Kernel.Utils
Imports System.IO
Class Program
Shared Sub Main()
Dim outputPath As String = "merged.pdf"
Dim inputFiles As String() = {"document1.pdf", "document2.pdf", "document3.pdf"}
Using writer As New PdfWriter(outputPath)
Using pdfDoc As New PdfDocument(writer)
Dim merger As New PdfMerger(pdfDoc)
For Each file As String In inputFiles
Using sourcePdf As New PdfDocument(New PdfReader(file))
merger.Merge(sourcePdf, 1, sourcePdf.GetNumberOfPages())
End Using
Next
End Using
End Using
End Sub
End Class
IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdfDocuments = new List<PdfDocument>
{
PdfDocument.FromFile("document1.pdf"),
PdfDocument.FromFile("document2.pdf"),
PdfDocument.FromFile("document3.pdf")
};
var merged = PdfDocument.Merge(pdfDocuments);
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdfDocuments = new List<PdfDocument>
{
PdfDocument.FromFile("document1.pdf"),
PdfDocument.FromFile("document2.pdf"),
PdfDocument.FromFile("document3.pdf")
};
var merged = PdfDocument.Merge(pdfDocuments);
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Imports System.Collections.Generic
Class Program
Shared Sub Main()
Dim pdfDocuments As New List(Of PdfDocument) From {
PdfDocument.FromFile("document1.pdf"),
PdfDocument.FromFile("document2.pdf"),
PdfDocument.FromFile("document3.pdf")
}
Dim merged = PdfDocument.Merge(pdfDocuments)
merged.SaveAs("merged.pdf")
End Sub
End Class
iText 需要為輸出建立一個 PdfWriter,建立一個目標 PdfDocument,建立一個 PdfMerger,然後遍歷原始檔以建立 PdfReader 和 PdfReader 和 PdfReader 和 @@--CODE-1817。 merger.Merge(),並管理所有物件的處置。
IronPDF使用 PdfDocument.FromFile() 載入文檔,建立一個列表,並呼叫靜態 PdfDocument.Merge() 方法。 操作步驟明顯更簡潔。
欲了解更多關於 PDF 操作的信息,請參閱IronPDF教學。
API對應參考
對於正在評估 iText 遷移或比較功能的開發人員來說,此映射顯示了等效操作:
類別映射
| iText 7 課 | iTextSharp 類 | IronPDF當量 |
|---|---|---|
PdfWriter |
PdfWriter |
ChromePdfRenderer |
PdfDocument |
Document |
PdfDocument |
Document |
Document |
ChromePdfRenderer.RenderHtmlAsPdf() |
Paragraph |
Paragraph |
HTML <p>, <h1> 等。 |
Table |
PdfPTable |
HTML <table> |
Cell |
PdfPCell |
HTML <td>, <th> |
Image |
Image |
HTML <img> |
List |
List |
HTML <ul>, <ol> |
ListItem |
ListItem |
HTML <li> |
PdfReader |
PdfReader |
PdfDocument.FromFile() |
PdfMerger |
不適用 | PdfDocument.Merge() |
PdfTextExtractor |
PdfTextExtractor |
pdf.ExtractAllText() |
方法映射
| 任務 | iText 7 | IronPDF |
|---|---|---|
| 從 HTML 建立 PDF | HtmlConverter.ConvertToPdf() |
renderer.RenderHtmlAsPdf() |
| 從 URL 建立 PDF | 下載 HTML 並轉換 | renderer.RenderUrlAsPdf() |
| 從文件建立 PDF | HtmlConverter.ConvertToPdf(File.ReadAllText()) |
renderer.RenderHtmlFileAsPdf() |
| 儲存到文件 | document.Close()(透過串流媒體) |
pdf.SaveAs() |
| 儲存為位元組 | memoryStream.ToArray() |
pdf.BinaryData |
| 開啟現有PDF | new PdfDocument(new PdfReader(path)) |
PdfDocument.FromFile() |
| 合併PDF | PdfMerger.Merge() |
PdfDocument.Merge() |
| 提取文字 | PdfTextExtractor.GetTextFromPage() |
pdf.ExtractAllText() |
樣式映射
| iText 7 方法 | IronPDF當量 |
|---|---|
SetTextAlignment(TextAlignment.CENTER) |
CSS text-align: center |
SetFontSize(12) |
CSS font-size: 12px |
SetBold() |
CSS font-weight: bold |
SetBackgroundColor() |
CSS background-color |
SetBorder() |
CSS border |
功能對比總結
| 特徵 | iText | IronPDF |
|---|---|---|
| 程序化 PDF 構建 | ✅(主要方法) | ⚠️(透過 HTML) |
| HTML 轉 PDF | ⚠️(需要 pdfHTML 插件) | ✅(內建) |
| CSS3 支持 | ⚠️(基本格式為pdfHTML) | ✅(完整版) |
| Flexbox/Grid | ❌ | ✅ |
| JavaScript執行 | ❌ | ✅ |
| PDF合併 | ✅ (PdfMerger) |
✅ (PdfDocument.Merge()) |
| 文字擷取 | ✅ (PdfTextExtractor) |
✅ (ExtractAllText()) |
| 永久許可 | ❌(已淘汰) | ✅ |
| 無AGPL風險 | ❌(AGPL 或訂閱) | ✅ |
| 社區支持 | ✅(詳盡) | ✅ |
當團隊考慮從 iText 遷移到IronPDF時
開發團隊基於以下幾個原因評估從 iText 過渡到IronPDF :
AGPL 授權陷阱: AGPL 授權對商業 Web 應用程式的限制非常嚴格。 如果您在未購買商業許可證的情況下在 Web 應用程式中使用 iText,則 AGPL 要求您開源整個應用程式——不僅僅是 PDF 程式碼,而是整個程式碼庫。 開發專有軟體的團隊通常無法接受這種病毒式許可要求。
訂閱商業許可: iText 已取消永久許可,商業用途需每年續訂訂閱。 對於偏好一次性購買的團隊來說,IronPDF 的永久許可選項更適合預算。
pdfHTML 插件成本:要使用 iText 將 HTML 轉換為 PDF,開發人員必須購買單獨的 pdfHTML 插件,這會增加成本和複雜性。 IronPDF 的基礎產品包含 HTML 到 PDF 的轉換功能,並採用現代化的 Chromium 渲染引擎。
程式化 API 複雜性: iText 需要手動建立底層 PDF,使用 Cell 和其他物件。 有網頁開發經驗的團隊發現 IronPDF 的 HTML/CSS 方法更直覺、更有效率。
現代網路標準:即使使用 pdfHTML,iText 對複雜的 CSS 和JavaScript 的支援也有限。 IronPDF 的 Chromium 引擎為現代 Web 內容提供完整的 CSS3、Flexbox、Grid 和JavaScript執行功能。
簡化程式碼庫:從 iText 的程式化方法轉換為 IronPDF 的 HTML 優先範式,通常會顯著減少程式碼量。 需要數十行包含 Cell 和 Paragraph 物件的報表表格,會變成具有 CSS 樣式的簡單 HTML 表格。
優勢與考量
iText 的優勢
-功能全面:強大的 PDF 處理功能 -廣泛應用:龐大的使用者群體和詳盡的文檔 -跨平台:可在各種.NET平台上運行 -精細控制:直接操作 PDF 物件以滿足特定需求
iText 注意事項
- AGPL 授權:病毒式授權需要開源 Web 應用程式或商業訂閱 -僅限訂閱:取消永久授權
- pdfHTML 外掛: HTML 轉 PDF 功能需另外購買。 -程序化複雜度: PDF座標系的學習曲線陡峭 -現代 CSS 支援有限:即使使用 pdfHTML 也僅支援基本的 CSS -不支援JavaScript:無法在 HTML 內容中執行JavaScript
IronPDF 的優勢
永久授權:一次性購買選項 -無AGPL風險:保持專有程式碼閉源 -內建 HTML 轉 PDF 功能:無需單獨的插件
IronPDF注意事項
-商業許可:生產用途必需
- HTML優先範式:與程式化建構不同的方法
結論
iText 和IronPDF代表了.NET應用程式中產生 PDF 的兩種截然不同的方法。 iText 提供全面的程式化 PDF 建置功能,使用諸如 Table 和 Cell 之類的類,但存在嚴重的許可問題——AGPL 要求開源 Web 應用程式,永久許可已被取消,並且 轉印 PDF 需要單獨購買。
IronPDF提供了一種現代化的替代方案,它使用 Chromium 引擎內建 HTML 到 PDF 轉換功能,提供永久許可選項,並且沒有病毒式許可要求。 HTML優先方法讓Web開發人員直接應用現有技能,通常會產生更簡單、更易於維護的程式碼。
隨著各組織規劃.NET 10、C# 14 以及到 2026 年的應用程式開發,在 AGPL 許可的程序化 PDF 構建和商業許可的基於 HTML 的渲染之間進行選擇,會對法律合規性和開發效率產生重大影響。 對於希望消除 AGPL 風險、降低許可複雜性或利用 Web 開發技能產生 PDF 的團隊而言, IronPDF可以有效地滿足這些需求。