比较

iText 与 IronPDF:技术比较指南

本次比较从相关技术方面考察了这两个库,以帮助开发人员和架构师针对其 .NET PDF 需求做出明智的决策。

iText/ iText概述

iText 是一个双重许可的 PDF 库,允许从头开始创建 PDF,修改现有文档,并执行添加文本、图像和安全功能等任务。 该库使用编程API方法,开发人员可通过使用Cell等类来构建PDF内容。

iText使用命名空间如iText.Html2pdf。 PDF创建过程涉及创建一个Document。 文本通过ImageDataFactory处理。

对于HTML到PDF的转换,iText需要单独的pdfHTML插件,可通过HtmlConverter.ConvertToPdf()方法实现。 此附加组件需单独购买,并需额外付费。

iText 采用 AGPL 许可证,该许可证要求任何在 Web 应用程序中包含 AGPL 代码的软件也必须以开源形式发布,否则开发者必须购买商业许可证。iText取消了永久许可,商业用途需要每年续订。

IronPDF概览

IronPDF 是一个商用 PDF 库,专为喜欢使用 HTML 和 CSS 而非编程式 PDF 构建的 .NET 开发人员设计。 该库使用现代 Chromium 渲染引擎,可准确渲染 HTML5、CSS3、JavaScript 以及 Flexbox 和 Grid 等现代布局系统。

IronPDF使用RenderHtmlFileAsPdf()等方法。 该库返回的BinaryData访问。 配置使用RenderingOptions属性来设置纸张尺寸、边距、页眉和页脚。

IronPDF 提供永久许可和订购许可两种选择,没有病毒许可要求。 HTML 到 PDF 的转换已内置在基本产品中,无需单独的附加组件。

许可和业务模式比较

这些库之间最大的区别在于许可和业务影响。

特征iText / iTextIronPDF
许可AGPL(病毒式)或昂贵的订阅商业、永久选项
HTML-to-PDF单独的 pdfHTML 附加组件(额外收费)内置 Chromium 渲染器
开源风险必须是 AGPL 下的开源网络应用程序无病毒要求
定价模式仅限订阅永久或订阅
永久选项消除可提供

对于商业网络应用程序来说,AGPL 许可证陷阱尤其棘手。 如果您在未购买商业许可证的情况下在网络应用程序中使用 iText,则 AGPL 要求您将整个应用程序开源,不仅仅是 PDF 代码,而是整个代码库。

API 范例比较

不同库的基本 API 设计理念有很大不同。

方面iTextIronPDF
API范例程式化(段落、表格、单元格)HTML 优先,带 CSS
CSS支持基本 CSS(通过 pdfHTML 附加组件)完全 CSS3、Flexbox、网格
JavaScript语言None全面执行
学习曲线陡峭(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需要单独的HtmlConverter.ConvertToPdf()直接写入流。

IronPDF创建一个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需要创建一个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要求为输出创建一个merger.Merge()与页面范围,并管理所有对象的处理。

IronPDF通过PdfDocument.Merge()方法。 操作明显更加简洁。

IronPDF 教程中了解有关 PDF 操作的更多信息。

API 映射参考

对于评估iText迁移或比较功能的开发人员,本映射显示了等效操作:

类映射

iText类iText类IronPDF 同等产品
PdfWriterPdfWriterChromePdfRenderer
PdfDocumentDocumentPdfDocument
DocumentDocumentChromePdfRenderer.RenderHtmlAsPdf()
ParagraphParagraphHTML <h1>,等等。
TablePdfPTableHTML <table>
CellPdfPCellHTML <th>
ImageImageHTML <img>
ListListHTML <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()
合并 PDFPdfMerger.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 许可对商业 Web 应用程序的限制非常严格。 如果您在未购买商业许可证的情况下在网络应用程序中使用 iText,则 AGPL 要求您将整个应用程序开源,不仅仅是 PDF 代码,而是整个代码库。 开发专有软件的团队通常无法接受这种病毒式的 License 要求。

订阅制商业许可:iText已取消永久许可,商业用途需每年续订订阅。 喜欢一次性购买的团队认为IronPDF的永久 License 选项更适合预算编制。

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 优先范式,通常会显著减少代码量。 需要使用Paragraph对象的数十行报告表格变为简单的HTML表格和CSS样式。

优势和考虑因素

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构建,使用Cell类,但有显著的许可问题——AGPL要求开源Web应用程序,永久许可已被取消,HTML到PDF需要单独购买pdfHTML插件。

IronPDF 提供了一个现代化的替代方案,使用 Chromium 引擎进行内置 HTML 到 PDF 的转换,提供永久许可选项,并且没有病毒许可要求。 HTML 优先的方法允许网络开发人员直接应用现有的技能,通常会产生更简单、更易维护的代码。

随着企业对 .NET 10、C# 14 以及 2026 年之前的应用程序开发进行规划,在 AGPL 许可的程序化 PDF 构建和商业许可的基于 HTML 的渲染之间做出选择,会对法律合规性和开发效率产生重大影响。 寻求消除 AGPL 风险、降低 License 复杂性或利用网络开发技能生成 PDF 的团队会发现IronPDF能有效满足这些要求。

通过免费试用开始评估 IronPDF,并浏览全面的文档以评估是否适合您的特定需求。

请注意iText是一种注册商标,其各自所有者拥有其商标。 本网站与iTextGroup 无关,也未得到iTextGroup 的支持或赞助。所有产品名称、徽标和品牌均为其各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。)}]