跳至页脚内容
迁移指南

如何用 C# 从 iText 迁移到 IronPDF

从 iText 迁移到IronPDF可将您的 .NET PDF 工作流程从需要手动构建 Paragraph,表格单元格对象的编程式 API 转换为完全支持 CSS3 和JavaScript的现代 HTML 优先方法。 本指南提供了一个全面的、循序渐进的迁移路径,消除了 AGPL许可证的顾虑,也无需为专业的 .NET 开发人员单独安装 pdfHTML 附加组件。

为什么要从 iText 迁移到 IronPDF.

AGPL 许可陷阱

iText 给商业应用带来了严重的法律和商业风险,许多开发团队发现时已经为时已晚:

  1. AGPL 病毒式许可证:如果您在 Web 应用程序中使用 iText,AGPL 要求您开源您的整个应用程序——不仅仅是 PDF 代码,而是您的整个代码库。 这对于大多数商业软件来说都是不可能的。

2.没有永久许可: iText 取消了永久许可,强制每年续订订阅,这增加了总拥有成本。

  1. pdfHTML 附加组件费用: HTML 转 PDF 功能需要 pdfHTML 附加组件,该组件需在基本许可证之外另行购买。

4.复杂的许可审计:企业部署面临许可的复杂性和审计风险,这可能会延误项目并造成法律风险。

5.仅程序 API: iText 需要手动使用Paragraph表格Cell对象构建底层 PDF——对于复杂的布局来说,这既繁琐又容易出错。

6.现代 Web 渲染有限:即使使用 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优先渲染:

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
SHELL

许可配置

// 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";
$vbLabelText   $csharpLabel

确定 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" .
SHELL

完整的 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 related to 命名空间映射`
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);
        }
    }
}
$vbLabelText   $csharpLabel

After (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 并将所有内容封装在 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());
                }
            }
        }
    }
}
$vbLabelText   $csharpLabel

After (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,然后使用嵌套的 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);
        }
    }
}
$vbLabelText   $csharpLabel

After (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 要求

  • 三重嵌套的 using 语句(PdfWriterPdfDocument、`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 lines
$vbLabelText   $csharpLabel

IronPdf 使用 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);
$vbLabelText   $csharpLabel

取消 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/文档模式

问题:代码使用了PdfWriterPDF 文档Document`嵌套模式。

解决方案:替换为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);
$vbLabelText   $csharpLabel

问题 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);
$vbLabelText   $csharpLabel

问题 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");
$vbLabelText   $csharpLabel

迁移清单

迁移前

  • 清点代码库中所有 iText API 调用
  • 识别程序化 PDF 构建模式(段落、表格、单元格)
  • 文档 HtmlConverter 用法(pdfHTML 插件)
  • 评估AGPL合规风险
  • 获取IronPDF许可证密钥

代码迁移

  • 删除 iText NuGet 包: dotnet remove package itext7 安装 IronPdf NuGet 包: dotnet add package IronPdf
  • 更新命名空间导入( using iText.*using IronPdf
  • PdfWriter / Document模式替换为ChromePdfRendererParagraph /表格/ Cell转换为 HTML 元素
  • HtmlConverter.ConvertToPdf()替换为RenderHtmlAsPdf()
  • 将合并操作更新为PdfDocument.Merge()
  • 添加启动时许可证密钥初始化功能

测试

  • 测试所有 PDF 生成路径
  • 验证视觉输出是否符合预期
  • 使用复杂的 HTML/CSS 内容进行测试
  • 基准性能

后迁移

  • 删除 iText 许可证文件和引用
  • 更新文档
  • 取消 iText 订阅(如适用)
  • 归档旧版 iText 代码

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。