iText 与 IronPDF:技术比较指南
iText与 IronPDF:许可、API 范例和 .NET 中的现代 PDF 生成。
当 .NET 开发人员评估 PDF 库时,iText(包括iText 7和传统的 iTextSharp)成为具有广泛 PDF 操作能力的综合选择。 然而,iText 带来了重大的许可证问题--AGPL 许可证要求任何使用iText的网络应用程序必须开源其整个代码库,或者支付昂贵的商业订阅费用。 IronPdf 提供了一种与众不同的方法:一个具有永久许可选项、内置 HTML 到 PDF 转换功能和现代 Chromium 渲染引擎的商业库。
本比较从技术相关的维度对这两个库进行了研究,以帮助专业开发人员和架构师针对其 .NET PDF 需求做出明智的决定。
了解iText/ iTextSharp.
iText 是一个拥有双重许可证的 PDF 库,支持从头开始生成 PDF、修改现有文档以及执行添加文本、图像和安全功能等操作。 该库使用编程式 API 方法,开发人员使用 PdfWriter, PdfDocument, Document, Paragraph,<代码>表格</代码和<代码>单元格</代码等类构建 PDF 内容。
iText 7 使用的命名空间包括:iText.Kernel.Pdf、iText.Layout、iText.Layout.Element 和 iText.Html2pdf。 PDF 创建遵循的模式是创建<代码>PdfWriter</代码并将其封装在<代码>PDF 文档</代码中,然后创建<代码>文档</代码用于内容布局。 文本通过<代码>段落</代码对象添加,表格通过<代码>表格</代码和<代码>单元格</代码对象添加,图像通过<代码>图片</代码类和 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 生成机制,其方法包括 RenderHtmlAsPdf(), RenderUrlAsPdf() 和 RenderHtmlFileAsPdf() 。 该库返回<代码>PDF 文档</代码对象,这些对象可使用 SaveAs() 保存或作为 BinaryData 访问。 配置使用 RenderingOptions 属性来设置纸张大小、页边距、页眉和页脚。
IronPDF 提供永久许可和订购许可两种选择,没有病毒许可要求。 HTML 到 PDF 的转换已内置在基本产品中,无需单独的附加组件。
许可和业务模式比较
这些库之间最大的区别在于许可和业务影响。
| 特征 | iText 7 / iTextSharp | IronPDF |
|---|---|---|
| 许可 | AGPL(病毒式)或昂贵的订阅 | 商业、永久选项 |
| HTML-to-PDF | 单独的 pdfHTML 附加组件(额外收费) | 内置 Chromium 渲染器 |
| 开源风险 | 必须是 AGPL 下的开源网络应用程序 | 无病毒要求 |
| 定价模式 | 仅限订阅 | 永久或订阅 |
| 永久选项 | 消除 | 可提供 |
对于商业网络应用程序来说,AGPL 许可证陷阱尤其棘手。 如果您在未购买商业许可证的情况下在网络应用程序中使用 iText,则 AGPL 要求您将整个应用程序开源,不仅仅是 PDF 代码,而是整个代码库。
API 范例比较
不同库的基本 API 设计理念有很大不同。
| 方面 | iText | IronPDF |
|---|---|---|
| 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);
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comiText 需要单独的 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);
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comiText 要求创建<代码>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());
}
}
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comiText 要求为输出创建<代码>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 7 | IronPDF |
|---|---|---|
| 从 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 <代码>边框</代码 |
功能对比摘要
| 特征 | iText | IronPDF |
|---|---|---|
| 程序化 PDF 构建 | ✅(主要方法) | ⚠️ (通过 HTML) |
| HTML 转 PDF | ⚠️ (需要 pdfHTML 附加组件) | ✅(内置) |
| CSS3 支持 | ⚠️ (通过 pdfHTML 进行基本翻译) | ✅(全文) |
| Flexbox/Grid | ❌ | ✅ |
| JavaScript 执行 | ❌ | ✅ |
| PDF 合并 | ✅(<代码>PdfMerger</代码) | ✅ (PdfDocument.Merge()) |
| 文本提取 | ✅(<代码>PDFTextExtractor</代码) | ✅ (ExtractAllText()) |
| 永久许可 | ❌(已淘汰) | ✅ |
| 无 AGPL 风险 | ❌ (AGPL 或订阅) | ✅ |
| 社区支持 | ✅(广泛) | ✅ |
团队何时考虑从iText迁移到 IronPDF?
开发团队评估从iText过渡到IronPDF有几个原因:
AGPL许可陷阱:AGPL许可对商业网络应用程序有很大限制。 如果您在未购买商业许可证的情况下在网络应用程序中使用 iText,则 AGPL 要求您将整个应用程序开源,不仅仅是 PDF 代码,而是整个代码库。 开发专有软件的团队通常无法接受这种病毒式的 License 要求。
仅限订阅的商业许可:iText 取消了永久许可,商业用途需要每年续订。 喜欢一次性购买的团队认为IronPDF的永久 License 选项更适合预算编制。
pdfHTML 附加组件的成本:要使用iText将 HTML 转换为 PDF,开发人员必须投资购买单独的 pdfHTML 附加组件,这会增加成本和复杂性。IronPDF在基础产品中包含 HTML 到 PDF 的转换,并配有现代 Chromium 渲染引擎。
程序 API 复杂性:iText 需要使用 Paragraph, Table,<代码>单元格</代码和其他对象手动构建低级 PDF。 具有网络开发经验的团队会发现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 许可证:病毒许可证要求开源网络应用程序或商业订阅
- 仅限订阅:取消永久许可
- pdfHTML 附加组件:HTML 转 PDF 需要单独购买
- 程序复杂性:PDF 坐标系的陡峭学习曲线
- 有限的现代 CSS:即使使用 pdfHTML 也能提供基本的 CSS 支持
- 无 JavaScript:不能在 HTML 内容中执行 JavaScript
IronPDF的优势
IronPDF注意事项
- 商业许可:生产使用要求
- HTML 优先范式:与程序化构建不同的方法
结论
iText 和IronPDF代表了在 .NET 应用程序中生成 PDF 的根本不同方法。iText使用 Paragraph、Table 和<代码>单元格</代码等类提供全面的编程式 PDF 构建,但存在重大的许可问题--AGPL 要求开源网络应用程序,永久许可已被取消,HTML-to-PDF 需要单独购买 pdfHTML 附加组件。
IronPDF 提供了一个现代化的替代方案,使用 Chromium 引擎进行内置 HTML 到 PDF 的转换,提供永久许可选项,并且没有病毒许可要求。 HTML 优先的方法允许网络开发人员直接应用现有的技能,通常会产生更简单、更易维护的代码。
随着企业对 .NET 10、C# 14 以及 2026 年之前的应用程序开发进行规划,在 AGPL 许可的程序化 PDF 构建和商业许可的基于 HTML 的渲染之间做出选择,会对法律合规性和开发效率产生重大影响。 寻求消除 AGPL 风险、降低 License 复杂性或利用网络开发技能生成 PDF 的团队会发现IronPDF能有效满足这些要求。