比較

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.ElementiText.Html2pdf 之類的命名空間。 PDF 建立包括建立一個 PdfWriter,將其包裝在 PdfDocument 中,然後建立一個 Document 用於內容佈局。 文字透過 Paragraph 物件添加,表格透過 TableCell 物件添加,圖像透過 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 / iTextSharpIronPDF
執照AGPL(病毒式傳播)或昂貴的訂閱商業永續選擇權
HTML 轉 PDF單獨的pdfHTML插件(需額外付費)內建 Chromium 渲染器
開源風險必須以 AGPL 協定開源 Web 應用程式。無病毒感染要求
定價模式僅限訂閱用戶永久或訂閱
永續選擇權淘汰可用的

AGPL 授權陷阱對商業 Web 應用程式來說尤其成問題。 如果您在未購買商業許可證的情況下在 Web 應用程式中使用 iText,則 AGPL 要求您開源整個應用程式——不僅僅是 PDF 程式碼,而是整個程式碼庫。

API範式比較

各個函式庫的基本 API 設計理念有顯著差異。

方面iTextIronPDF
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);
        }
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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);
        }
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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());
                }
            }
        }
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

iText 需要為輸出建立一個 PdfWriter,建立一個目標 PdfDocument,建立一個 PdfMerger,然後遍歷原始檔以建立 PdfReaderPdfReaderPdfReader 和 @@--CODE-1817。 merger.Merge(),並管理所有物件的處置。

IronPDF使用 PdfDocument.FromFile() 載入文檔,建立一個列表,並呼叫靜態 PdfDocument.Merge() 方法。 操作步驟明顯更簡潔。

欲了解更多關於 PDF 操作的信息,請參閱IronPDF教學

API對應參考

對於正在評估 iText 遷移或比較功能的開發人員來說,此映射顯示了等效操作:

類別映射

iText 7 課iTextSharp 類IronPDF當量
PdfWriterPdfWriterChromePdfRenderer
PdfDocumentDocumentPdfDocument
DocumentDocumentChromePdfRenderer.RenderHtmlAsPdf()
ParagraphParagraphHTML <p>, <h1> 等。
TablePdfPTableHTML <table>
CellPdfPCellHTML <td>, <th>
ImageImageHTML <img>
ListListHTML <ul>, <ol>
ListItemListItemHTML <li>
PdfReaderPdfReaderPdfDocument.FromFile()
PdfMerger不適用PdfDocument.Merge()
PdfTextExtractorPdfTextExtractorpdf.ExtractAllText()

方法映射

任務iText 7IronPDF
從 HTML 建立 PDFHtmlConverter.ConvertToPdf()renderer.RenderHtmlAsPdf()
從 URL 建立 PDF下載 HTML 並轉換renderer.RenderUrlAsPdf()
從文件建立 PDFHtmlConverter.ConvertToPdf(File.ReadAllText())renderer.RenderHtmlFileAsPdf()
儲存到文件document.Close()(透過串流媒體)pdf.SaveAs()
儲存為位元組memoryStream.ToArray()pdf.BinaryData
開啟現有PDFnew PdfDocument(new PdfReader(path))PdfDocument.FromFile()
合併PDFPdfMerger.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

功能對比總結

特徵iTextIronPDF
程序化 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 優先範式,通常會顯著減少程式碼量。 需要數十行包含 CellParagraph 物件的報表表格,會變成具有 CSS 樣式的簡單 HTML 表格。

優勢與考量

iText 的優勢

-功能全面:強大的 PDF 處理功能 -廣泛應用:龐大的使用者群體和詳盡的文檔 -跨平台:可在各種.NET平台上運行 -精細控制:直接操作 PDF 物件以滿足特定需求

iText 注意事項

  • AGPL 授權:病毒式授權需要開源 Web 應用程式或商業訂閱 -僅限訂閱:取消永久授權
  • pdfHTML 外掛: HTML 轉 PDF 功能需另外購買。 -程序化複雜度: PDF座標系的學習曲線陡峭 -現代 CSS 支援有限:即使使用 pdfHTML 也僅支援基本的 CSS -不支援JavaScript:無法在 HTML 內容中執行JavaScript

IronPDF 的優勢

永久授權:一次性購買選項 -無AGPL風險:保持專有程式碼閉源 -內建 HTML 轉 PDF 功能:無需單獨的插件

  • Chromium 核心:完全支援 CSS3、Flexbox、Grid 和JavaScript -對 Web 開發人員友善:使用熟悉的 HTML/CSS 技能 -更簡潔的 API:常用操作的簡潔方法 -豐富的資源:大量的教學文檔

IronPDF注意事項

-商業許可:生產用途必需

  • HTML優先範式:與程式化建構不同的方法

結論

iText 和IronPDF代表了.NET應用程式中產生 PDF 的兩種截然不同的方法。 iText 提供全面的程式化 PDF 建置功能,使用諸如 TableCell 之類的類,但存在嚴重的許可問題——AGPL 要求開源 Web 應用程式,永久許可已被取消,並且 轉印 PDF 需要單獨購買。

IronPDF提供了一種現代化的替代方案,它使用 Chromium 引擎內建 HTML 到 PDF 轉換功能,提供永久許可選項,並且沒有病毒式許可要求。 HTML優先方法讓Web開發人員直接應用現有技能,通常會產生更簡單、更易於維護的程式碼。

隨著各組織規劃.NET 10、C# 14 以及到 2026 年的應用程式開發,在 AGPL 許可的程序化 PDF 構建和商業許可的基於 HTML 的渲染之間進行選擇,會對法律合規性和開發效率產生重大影響。 對於希望消除 AGPL 風險、降低許可複雜性或利用 Web 開發技能產生 PDF 的團隊而言, IronPDF可以有效地滿足這些需求。

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