比較

BCL EasyPDF SDK與IronPDF:技術比較指南

本比較將通過相關技術方面對兩者進行評估,幫助開發者和架構師為他們的 .NET PDF 需求做出明智的決定。

iText/iText概覽

iText 是一個具有雙重授權的 PDF 程式庫,它允許從頭開始建立 PDF、修改現有文件以及執行新增文字、圖像和安全特性等任務。 該程式庫採用程式化 API 方法,開發者使用 TableCell 類構建 PDF 內容。

iText 使用 iText.Layout.ElementiText.Html2pdf 等命名空間。 PDF 的製作涉及建立一個 PdfWriter、將其包裝在 PdfDocument 中,然後建立一個 Document 以進行內容佈局。 文字通過 Paragraph 物件新增,表格通過 TableCell 物件新增,圖像則通過 Image 類和 ImageDataFactory 新增。

對於 HTML 到 PDF 的轉換,iText 需要單獨的 pdfHTML 外掛,該外掛可以通過 iText.Html2pdf 命名空間與 HtmlConverter.ConvertToPdf() 方法獲得。 此外掛另售,需要額外付費。

iText 以 AGPL 授權提供,這需要任何包含 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/iTextIronPDF
授權AGPL(傳染性)或昂貴的訂閱商業,永久選項
HTML到PDF單獨的 pdfHTML 外掛(額外費用)內建的 Chromium 轉譯器
開源風險必須在 AGPL 下開源網頁應用程式沒有傳染性要求
定價模型僅限訂閱永久或訂閱
永久選項取消可用

AGPL 授權陷阱對於商業網頁應用程式特別成問題。 如果您在網頁應用程式中使用iText而未購買商業授權,AGPL 要求您將整個應用程式開源——不僅僅是 PDF 程式碼,而是整個程式碼庫。

API 範例比較

這些程式庫之間的基本 API 設計理念有很大不同。

方面iTextIronPDF
API 範例程式化 (段落, 表, 單元格)以 HTML 為主導,結合 CSS
CSS支援基本 CSS(通過 pdfHTML 外掛)完整的 CSS3、Flexbox、Grid
JavaScriptNone完整執行
學習曲線陡峭的(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);
        }
    }
}
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
$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");
    }
}
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
$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);
        }
    }
}
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
$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");
    }
}
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
$vbLabelText   $csharpLabel

iText 需要建立一個 PdfWriter,包裝在 PdfDocument 中,建立一個 Document 用於佈局,然後新增 Paragraph 物件和通過 ImageDataFactory 建立的 Image 物件。 每個元素都需要顯式建構和配置。

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

iText 需要建立一個 PdfWriter 作為輸出,建立一個最終的 PdfDocument,建立一個 PdfMerger,然後遍歷源文件來建立 PdfReaderPdfDocument 實例,呼叫帶頁面範圍的 merger.Merge(),並管理所有物件的處置。

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

IronPDF 教程中了解更多關於 PDF 操作的內容。

API映射參考

對於評估iText遷移或比較其功能的開發者,這個對應展示了等價的操作:

類映射

iText類iText類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()

方法對應

任務iTextIronPDF
從 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()
合併PDFsPdfMerger.Merge()PdfDocument.Merge()
提取文字PdfTextExtractor.GetTextFromPage()pdf.ExtractAllText()

樣式對應

iText方法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是 (透過 pdfHTML)
JavaScript執行
PDF合併是 (PdfMerger)是 (PdfDocument.Merge())
文字提取是 (PdfTextExtractor)是 (ExtractAllText())
永久授權否 (取消)
沒有 AGPL 風險否 (AGPL 或訂閱)
社群支援是 (廣泛)

當團隊考慮從iText轉移到 IronPDF

開發團隊因為多個理由評估從iText轉移到 IronPDF:

AGPL 授權陷阱: AGPL 授權對於商業網頁應用程式限制極大。 如果您在網頁應用程式中使用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 引擎提供完整的 CSS3、Flexbox、Grid 和 JavaScript 執行,適用於現代網頁內容。

簡化的程式碼庫: 從iText程式化的方法轉換為IronPDF的 HTML 為主範例通常會顯著減少程式碼。 報告表格需要很多行的 CellParagraph 物件,轉換為簡單的 HTML 表格具有 CSS 設計。

優勢和考量

iText優勢

  • 全面的功能集: 廣泛的 PDF 操作能力
  • 廣泛認可: 大型社群與豐富的文件
  • 跨平台: 能夠運行在各種 .NET 平臺
  • 精細控制: 適用於專業需求的直接 PDF 物件操作

iText注意事項

  • AGPL 授權: 傳染式授權要求開放源程式碼的網頁應用程式或商業訂閱
  • 僅限訂閱: 永久授權已取消
  • pdfHTML 外掛: HTML 到 PDF 需要單獨購買
  • 程式化複雜性: 使用 PDF 座標系統的學習曲線陡峭
  • 有限的現代 CSS: 即使使用 pdfHTML,基本的 CSS 支援
  • 缺乏 JavaScript: 不能在 HTML 內容中執行 JavaScript

IronPDF的優勢

  • 永久授權: 一次性購買的選擇
  • 無 AGPL 風險: 保持專有程式碼不開源
  • 內建的 HTML 到 PDF: 不需要單獨的外掛
  • Chromium 引擎: 支援全 CSS3、Flexbox、Grid、JavaScript
  • 網頁開發者友好: 使用熟悉的 HTML/CSS 技能
  • 更簡單的 API: 為常見操作提供簡潔的方法
  • 全面的資源: 豐富的教程文件

IronPDF考量

  • 商業許可:生產使用需要商業許可
  • HTML 為主範例: 與程式化建構不同的方法

結論

iText 和IronPDF代表了在 .NET 應用程式中生成 PDF 的根本不同的方法。iText提供了使用 TableCell 等類的全面程式化 PDF 建構,但也帶來了重大授權問題——AGPL 要求開放源程式碼的網頁應用程式,永久授權已取消,HTML 到 PDF 需要單獨購買 pdfHTML 外掛。

IronPDF 提供了一個現代化的替代方案,提供內建的 HTML 到 PDF 轉換,使用的是 Chromium 引擎,永久授權選項,且沒有傳染式授權要求。 HTML 為主的方法允許網頁開發者直接應用現有技能,通常會產生更簡單、更易維護的程式碼。

隨著組織規劃 .NET 10、C# 14 和 2026 年的應用程式開發,選擇 AGPL 授權的程式化 PDF 建構還是商業授權的 HTML 基於渲染,對法律合規和開發生產力有重大影響。 尋求消除 AGPL 風險、減少授權複雜性、或利用網頁開發技能進行 PDF 生成的團隊將發現IronPDF有效解決了這些需求。

免費試用 開始評估 IronPDF,並探索全面的文件以評估特定需求的適用性。

請注意iText 是其各自擁有者的註冊商標。 本網站並未與iTextGroup 聯營,亦未得到其認可或贊助。所有產品名稱、標誌及品牌皆為其各自擁有者的財產。 比較僅供資訊參考,並反映了撰寫時公開的資訊。