跳至页脚内容
迁移指南

如何用 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 / iTextSharpIronPDF
许可证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 <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);
        }
    }
}
$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 语句(PdfWriterPdfDocumentDocument</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/文档模式

问题:代码使用了PdfWriter →<代码>PDF 文档</代码→ 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 机器人,将他对技术的热爱与创造力相结合。