iText 与 IronPDF:技术比较指南
本次比较从相关技术方面考察了这两个库,以帮助开发人员和架构师针对其 .NET PDF 需求做出明智的决策。
iText/iTextSharp 概述
iText 是一个双重许可的 PDF 库,允许从头开始创建 PDF,修改现有文档,并执行添加文本、图像和安全功能等任务。 该库采用程序化 API 方法,开发人员可以使用诸如 Table 和 Cell 之类的类来构建 PDF 内容。
iText 7 使用诸如 iText.Layout.Element 和 iText.Html2pdf 之类的命名空间。 PDF 创建包括创建一个 PdfWriter,将其包装在 PdfDocument 中,然后创建一个 Document 用于内容布局。 文本通过 Paragraph 对象添加,表格通过 Table 和 Cell 对象添加,图像通过 Image 类和 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 生成机制,并具有 RenderUrlAsPdf() 和 RenderHtmlFileAsPdf() 等方法。 该库返回 PdfDocument 对象,这些对象可以用 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);
}
}
}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");
}
}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);
}
}
}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");
}
}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());
}
}
}
}
}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");
}
}iText 需要为输出创建一个 PdfWriter,创建一个目标 PdfDocument,创建一个 PdfMerger,然后遍历源文件以创建 PdfReader 和 PdfDocument 实例,使用页面范围调用 merger.Merge(),并管理所有对象的处置。
IronPDF使用 PdfDocument.FromFile() 加载文档,创建一个列表,并调用静态 PdfDocument.Merge() 方法。 操作明显更加简洁。
在 IronPDF 教程中了解有关 PDF 操作的更多信息。
API 映射参考
对于评估iText迁移或比较功能的开发人员,本映射显示了等效操作:
类映射
| iText 7 类 | iTextSharp 类 | IronPdf 同等产品 |
|---|---|---|
PdfWriter | PdfWriter | ChromePdfRenderer |
PdfDocument | Document | PdfDocument |
Document | Document | ChromePdfRenderer.RenderHtmlAsPdf() |
Paragraph | Paragraph | HTML <p>, <h1> 等。 |
Table | PdfPTable | HTML <table> |
Cell | PdfPCell | HTML <td>, <th> |
Image | Image | HTML <img> |
List | List | HTML <ul>, <ol> |
ListItem | ListItem | HTML <li> |
PdfReader | PdfReader | 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 同等产品 |
|---|---|
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 |
功能对比摘要
| 特征 | 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 许可对商业 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 优先范式,通常会显著减少代码量。 需要数十行包含 Cell 和 Paragraph 对象的报表表格,会变成带有 CSS 样式的简单 HTML 表格。
优势和考虑因素
iText的优势
-功能全面:强大的 PDF 处理功能 -广泛应用:庞大的用户群体和详尽的文档 -跨平台:可在各种 .NET 平台上运行 -精细控制:直接操作 PDF 对象以满足特定需求
iText注意事项
- AGPL 许可:病毒式许可需要开源 Web 应用程序或商业订阅 -仅限订阅:取消永久授权
- pdfHTML 插件: HTML 转 PDF 功能需要单独购买。 -程序化复杂性: PDF坐标系的学习曲线陡峭 -现代 CSS 支持有限:即使使用 pdfHTML 也仅支持基本的 CSS -不支持 JavaScript:无法在 HTML 内容中执行 JavaScript
IronPDF的优势
永久授权:一次性购买选项 -无AGPL风险:保持专有代码闭源 -内置 HTML 转 PDF 功能:无需单独的插件
IronPDF注意事项
-商业许可:生产用途必需
- HTML优先范式:与程序化构建不同的方法
结论
iText 和IronPDF代表了在 .NET 应用程序中生成 PDF 的根本不同方法。iText提供全面的程序化 PDF 构建功能,使用诸如 Table 和 Cell 之类的类,但存在严重的许可问题——AGPL 要求开源 Web 应用程序,永久许可已被取消,并且 HTML 转 PDF 需要单独购买 pdfHTML 插件。
IronPDF 提供了一个现代化的替代方案,使用 Chromium 引擎进行内置 HTML 到 PDF 的转换,提供永久许可选项,并且没有病毒许可要求。 HTML 优先的方法允许网络开发人员直接应用现有的技能,通常会产生更简单、更易维护的代码。
随着企业对 .NET 10、C# 14 以及 2026 年之前的应用程序开发进行规划,在 AGPL 许可的程序化 PDF 构建和商业许可的基于 HTML 的渲染之间做出选择,会对法律合规性和开发效率产生重大影响。 寻求消除 AGPL 风险、降低 License 复杂性或利用网络开发技能生成 PDF 的团队会发现IronPDF能有效满足这些要求。
