如何用 C# 从 iText 迁移到 IronPDF
从 iText 迁移到 IronPDF:完整的 C# 迁移指南。
从 iText 迁移到IronPDF可将您的 .NET PDF 工作流程从需要手动构建 Paragraph,<代码>表格</代码和<代码>单元格</代码对象的编程式 API 转换为完全支持 CSS3 和JavaScript的现代 HTML 优先方法。 本指南提供了一个全面的、循序渐进的迁移路径,消除了 AGPL许可证的顾虑,也无需为专业的 .NET 开发人员单独安装 pdfHTML 附加组件。
为什么要从 iText 迁移到 IronPDF.
AGPL 许可陷阱
iText 给商业应用带来了严重的法律和商业风险,许多开发团队发现时已经为时已晚:
1.AGPL 病毒许可证:如果您在网络应用程序中使用 iText,则 AGPL 要求您开放整个应用程序的源代码--不仅仅是 PDF 代码,而是整个代码库。 这对于大多数商业软件来说都是不可能的。
2.无永久许可证:iText 取消了永久许可证,因为每年续订会增加总体拥有成本。
3.pdfHTML附加组件费用:HTML 转 PDF 功能需要使用 pdfHTML 附加组件,该组件需在基本许可的基础上另行付费购买。
4.复杂的许可审核:企业部署面临着复杂的许可和审核风险,这可能会延误项目并带来法律风险。
5.Programmatic-Only API:iText 需要使用 Paragraph, Table,<代码>单元格</代码对象手动构建低级 PDF--对于复杂的布局来说,这既麻烦又容易出错。
6.有限的现代网络渲染:即使使用 pdfHTML,复杂的 CSS 和JavaScript内容也需要大量的额外工作。
iText 与IronPDF对比
| 特征 | iText 7 / iTextSharp | IronPDF |
|---|---|---|
| 许可证 | AGPL(病毒式)或昂贵的订阅 | 商业、永久选项 |
| HTML 转 PDF | 单独的 pdfHTML 附加组件 | 内置 Chromium 渲染器 |
| CSS 支持 | 基本 CSS | 完全 CSS3、Flexbox、网格 |
| JavaScript | 无 | 全面执行 |
| 应用程序接口范例 | 程式化(段落、表格、单元格) | HTML 优先,带 CSS |
| 学习曲线 | 陡峭(PDF 坐标系) | 对网络开发人员友好 |
| 开源风险 | 必须是开源网络应用程序 | 无病毒要求 |
| 定价模式 | 仅限订阅 | 永久或订阅 |
对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队来说,IronPDF 提供了一个面向未来的基础,其 HTML 优先的方法可利用团队已有的网络开发技能。
迁移复杂性评估
按功能估算的工作量
| 特征 | 迁移复杂性 | 备注 |
|---|---|---|
| HTML 至 PDF | 极低 | 直接方法替换 |
| 合并 PDF | 低 | 更简单的应用程序接口 |
| 文本和图片 | 低 | HTML 取代编程 |
| 表格 | 语言 | HTML 表格取代 iText 表格类 |
| 页眉/页脚 | 语言 | 事件处理程序 → HTML 模板 |
| 安全/加密 | 低 | 基于属性的 API |
范式转换
这次 iText 迁移的根本转变是从 程序化 PDF 构建到 HTML-first渲染:
iText: PdfWriter → PdfDocument → Document → Add(Paragraph) → Add(Table)
IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(htmlString) → SaveAs()这种模式的转变是一种解放:您无需学习 iText 的对象模型,而是使用网络开发人员已经掌握的 HTML 和 CSS 技能。
开始之前
前提条件
1..NET环境:.NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+ 2.NuGet 访问:安装 NuGet 软件包的能力 3.IronPDF 许可证:从 ironpdf.com 获取许可证密钥
NuGet 软件包变更
# Remove iText packages
dotnet remove package itext7
dotnet remove package itext7.pdfhtml
dotnet remove package itextsharp
# Install IronPDF
dotnet add package IronPdf# Remove iText packages
dotnet remove package itext7
dotnet remove package itext7.pdfhtml
dotnet remove package itextsharp
# Install IronPDF
dotnet add package IronPdf许可配置
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IRON VB CONVERTER ERROR developers@ironsoftware.com确定 iText 的用法
# Find all iText references
grep -r "using iText\|using iTextSharp" --include="*.cs" .
grep -r "PdfWriter\|PdfDocument\|Document\|Paragraph\|Table\|Cell" --include="*.cs" .
grep -r "HtmlConverter\|ConverterProperties" --include="*.cs" .# Find all iText references
grep -r "using iText\|using iTextSharp" --include="*.cs" .
grep -r "PdfWriter\|PdfDocument\|Document\|Paragraph\|Table\|Cell" --include="*.cs" .
grep -r "HtmlConverter\|ConverterProperties" --include="*.cs" .完整的 API 参考
类映射
| iText 7 类 | iTextSharp 类 | IronPdf 同等产品 |
|---|---|---|
| <代码>PdfWriter</代码 | <代码>PdfWriter</代码 | <代码>ChromePdfRenderer</代码 |
| <代码>PDF 文档</代码 | <代码>文档</代码 | <代码>PDF 文档</代码 |
| <代码>文档</代码 | <代码>文档</代码 | <代码>ChromePdfRenderer.RenderHtmlAsPdf()</代码 |
| <代码>段落</代码 | <代码>段落</代码 | HTML <p>, <h1> 等。 |
| <代码>表格</代码 | <代码>PDFPTable</代码 | HTML <table> |
| <代码>单元格</代码 | <代码>PdfPCell</代码 | HTML <td>, <th> |
| <代码>图片</代码 | <代码>图片</代码 | HTML <img> |
| <代码>PDF 阅读器</代码 | <代码>PDF 阅读器</代码 | <代码>PdfDocument.FromFile()</代码 |
| <代码>PDFMerger</代码 | 不适用 | <代码>PdfDocument.Merge()</代码 |
命名空间映射
| iText 7 名称空间 | IronPdf 同等产品 |
|---|---|
| <代码>iText.Kernel.Pdf</代码 | <代码>IronPdf</代码 |
| <代码>iText.布局</代码 | <代码>IronPdf</代码 |
| <代码>iText.Layout.Element</代码 | 使用 HTML 元素 |
| <代码>iText.Html2Pdf</代码 | <代码>IronPdf</代码>(内置) |
| <代码>iText.IO.Image</代码 | 使用 HTML <img> |
| <代码>iText.Kernel.Utils</代码 | <代码>IronPdf</代码 |
代码迁移示例
示例 1:HTML 到 PDF 的转换
之前(iText 7):
// 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.comAfter (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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comiText 方法需要使用单独的 iText.Html2pdf 包(pdfHTML 附加组件,需单独购买),创建 FileStream 并将所有内容封装在 using 语句中,以便妥善处理。 HtmlConverter.ConvertToPdf() 方法会直接写入数据流。
IronPDF 的方法更为简洁:创建一个<代码>ChromePdfRenderer</代码,使用 HTML 字符串调用 RenderHtmlAsPdf() ,然后在生成的<代码>PDF 文档</代码上调用 SaveAs() 。 没有单独的软件包,没有流管理,Chromium 渲染引擎提供卓越的 CSS3 和JavaScript支持。 有关其他渲染选项,请参阅 HTML to PDF 文档。
示例 2:合并多个 PDF 文件
之前(iText 7):
// 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.comAfter (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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comiText 合并操作需要大量的模板:为输出创建<代码>PdfWriter</代码,将其封装在<代码>PDF 文档</代码中,创建<代码>PDFMerger</代码,然后使用嵌套的 using 语句遍历每个<代码>PDF 文档</代码和<代码>PDF 阅读器</代码的源文件。 您还必须使用 merger.Merge(sourcePdf, 1, sourcePdf.GetNumberOfPages()) 指定页面范围。
IronPDF 将此简化为三个步骤:使用<代码>PdfDocument.FromFile()</代码加载文档,使用列表调用静态<代码>PdfDocument.Merge()</代码方法,然后保存。 使整个合并操作具有可读性和可维护性。 了解有关 合并和拆分 PDF 的更多信息。
示例 3:使用文本和图像创建 PDF.
之前(iText 7):
// 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.comAfter (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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com这个例子最清楚地说明了范式的转变。 iText 要求
- 三重嵌套的
using语句(PdfWriter、PdfDocument、Document</code) - 使用
new Paragraph()为每个文本元素创建<代码>段落</代码对象 - 使用
ImageDataFactory.Create()加载图像 - 创建<代码>图片</代码对象并分别调用
SetWidth() - 为每个元素调用
document.Add()
IronPdf 使用标准 HTML:<h1> 表示标题,<p> 表示段落,<img> 表示带有 width 属性的图像。 网络开发人员可以立即利用他们现有的技能,而设计人员则可以使用他们已经掌握的 CSS 对文档进行样式设计。
关键迁移说明
范式转变:编程到 HTML 优先
这次 iText 迁移中最重要的变化是概念上的。 iText 以编程方式生成 PDF:
// iText approach
document.Add(new Paragraph("Title")
.SetTextAlignment(TextAlignment.CENTER)
.SetFontSize(24)
.SetBold());
var table = new Table(UnitValue.CreatePercentArray(3)).UseAllAvailableWidth();
table.AddHeaderCell(new Cell().Add(new Paragraph("ID")));
table.AddHeaderCell(new Cell().Add(new Paragraph("Name")));
// ... many more lines// iText approach
document.Add(new Paragraph("Title")
.SetTextAlignment(TextAlignment.CENTER)
.SetFontSize(24)
.SetBold());
var table = new Table(UnitValue.CreatePercentArray(3)).UseAllAvailableWidth();
table.AddHeaderCell(new Cell().Add(new Paragraph("ID")));
table.AddHeaderCell(new Cell().Add(new Paragraph("Name")));
// ... many more linesIRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 使用 HTML 和 CSS:
//IronPDFapproach
string html = @"
<style>
h1 { text-align: center; font-size: 24px; font-weight: bold; }
table { width: 100%; border-collapse: collapse; }
th { background-color: #4CAF50; color: white; padding: 8px; }
</style>
<h1>Title</h1>
<table>
<tr><th>ID</th><th>Name</th></tr>
</table>";
var pdf = renderer.RenderHtmlAsPdf(html);//IronPDFapproach
string html = @"
<style>
h1 { text-align: center; font-size: 24px; font-weight: bold; }
table { width: 100%; border-collapse: collapse; }
th { background-color: #4CAF50; color: white; padding: 8px; }
</style>
<h1>Title</h1>
<table>
<tr><th>ID</th><th>Name</th></tr>
</table>";
var pdf = renderer.RenderHtmlAsPdf(html);IRON VB CONVERTER ERROR developers@ironsoftware.com取消 AGPL 许可
iText 的 AGPL 许可证要求开源整个网络应用程序或购买昂贵的商业许可证。IronPDF的商业许可证允许在专有软件中部署,而无需病毒许可要求。
无需 pdfHTML 附加组件
iText 需要使用单独的 pdfHTML 附加组件进行 HTML 到 PDF 的转换,该组件需额外付费。IronPDF 的基础软件包中包含基于 Chromium 的完整 HTML 渲染功能。
方法替换模式
| iText 模式 | IronPdf 替代品 |
|---|---|
| <代码>设置文本对齐方式(TextAlignment.CENTER)</代码 | CSS text-align: center |
| <代码>设置字体大小(24)</代码 | CSS font-size: 24px |
| <代码>SetBold()</代码 | CSS font-weight: bold |
| <代码>新表(3)</代码 | HTML <table> |
| <代码>添加标题单元格(new Cell().Add(new Paragraph())) | HTML <th> |
| <代码>AddCell(new Cell().Add(new Paragraph())) | HTML <td> |
故障排除
问题 1:PdfWriter/文档模式
问题:代码使用<代码>PdfWriter</代码→<代码>PDF 文档</代码→<代码>文档</代码嵌套模式。
解决方案:替换为 ChromePdfRenderer:
// Delete this iText pattern:
// using (var writer = new PdfWriter(outputPath))
// using (var pdfDoc = new PdfDocument(writer))
// using (var document = new Document(pdfDoc))
// Replace with:
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);// Delete this iText pattern:
// using (var writer = new PdfWriter(outputPath))
// using (var pdfDoc = new PdfDocument(writer))
// using (var document = new Document(pdfDoc))
// Replace with:
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);IRON VB CONVERTER ERROR developers@ironsoftware.com问题 2:HtmlConverter 未找到
问题:代码使用 iText.Html2pdf.HtmlConverter 需要 pdfHTML 附加组件。
解决方案:使用IronPDF内置的 HTML 渲染功能:
// iText (requires pdfHTML add-on)
HtmlConverter.ConvertToPdf(html, fileStream);
//IronPDF(built-in)
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);// iText (requires pdfHTML add-on)
HtmlConverter.ConvertToPdf(html, fileStream);
//IronPDF(built-in)
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(outputPath);IRON VB CONVERTER ERROR developers@ironsoftware.com问题 3:PdfMerger 的复杂性
问题:iText 的<代码>PDFMerger</代码需要嵌套阅读器和页面范围规范。
解决方案:使用IronPDF的静态合并方法:
// iText merger pattern (delete this)
// 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(simple)
var merged = PdfDocument.Merge(pdfDocuments);
merged.SaveAs("merged.pdf");// iText merger pattern (delete this)
// 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(simple)
var merged = PdfDocument.Merge(pdfDocuments);
merged.SaveAs("merged.pdf");IRON VB CONVERTER ERROR developers@ironsoftware.com迁移清单
迁移前
- [ ] 清点代码库中的所有 iText API 调用
- [ ] 识别程序化 PDF 构建模式(段落、表格、单元格)
- [文档 HtmlConverter 的用法(pdfHTML 附加组件)
- [评估 AGPL 合规性风险
- [ ] 获取 IronPdf 许可证密钥
代码迁移
- [ ] 删除 iText NuGet 软件包:<代码>dotnet 移除软件包 itext7</代码
- [ ] 安装 IronPdf NuGet 软件包:<代码>dotnet 添加软件包 IronPdf</ 代码
- [ ] 更新命名空间导入(<代码>使用 iText.* → <代码>使用 IronPdf)
- [ ] 使用<代码>ChromePdfRenderer</代码替换
PdfWriter/Document模式。 - [ ] 将
Paragraph/Table/Cell转换为 HTML 元素 - [ ] 将
HtmlConverter.ConvertToPdf()替换为RenderHtmlAsPdf()。 - [更新合并操作为
PdfDocument.Merge() - [ ] 在启动时添加许可证密钥初始化
测试
- [ ] 测试所有 PDF 生成路径
- [ ] 验证视觉输出是否符合预期
- [ ] 测试复杂的 HTML/CSS 内容
- [ ] 基准性能
后迁移
- [ ] 删除 iText 许可证文件和参考资料
- [ ] 更新文档
- [ ] 取消 iText 订阅(如适用)
- [将传统的 iText 代码归档
结论
从 iText 迁移到IronPDF可以消除 AGPL 许可陷阱,同时简化您的 PDF 生成代码。 从程序化构建到 HTML 优先渲染的模式转变意味着您的团队可以利用现有的网络开发技能,而无需学习 iText 的对象模型。
本次迁移的主要变化有 1.许可:AGPL (病毒) → 商业 (许可) 2.HTML 支持:独立的 pdfHTML 附加组件 → 内置 Chromium 3.API范式:程序化(段落、表格、单元格)→HTML/CSS 4.合并:复杂的 PdfMerger → 简单的 PdfDocument.Merge() 5.学习曲线:PDF 坐标系 → 对网络开发人员友好






