iText vs IronPDF:技術比較指南
iTextvs IronPDF:授權、API Paradigms 以及 .NET 中的現代 PDF 生成。
當 .NET 開發人員評估 PDF 函式庫時,iText(包括iText 7和傳統的 iTextSharp)是一個具有廣泛 PDF 操作功能的綜合選擇。 然而,iText 提出了重大的授權問題 - AGPL 授權要求任何使用iText的 Web 應用程式必須開放其整個程式碼庫的原始碼,或支付昂貴的商業訂閱。 IronPdf 提供了一種與眾不同的方法:一個擁有永久授權選項、內建 HTML 至 PDF 轉換以及現代 Chromium 渲染引擎的商業函式庫。
本比較針對技術上相關的層面檢視這兩個函式庫,以協助專業開發人員和架構人員針對他們的 .NET PDF 需求做出明智的決定。
瞭解iText/ iTextSharp。
iText 是雙重授權的 PDF 函式庫,支援從頭生成 PDF、修改現有文件,以及執行新增文字、影像和安全功能等作業。 該函式庫使用程式化的 API 方法,開發人員使用類似 PdfWriter, PdfDocument, Document, Paragraph, Table, 和Cell來建構 PDF 內容。
iText 7 使用命名空間,如 iText.Kernel.Pdf, iText.Layout, iText.Layout.Element, 和 iText.Html2pdf. PDF 的建立遵循一個模式:建立<編碼>PdfWriter</編碼,將它包裝在<編碼>PDF 文件</編碼中,然後再建立一個文件用於內容排版。 文字透過段落物件新增,表格透過表格和Cell物件新增,圖片則透過圖片類與 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 產生機制,其方法包括 RenderHtmlAsPdf(), RenderUrlAsPdf(), 以及 RenderHtmlFileAsPdf() 等。 該函式庫會傳回<編碼>PDF 文件</編碼物件,這些物件可以使用 SaveAs() 儲存或以 BinaryData 的方式存取。 配置使用 RenderingOptions 屬性來設定紙張大小、邊界、頁首和頁尾。
IronPDF 提供永久授權和訂閱授權兩種選擇,無病毒式授權要求。 HTML 到 PDF 的轉換已內建在基本產品中,不需要另外的附加元件。
授權與商業模式比較
這些函式庫最顯著的差異涉及授權和商業影響。
| 特點 | iText 7 / iTextSharp | IronPDF |
|---|---|---|
| 執照 | AGPL(病毒式)或昂貴的訂閱 | 商業、永久選項 |
| HTML轉PDF | 單獨的 pdfHTML 附加元件(額外費用) | 內建 Chromium 渲染器 |
| 開放原始碼風險 | 必須在 AGPL 下開放源碼網路應用程式 | 無病毒要求 |
| 定價模式 | 僅訂閱 | 永久或訂閱 |
| 永久選項 | 消除 | 可提供 |
AGPL 授權陷阱對於商業網路應用程式來說尤其棘手。 如果您在 Web 應用程式中使用iText而未購買商業授權,AGPL 會要求您開放整個應用程式的原始碼 - 不只是 PDF 程式碼,而是整個程式碼庫。
API 範例比較
不同函式庫的基本 API 設計理念有顯著差異。
| 範疇 | iText | IronPDF |
|---|---|---|
| API範例 | 程式化(段落、表格、單元格) | HTML-first與CSS |
| CSS 支援 | 基本 CSS (透過 pdfHTML 附加元件) | 完整的 CSS3、Flexbox、網格 |
| JavaScript。 | 無 | 完全執行 |
| 學習曲線 | 陡峭 (PDF 坐標系統) | 對網路開發人員友善 |
| 內容建構 | 手動低階物件 | HTML 範本 |
iText 透過明確的物件建構,以程式化的方式建立 PDF。 IronPdf 使用 HTML/CSS,讓網頁開發人員可以直接應用現有的技術。
程式碼比較:常見的 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);
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comiText 需要獨立的 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);
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comiText 要求創建一個<編碼>PdfWriter</編碼,將其包裝在<編碼>PDF 文件</編碼中,創建一個文件用於佈局,然後再加入段落物件和透過 ImageDataFactory 創建的圖片物件。 每個元素都需要明確的建構和配置。
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());
}
}
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comiText 需要為輸出建立<編碼>PdfWriter</編碼、建立目標<編碼>PDF 文件</編碼、建立<編碼>PdfMerger</編碼、然後遍歷原始檔案以建立<編碼>PdfReader</編碼和<編碼>PDF 文件</編碼實體、呼叫 merger.Merge() 與頁面範圍,並管理所有物件的棄置。
IronPDF 使用<代碼>PdfDocument.FromFile()</代碼載入文件,建立清單,並呼叫靜態<代碼>PdfDocument.Merge()</代碼方法。 操作上顯得更加簡潔。
在IronPDF教學中了解更多關於 PDF 操作的資訊。
API 對應參考。
對於評估iText遷移或比較功能的開發人員而言,此對應會顯示等效的操作:
類映射
| iText 7 課程 | iTextSharp 類別 | IronPdf 同等級產品 |
|---|---|---|
| <編碼>PdfWriter</編碼 | <編碼>PdfWriter</編碼 | <代碼>ChromePdfRenderer</代碼 |
| <編碼>PDF 文件</編碼 | 文件 | <編碼>PDF 文件</編碼 |
文件 | 文件 | <代碼>ChromePdfRenderer.RenderHtmlAsPdf()</代碼 |
段落 | 段落 | HTML <p>, <h1> 等。 |
表格 | PdfPTable | HTML <table> |
Cell | <編碼>PdfPCell</編碼 | HTML <td>, <th> |
圖片 | 圖片 | HTML <img> |
清單 | 清單 | HTML <ul>, <ol> |
清單項目 | 清單項目 | 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()</代碼 |
| 儲存為 bytes | <代碼>memoryStream.ToArray()</代碼 | <編碼>pdf.BinaryData</編碼 |
| 開啟現有的 PDF | new PdfDocument(new PdfReader(path))。 | <代碼>PdfDocument.FromFile()</代碼 |
| 合併 PDF | <代碼>PdfMerger.Merge()</代碼 | <代碼>PdfDocument.Merge()</代碼 |
| 擷取文字 | <代碼>PdfTextExtractor.GetTextFromPage()</代碼 | <代碼>pdf.ExtractAllText()</代碼 |
樣式對應
| iText 7 方法 | IronPdf 同等級產品 |
|---|---|
設定文字對齊方式(TextAlignment.CENTER)。 | CSS text-align: center |
設定字型大小(12) | CSS font-size: 12px |
| <編碼>SetBold()</編碼 | CSS font-weight: bold。 |
| <程式碼>SetBackgroundColor()</程式碼 | CSS background-color |
設定邊界() | CSS 邊框 |
功能比較摘要
| 特點 | iText | IronPDF |
|---|---|---|
| 程式化 PDF 建構 | ✅(主要方法) | ⚠️ (透過 HTML) |
| HTML 至 PDF | ⚠️ (需要 pdfHTML 附加元件) | ✅ (內建) |
| CSS3 支持 | ⚠️ (Basic via pdfHTML) | ✅ (完整) |
| Flexbox/Grid | ❌ | ✅ |
| JavaScript 執行 | ❌ | ✅ |
| PDF 合併 | ✅ (PdfMerger) | ✅ (PdfDocument.Merge()) |
| 文字擷取 | ✅ (PdfTextExtractor) | ✅ (ExtractAllText()) |
| 永久授權 | ❌(已排除) | ✅ |
| 無 AGPL 風險 | ❌(AGPL 或訂閱) | ✅ |
| 社群支援 | ✅(廣泛) | ✅ |
當團隊考慮從iText轉移到IronPDF時。
開發團隊評估從iText過渡到IronPDF有幾個原因:
AGPL 授權陷阱:AGPL 授權對於商業網路應用程式有很大的限制。 如果您在 Web 應用程式中使用iText而未購買商業授權,AGPL 會要求您開放整個應用程式的原始碼 - 不只是 PDF 程式碼,而是整個程式碼庫。 開發專屬軟體的團隊通常無法接受這種病毒式的 License 要求。
Subscription-Only Commercial Licensing:iText 已取消永久授權,商業使用需每年續訂。 喜歡一次性購買的團隊認為IronPDF的永久 License 選項更適合預算。
pdfHTML 附加元件的成本:若要使用iText將 HTML 轉換為 PDF,開發人員必須投資於單獨的 pdfHTML 附加元件,這會增加成本和複雜性。IronPDF在基本產品中包含 HTML 到 PDF 的轉換,並採用現代 Chromium 渲染引擎。
程式 API 的複雜性:iText 需要使用 Paragraph、Table、Cell 及其他物件手動建立低階 PDF。 具有 Web 開發經驗的團隊會發現IronPDF的 HTML/CSS 方法更直觀、更富有成效。
現代 Web 標準:即使使用 pdfHTML,iText 對複雜 CSS 和 JavaScript 的支援仍然有限。 IronPdf 的 Chromium 引擎可為現代網頁內容提供完整的 CSS3、Flexbox、Grid 和 JavaScript 執行功能。
簡化程式碼庫:從iText的程式化方法轉換到IronPDF的 HTML 第一範例,通常會大幅減少程式碼。 需要使用 Table,Cell和段落物件的幾十行的報表表格,會變成使用 CSS 設定的簡單 HTML 表格。
優勢和考慮因素
iText的優勢
- 全面的功能集: 廣泛的 PDF 操作功能
- 廣泛採用:龐大的社群和廣泛的文件
- 跨平台:適用於各種 .NET 平台
- Fine-Grained Control:針對特殊需求直接操作 PDF 物件
iText注意事項
- AGPL 授權條款:病毒式授權需要開放網路應用程式或商業訂閱
- 僅限訂閱:取消永久授權
- pdfHTML 附加元件:HTML 至 PDF 需要另外購買
- 程式複雜性:PDF 坐標系統的陡峭學習曲線
- 有限的現代 CSS:即使使用 pdfHTML 也能提供基本的 CSS 支援
- No JavaScript:無法在 HTML 內容中執行 JavaScript
IronPDF的優勢
IronPDF注意事項
- 商業授權:必須用於生產用途
- HTML-First範例:與程式化建構不同的方法
結論
iText 和IronPDF代表了在 .NET 應用程式中生成 PDF 的基本不同方法。iText使用 Paragraph、Table 和Cell等類別提供全面的程式化 PDF 建構,但卻有重大的授權問題 - AGPL 要求開放網頁應用程式的原始碼,永久授權已被取消,而HTML 至 PDF則需要另外購買 pdfHTML 附加元件。
IronPDF 提供了一個現代化的選擇,使用 Chromium 引擎進行內建 HTML 到 PDF 的轉換,提供永久授權選項,且無病毒授權要求。 HTML 為先的方法可讓網路開發人員直接應用現有的技能,通常可產生更簡單、更易維護的程式碼。
由於組織要規劃 .NET 10、C# 14 以及到 2026 年的應用程式開發,因此在 AGPL 授權的程式化 PDF 建構與商業授權的 HTML 式渲染之間做出選擇,會對法律合規性與開發生產力造成重大影響。 尋求消除 AGPL 風險、降低 License 複雜性或利用網頁開發技能來產生 PDF 的團隊會發現IronPDF能有效解決這些需求。