比較

iText vs IronPDF:技術比較指南

本次比較從相關技術方面考察了這兩個程式庫,以幫助開發人員和架構師針對其 .NET PDF 需求做出明智的決策。

iText/iTextSharp概述

iText 是一個雙重授權的 PDF 庫,允許從頭開始建立 PDF,修改現有文檔,並執行新增文字、影像和安全功能等任務。 本函式庫採用程式化 API 方法,開發人員可以使用PdfWriterPDF 文件文件段落TableCell等類別來建立 PDF 內容。

iText 7 使用iText.Kernel.PdfiText.LayoutiText.Layout.ElementiText.Html2pdf等命名空間。 PDF 建立過程包括建立一個PdfWriter ,將其包裝在PdfDocument中,然後建立一個Document用於內容佈局。 文字透過段落物件新增,表格透過表格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 / iTextSharpIronPDF
執照AGPL(病毒式)或昂貴的訂閱商業、永久選項
HTML轉PDF單獨的 pdfHTML 附加元件(額外費用)內建 Chromium 渲染器
開放原始碼風險必須在 AGPL 下開放源碼網路應用程式無病毒要求
定價模式僅訂閱永久或訂閱
永久選項消除可提供

AGPL 授權陷阱對於商業網路應用程式來說尤其棘手。 如果您在 Web 應用程式中使用iText而未購買商業授權,AGPL 會要求您開放整個應用程式的原始碼 - 不只是 PDF 程式碼,而是整個程式碼庫。

API 範例比較

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

範疇iTextIronPDF
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);
        }
    }
}
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,將其包裝在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());
                }
            }
        }
    }
}
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、建立目標PDF 文件、建立PdfMerger、然後遍歷原始檔案以建立PdfReaderPDF 文件實體、呼叫 merger.Merge() 與頁面範圍,並管理所有物件的棄置。

IronPDF 使用PdfDocument.FromFile()載入文件,建立清單,並呼叫靜態PdfDocument.Merge()方法。 操作上顯得更加簡潔。

IronPDF教學中了解更多關於 PDF 操作的資訊。

API 對應參考。

對於評估iText遷移或比較功能的開發人員而言,此對應會顯示等效的操作:

類映射

iText 7 課程iTextSharp 類別IronPdf 同等級產品
PdfWriterPdfWriterChromePdfRenderer
PDF 文件文件PDF 文件
文件文件ChromePdfRenderer.RenderHtmlAsPdf()
段落段落HTML <p>, <h1> 等。
表格PdfPTableHTML <table>
CellPdfPCellHTML <td>, <th>
圖片圖片HTML <img>
清單清單HTML <ul>, <ol>
清單項目清單項目HTML <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()
儲存為 bytesmemoryStream.ToArray()pdf.BinaryData
開啟現有的 PDFnew PdfDocument(new PdfReader(path))PdfDocument.FromFile()
合併 PDFPdfMerger.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 邊框

功能比較摘要

特點iTextIronPDF
程式化 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 應用程式的限制非常嚴格。 如果您在 Web 應用程式中使用iText而未購買商業授權,AGPL 會要求您開放整個應用程式的原始碼 - 不只是 PDF 程式碼,而是整個程式碼庫。 開發專屬軟體的團隊通常無法接受這種病毒式的 License 要求。

訂閱商業許可:iText已取消永久許可,商業用途需每年續訂訂閱。 喜歡一次性購買的團隊認為IronPDF的永久 License 選項更適合預算。

pdfHTML 插件成本:要使用iText將 HTML 轉換為 PDF,開發人員必須購買單獨的 pdfHTML 插件,這會增加成本和複雜性。IronPDF在基本產品中包含 HTML 到 PDF 的轉換,並採用現代 Chromium 渲染引擎。

程式化 API 複雜性:iText需要手動建立底層 PDF,包括Paragraph表格Cell和其他物件。 具有 Web 開發經驗的團隊會發現IronPDF的 HTML/CSS 方法更直觀、更富有成效。

現代網路標準:即使有了 pdfHTML,iText 對複雜的 CSS 和 JavaScript 的支援也有限。 IronPdf 的 Chromium 引擎可為現代網頁內容提供完整的 CSS3、Flexbox、Grid 和 JavaScript 執行功能。

簡化程式碼庫:從iText的程式化方法轉換為IronPDF的 HTML 優先範式,通常會顯著減少程式碼量。 需要使用 Table,Cell段落物件的幾十行的報表表格,會變成使用 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使用 ParagraphTableCell等類別提供全面的程式化 PDF 建構,但卻有重大的授權問題 - AGPL 要求開放網頁應用程式的原始碼,永久授權已被取消,而HTML 至 PDF則需要另外購買 pdfHTML 附加元件。

IronPDF 提供了一個現代化的選擇,使用 Chromium 引擎進行內建 HTML 到 PDF 的轉換,提供永久授權選項,且無病毒授權要求。 HTML 為先的方法可讓網路開發人員直接應用現有的技能,通常可產生更簡單、更易維護的程式碼。

由於組織要規劃 .NET 10、C# 14 以及到 2026 年的應用程式開發,因此在 AGPL 授權的程式化 PDF 建構與商業授權的 HTML 式渲染之間做出選擇,會對法律合規性與開發生產力造成重大影響。 尋求消除 AGPL 風險、降低 License 複雜性或利用網頁開發技能來產生 PDF 的團隊會發現IronPDF能有效解決這些需求。

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