比较

iText 与 IronPDF:技术比较指南

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

iText/iTextSharp概述

iText 是一个双重许可的 PDF 库,允许从头开始创建 PDF,修改现有文档,并执行添加文本、图像和安全功能等任务。 该库采用程序化 API 方法,开发人员可以使用PdfWriter 、<代码>PDF 文档</代码、<代码>文档</代码、<代码>段落</代码、 TableCell等类来构建 PDF 内容。

iText 7 使用iText.Kernel.PdfiText.LayoutiText.Layout.ElementiText.Html2pdf等命名空间。 PDF 创建过程包括创建一个PdfWriter ,将其包装在PdfDocument中,然后创建一个Document用于内容布局。 文本通过<代码>段落</代码对象添加,表格通过<代码>表格</代码和<代码>单元格</代码对象添加,图像通过<代码>图片</代码类和 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-to-PDF单独的 pdfHTML 附加组件(额外收费)内置 Chromium 渲染器
开源风险必须是 AGPL 下的开源网络应用程序无病毒要求
定价模式仅限订阅永久或订阅
永久选项消除可提供

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

API 范例比较

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

方面iTextIronPDF
API范例程式化(段落、表格、单元格)HTML 优先,带 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);
        }
    }
}
$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</代码并将其封装在<代码>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());
                }
            }
        }
    }
}
$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</代码,创建目标<代码>PDF 文档</代码,创建<代码>PDFMerger</代码,然后遍历源文件以创建<代码>PDF 阅读器</代码和<代码>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>
<代码>单元格</代码<代码>PdfPCell</代码HTML <td>, <th>
<代码>图片</代码<代码>图片</代码HTML <img>
<代码>列表</代码<代码>列表</代码HTML <ul>, <ol>
<代码>列表项</代码<代码>列表项</代码HTML <li>
<代码>PDF 阅读器</代码<代码>PDF 阅读器</代码<代码>PdfDocument.FromFile()</代码
<代码>PDFMerger</代码不适用<代码>PdfDocument.Merge()</代码
<代码>PDFTextExtractor</代码<代码>PDFTextExtractor</代码<代码>pdf.ExtractAllText()</代码

方法映射

任务iText 7IronPDF
从 HTML 创建 PDF<代码>HtmlConverter.ConvertToPdf()</代码<代码>renderer.RenderHtmlAsPdf()</代码
从 URL 创建 PDF下载 HTML + 转换<代码>renderer.RenderUrlAsPdf()</代码
从文件创建 PDF<代码>HtmlConverter.ConvertToPdf(File.ReadAllText())</代码<代码>renderer.RenderHtmlFileAsPdf()</代码
保存到文件<代码>document.Close()</代码>(通过数据流)<代码>pdf.SaveAs()</代码
保存为字节<代码>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
<代码>SetBorder()</代码CSS <代码>边框</代码

功能对比摘要

特征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 应用程序的限制非常严格。 如果您在未购买商业许可证的情况下在网络应用程序中使用 iText,则 AGPL 要求您将整个应用程序开源,不仅仅是 PDF 代码,而是整个代码库。 开发专有软件的团队通常无法接受这种病毒式的 License 要求。

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

pdfHTML 插件成本:要使用iText将 HTML 转换为 PDF,开发人员必须购买单独的 pdfHTML 插件,这会增加成本和复杂性。IronPDF在基础产品中包含 HTML 到 PDF 的转换,并配有现代 Chromium 渲染引擎。

程序化 API 复杂性:iText需要手动构建底层 PDF,包括Paragraph 、<代码>表格</代码、 Cell和其他对象。 具有网络开发经验的团队会发现IronPDF的 HTML/CSS 方法更直观、更富有成效。

现代网络标准:即使有了 pdfHTML,iText 对复杂的 CSS 和 JavaScript 的支持也有限。 IronPdf 的 Chromium 引擎可为现代网页内容提供完整的 CSS3、Flexbox、Grid 和 JavaScript 执行功能。

简化代码库:从iText的程序化方法转换为IronPDF的 HTML 优先范式,通常会显著减少代码量。 需要几十行的 Table,<代码>单元格</代码和<代码>段落</代码对象的报告表格变成了带有 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使用 ParagraphTable 和<代码>单元格</代码等类提供全面的编程式 PDF 构建,但存在重大的许可问题--AGPL 要求开源网络应用程序,永久许可已被取消,HTML-to-PDF 需要单独购买 pdfHTML 附加组件。

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

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

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