跳至页脚内容
迁移指南

从 ActivePDF 迁移到 IronPDF:(.NET指南)

ActivePDF 一直是 .NET 开发人员可靠的 PDF 工具包。 然而,自从 Foxit 收购了该平台以来,许多开发团队对该平台的未来、许可条款和持续开发感到不确定。 本指南提供了从ActivePDF到IronPDF的完整、分步迁移路径——IronPDF 是一个现代化的、积极维护的 .NET PDF 库,支持 .NET Framework 4.6.2 到 .NET 9 及更高版本。

为什么要考虑放弃 ActivePDF?

Foxit 收购ActivePDF给在 .NET 应用程序中开发 PDF 生成和处理解决方案的开发人员带来了诸多挑战。

不确定的产品未来

ActivePDF 在 Foxit 的收购下,其发展前景引发了人们对该工具包长期发展道路的疑问。 依赖ActivePDF的开发者面临着库过时、支持减少和开发停滞的潜在风险。 对于计划将项目延长到 2025 年和 2026 年的团队来说,这种不确定性会带来巨大的技术风险。

许可复杂性

收购带来了许可方面的不确定性,可能会使部署复杂化。ActivePDF传统的机器锁定许可模式在现代云和容器环境中会产生摩擦,在这种环境中,应用程序会在基础设施上动态扩展。

传统架构模式

ActivePDF 的架构反映了以有状态工具包模式为中心的旧设计理念。 OpenOutputFile/CloseOutputFile工作流需要明确的文件句柄管理,这与现代 C# 的约定不一致,如果处理不慎,可能会引入资源管理问题。

安装和配置开销

与当代基于 NuGet 的软件包管理不同,ActivePDF 在实例化工具包时通常需要手动引用 DLL 和显式路径配置--这种模式增加了入门的摩擦,并使 CI/CD 管道复杂化。

ActivePDF与 IronPDF:主要区别

在开始迁移过程之前,了解ActivePDF和IronPDF之间的根本区别有助于对所需的代码更改设定预期。

方面ActivePDFIronPDF
公司状态被福昕软件收购(前途未卜)独立、清晰的开发路线图
安装手动 DLL 引用简单的 NuGet 软件包</a
API模式有状态(<代码>打开输出文件</代码>/<代码>关闭输出文件</代码)流畅、实用的 API
许可模式机器锁定基于代码的关键字
.NET支持传统 .NET Framework 重点Framework 4.6.2 到 .NET 9+
错误处理整数返回代码基于异常的现代
支持同步不可用完全支持异步/等待

迁移前准备

审核您的代码库

在开始迁移之前,请确定整个解决方案中所有ActivePDF的使用情况。 在解决方案目录中运行这些命令:

grep -r "using ActivePDF" --include="*.cs" .
grep -r "using APToolkitNET" --include="*.cs" .
grep -r "APToolkitNET" --include="*.csproj" .
grep -r "using ActivePDF" --include="*.cs" .
grep -r "using APToolkitNET" --include="*.cs" .
grep -r "APToolkitNET" --include="*.csproj" .
SHELL

文档破坏性更改

了解 API 的基本差异有助于规划迁移策略:

翻译类别ActivePDF 行为IronPdf 行为迁移行动
对象模型单个 Toolkit 对象<代码>ChromePdfRenderer</代码> + <代码>PdfDocument</代码单独关注
文件操作<代码>打开输出文件()</代码>/<代码>关闭输出文件()</代码直接<代码>SaveAs()</代码删除打开/关闭调用
页面创建<代码>NewPage()</代码>方法从 HTML 自动生成删除页面创建调用
返回值整数错误代码例外情况实施 try/catch
页面大小单位点数(612x792 = 字母)枚举或毫米更新测量

前提条件

确保您的环境符合这些要求:

  • .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ 或 JetBrains Rider
  • 访问 NuGet 包管理器 -IronPDF许可证密钥(可在ironpdf.com免费试用)

逐步迁移过程

步骤 1:更新 NuGet 软件包

移除ActivePDF软件包并安装 IronPDF:

# RemoveActivePDFpackage
dotnet remove package APToolkitNET

# Install IronPDF
dotnet add package IronPdf
# RemoveActivePDFpackage
dotnet remove package APToolkitNET

# Install IronPDF
dotnet add package IronPdf
SHELL

也可通过 Visual Studio 软件包管理器控制台进行翻译:

Uninstall-Package APToolkitNET
Install-Package IronPdf

对于手动引用 DLL 的项目,请从 .csproj 文件中删除引用:

<!-- Remove this block -->
<Reference Include="APToolkitNET">
    <HintPath>path\to\APToolkitNET.dll</HintPath>
</Reference>
<!-- Remove this block -->
<Reference Include="APToolkitNET">
    <HintPath>path\to\APToolkitNET.dll</HintPath>
</Reference>
XML

步骤 2:配置许可证密钥

在启动应用程序时,在进行任何 PDF 操作前,添加IronPDF许可证密钥:

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

// Verify license status
bool isLicensed = IronPdf.License.IsLicensed;
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

// Verify license status
bool isLicensed = IronPdf.License.IsLicensed;
$vbLabelText   $csharpLabel

步骤 3:更新命名空间引用

在解决方案中执行全局查找和替换:

查找替换为
<代码>使用 ActivePDF.Toolkit;</ 代码<代码>使用 IronPdf;</ 代码
<代码>使用 APToolkitNET;</代码<代码>使用 IronPdf;</ 代码
<代码>使用 APToolkitNET.PDFObjects;</ 代码<代码>使用 IronPdf;</ 代码
<代码>使用 APToolkitNET.Common;</代码<代码>使用 IronPdf;</ 代码

完整的 API 迁移参考

文档创建方法

ActivePDF 方法IronPdf 同等产品备注
<代码>新工具包()</代码<代码>new ChromePdfRenderer()</ 代码渲染器创建 PDF
<代码>toolkit.OpenOutputFile(路径)</代码无需对等语只需在最后调用 SaveAs()
<代码>toolkit.CloseOutputFile()</代码无需对等语自动清理
<代码>toolkit.AddHTML(html)</代码<代码>renderer.RenderHtmlAsPdf(html)</代码返回 PdfDocument
<代码>toolkit.AddURL(url)</代码<代码>renderer.RenderUrlAsPdf(url)</代码将 URL 转换为 PDF
<代码>toolkit.SaveAs(路径)</代码<代码>pdf.SaveAs(路径)</代码保存到文件

文件操作

ActivePDF 方法IronPdf 同等产品备注
<代码>toolkit.OpenInputFile(路径)</代码<代码>PdfDocument.FromFile(路径)</代码加载现有 PDF
<代码>toolkit.AddPDF(路径)</代码<代码>PdfDocument.Merge()</代码用于合并操作
<代码>toolkit.GetPageCount()</代码<代码>pdf.PageCount</代码属性访问
<代码>toolkit.GetText()</代码<代码>pdf.ExtractAllText()</代码文本提取

页面配置

ActivePDF 方法IronPdf 同等产品
<代码>toolkit.SetPageSize(612, 792)</ 代码<代码>RenderingOptions.PaperSize = PdfPaperSize.Letter</ 代码
<代码>toolkit.SetOrientation("横向")</代码<代码>RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape</ 代码
<代码>toolkit.SetMargins(t, b, l, r)</ 代码<代码>RenderingOptions.MarginTop/Bottom/Left/Right</代码

安全方法

ActivePDF 方法IronPdf 同等产品
<代码>toolkit.Encrypt(password)</代码<代码>pdf.SecuritySettings.OwnerPassword</代码
<代码>toolkit.SetUserPassword(pwd)</代码<代码>pdf.SecuritySettings.UserPassword</代码
<代码>toolkit.SetPermissions(flags)</代码<代码>pdf.SecuritySettings.AllowUserXxx</代码
<代码>toolkit.AddWatermark(text)</代码<代码>pdf.ApplyWatermark(html)</代码

代码迁移示例

HTML 到 PDF 转换

将 HTML 字符串转换为 PDF 文档是最常见的 PDF 生成场景之一。 下面是代码在迁移过程中的转换过程。

ActivePDF 实现:

// NuGet: Install-Package APToolkitNET
using ActivePDF.Toolkit;
using System;

class Program
{
    static void Main()
    {
        Toolkit toolkit = new Toolkit();

        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        if (toolkit.OpenOutputFile("output.pdf") == 0)
        {
            toolkit.AddHTML(htmlContent);
            toolkit.CloseOutputFile();
            Console.WriteLine("PDF created successfully");
        }
    }
}
// NuGet: Install-Package APToolkitNET
using ActivePDF.Toolkit;
using System;

class Program
{
    static void Main()
    {
        Toolkit toolkit = new Toolkit();

        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        if (toolkit.OpenOutputFile("output.pdf") == 0)
        {
            toolkit.AddHTML(htmlContent);
            toolkit.CloseOutputFile();
            Console.WriteLine("PDF created successfully");
        }
    }
}
$vbLabelText   $csharpLabel

IronPDF 实现:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");

        Console.WriteLine("PDF created successfully");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");

        Console.WriteLine("PDF created successfully");
    }
}
$vbLabelText   $csharpLabel

IronPDF 方法消除了显式文件句柄管理,同时提供了更简洁、可读性更强的代码。 对于高级 HTML 转 PDF 场景,IronPDF 的 ChromePdfRenderer 使用基于 Chromium 的渲染引擎,支持像素级完美 CSS 和 JavaScript。

URL到PDF转换

将网页截取为 PDF 文档也遵循类似的现代化模式。

ActivePDF 实现:

using ActivePDF.Toolkit;
using System;

class Program
{
    static void Main()
    {
        Toolkit toolkit = new Toolkit();

        string url = "https://www.example.com";

        if (toolkit.OpenOutputFile("webpage.pdf") == 0)
        {
            toolkit.AddURL(url);
            toolkit.CloseOutputFile();
            Console.WriteLine("PDF from URL created successfully");
        }
    }
}
using ActivePDF.Toolkit;
using System;

class Program
{
    static void Main()
    {
        Toolkit toolkit = new Toolkit();

        string url = "https://www.example.com";

        if (toolkit.OpenOutputFile("webpage.pdf") == 0)
        {
            toolkit.AddURL(url);
            toolkit.CloseOutputFile();
            Console.WriteLine("PDF from URL created successfully");
        }
    }
}
$vbLabelText   $csharpLabel

IronPDF 实现:

using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string url = "https://www.example.com";

        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("webpage.pdf");

        Console.WriteLine("PDF from URL created successfully");
    }
}
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string url = "https://www.example.com";

        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("webpage.pdf");

        Console.WriteLine("PDF from URL created successfully");
    }
}
$vbLabelText   $csharpLabel

合并多个 PDF 文件

将多个 PDF 文档合并为一个文件展示了IronPDF的文档操作功能方法。

ActivePDF 实现:

using ActivePDF.Toolkit;
using System;

class Program
{
    static void Main()
    {
        Toolkit toolkit = new Toolkit();

        if (toolkit.OpenOutputFile("merged.pdf") == 0)
        {
            toolkit.AddPDF("document1.pdf");
            toolkit.AddPDF("document2.pdf");
            toolkit.CloseOutputFile();
            Console.WriteLine("PDFs merged successfully");
        }
    }
}
using ActivePDF.Toolkit;
using System;

class Program
{
    static void Main()
    {
        Toolkit toolkit = new Toolkit();

        if (toolkit.OpenOutputFile("merged.pdf") == 0)
        {
            toolkit.AddPDF("document1.pdf");
            toolkit.AddPDF("document2.pdf");
            toolkit.CloseOutputFile();
            Console.WriteLine("PDFs merged successfully");
        }
    }
}
$vbLabelText   $csharpLabel

IronPDF 实现:

using IronPdf;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");

        Console.WriteLine("PDFs merged successfully");
    }
}
using IronPdf;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");

        Console.WriteLine("PDFs merged successfully");
    }
}
$vbLabelText   $csharpLabel

有关包括选择性页面提取在内的更高级合并方案,请参阅 IronPDF合并文档

添加页眉和页脚

ActivePDF 实现:

using ActivePDF.Toolkit;

public void CreatePdfWithHeaderFooter(string html, string outputPath)
{
    Toolkit toolkit = new Toolkit();

    if (toolkit.OpenOutputFile(outputPath) == 0)
    {
        toolkit.SetHeader("My Document", 12, "Arial");
        toolkit.SetFooter("Page %p of %P", 10, "Arial");
        toolkit.AddHTML(html);
        toolkit.CloseOutputFile();
    }
}
using ActivePDF.Toolkit;

public void CreatePdfWithHeaderFooter(string html, string outputPath)
{
    Toolkit toolkit = new Toolkit();

    if (toolkit.OpenOutputFile(outputPath) == 0)
    {
        toolkit.SetHeader("My Document", 12, "Arial");
        toolkit.SetFooter("Page %p of %P", 10, "Arial");
        toolkit.AddHTML(html);
        toolkit.CloseOutputFile();
    }
}
$vbLabelText   $csharpLabel

IronPDF 实现:

using IronPdf;

public void CreatePdfWithHeaderFooter(string html, string outputPath)
{
    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "My Document",
        FontSize = 12,
        FontFamily = "Arial"
    };

    renderer.RenderingOptions.TextFooter = new TextHeaderFooter
    {
        CenterText = "Page {page} of {total-pages}",
        FontSize = 10,
        FontFamily = "Arial"
    };

    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs(outputPath);
}
using IronPdf;

public void CreatePdfWithHeaderFooter(string html, string outputPath)
{
    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "My Document",
        FontSize = 12,
        FontFamily = "Arial"
    };

    renderer.RenderingOptions.TextFooter = new TextHeaderFooter
    {
        CenterText = "Page {page} of {total-pages}",
        FontSize = 10,
        FontFamily = "Arial"
    };

    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs(outputPath);
}
$vbLabelText   $csharpLabel

IronPdf 支持基于文本的页眉和页脚HTML页眉和页脚,提供完全灵活的设计。

密码保护和安全性

ActivePDF 实现:

using ActivePDF.Toolkit;

public void ProtectPdf(string inputPath, string outputPath, string password)
{
    Toolkit toolkit = new Toolkit();

    if (toolkit.OpenInputFile(inputPath) == 0)
    {
        toolkit.Encrypt(password);
        toolkit.SetUserPassword(password);
        toolkit.SetPermissions(4); // Print only
        toolkit.SaveAs(outputPath);
        toolkit.CloseInputFile();
    }
}
using ActivePDF.Toolkit;

public void ProtectPdf(string inputPath, string outputPath, string password)
{
    Toolkit toolkit = new Toolkit();

    if (toolkit.OpenInputFile(inputPath) == 0)
    {
        toolkit.Encrypt(password);
        toolkit.SetUserPassword(password);
        toolkit.SetPermissions(4); // Print only
        toolkit.SaveAs(outputPath);
        toolkit.CloseInputFile();
    }
}
$vbLabelText   $csharpLabel

IronPDF 实现:

using IronPdf;

public void ProtectPdf(string inputPath, string outputPath, string password)
{
    using var pdf = PdfDocument.FromFile(inputPath);

    pdf.SecuritySettings.OwnerPassword = password;
    pdf.SecuritySettings.UserPassword = password;
    pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
    pdf.SecuritySettings.AllowUserCopyPasteContent = false;
    pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;

    pdf.SaveAs(outputPath);
}
using IronPdf;

public void ProtectPdf(string inputPath, string outputPath, string password)
{
    using var pdf = PdfDocument.FromFile(inputPath);

    pdf.SecuritySettings.OwnerPassword = password;
    pdf.SecuritySettings.UserPassword = password;
    pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
    pdf.SecuritySettings.AllowUserCopyPasteContent = false;
    pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;

    pdf.SaveAs(outputPath);
}
$vbLabelText   $csharpLabel

IronPdf 的 安全设置 API 使用强类型枚举而非整数标志对文档权限进行细粒度控制。

文本提取

ActivePDF 实现:

using ActivePDF.Toolkit;

public string ExtractText(string pdfPath)
{
    Toolkit toolkit = new Toolkit();
    string text = "";

    if (toolkit.OpenInputFile(pdfPath) == 0)
    {
        int pageCount = toolkit.GetPageCount();
        for (int i = 1; i <= pageCount; i++)
        {
            text += toolkit.GetTextFromPage(i) + "\n";
        }
        toolkit.CloseInputFile();
    }

    return text;
}
using ActivePDF.Toolkit;

public string ExtractText(string pdfPath)
{
    Toolkit toolkit = new Toolkit();
    string text = "";

    if (toolkit.OpenInputFile(pdfPath) == 0)
    {
        int pageCount = toolkit.GetPageCount();
        for (int i = 1; i <= pageCount; i++)
        {
            text += toolkit.GetTextFromPage(i) + "\n";
        }
        toolkit.CloseInputFile();
    }

    return text;
}
$vbLabelText   $csharpLabel

IronPDF 实现:

using IronPdf;

public string ExtractText(string pdfPath)
{
    using var pdf = PdfDocument.FromFile(pdfPath);
    return pdf.ExtractAllText();
}
using IronPdf;

public string ExtractText(string pdfPath)
{
    using var pdf = PdfDocument.FromFile(pdfPath);
    return pdf.ExtractAllText();
}
$vbLabelText   $csharpLabel

IronPDF 实现将文本提取从多行减少到单个方法调用。

添加水印

ActivePDF 实现:

using ActivePDF.Toolkit;

public void AddWatermark(string inputPath, string outputPath, string watermarkText)
{
    Toolkit toolkit = new Toolkit();

    if (toolkit.OpenInputFile(inputPath) == 0)
    {
        int pageCount = toolkit.GetPageCount();
        for (int i = 1; i <= pageCount; i++)
        {
            toolkit.SetPage(i);
            toolkit.AddWatermark(watermarkText, 45, 0.5f);
        }
        toolkit.SaveAs(outputPath);
        toolkit.CloseInputFile();
    }
}
using ActivePDF.Toolkit;

public void AddWatermark(string inputPath, string outputPath, string watermarkText)
{
    Toolkit toolkit = new Toolkit();

    if (toolkit.OpenInputFile(inputPath) == 0)
    {
        int pageCount = toolkit.GetPageCount();
        for (int i = 1; i <= pageCount; i++)
        {
            toolkit.SetPage(i);
            toolkit.AddWatermark(watermarkText, 45, 0.5f);
        }
        toolkit.SaveAs(outputPath);
        toolkit.CloseInputFile();
    }
}
$vbLabelText   $csharpLabel

IronPDF 实现:

using IronPdf;

public void AddWatermark(string inputPath, string outputPath, string watermarkText)
{
    using var pdf = PdfDocument.FromFile(inputPath);

    pdf.ApplyWatermark(
        $"<h1 style='color:lightgray;font-size:72px;'>{watermarkText}</h1>",
        rotation: 45,
        opacity: 50);

    pdf.SaveAs(outputPath);
}
using IronPdf;

public void AddWatermark(string inputPath, string outputPath, string watermarkText)
{
    using var pdf = PdfDocument.FromFile(inputPath);

    pdf.ApplyWatermark(
        $"<h1 style='color:lightgray;font-size:72px;'>{watermarkText}</h1>",
        rotation: 45,
        opacity: 50);

    pdf.SaveAs(outputPath);
}
$vbLabelText   $csharpLabel

IronPdf 的基于 HTML 的水印可通过 CSS 风格实现完全的设计控制,无需逐页迭代。

ASP.NET Core 集成

现代网络应用程序从 IronPdf 更简洁的集成模式中获益匪浅。

ActivePDF模式:

[HttpPost]
public IActionResult GeneratePdf([FromBody] ReportRequest request)
{
    Toolkit toolkit = new Toolkit();

    if (toolkit.OpenOutputFile("temp.pdf") == 0)
    {
        toolkit.AddHTML(request.Html);
        toolkit.CloseOutputFile();

        byte[] bytes = System.IO.File.ReadAllBytes("temp.pdf");
        return File(bytes, "application/pdf", "report.pdf");
    }

    return BadRequest("PDF generation failed");
}
[HttpPost]
public IActionResult GeneratePdf([FromBody] ReportRequest request)
{
    Toolkit toolkit = new Toolkit();

    if (toolkit.OpenOutputFile("temp.pdf") == 0)
    {
        toolkit.AddHTML(request.Html);
        toolkit.CloseOutputFile();

        byte[] bytes = System.IO.File.ReadAllBytes("temp.pdf");
        return File(bytes, "application/pdf", "report.pdf");
    }

    return BadRequest("PDF generation failed");
}
$vbLabelText   $csharpLabel

IronPdf模式:

[HttpPost]
public IActionResult GeneratePdf([FromBody] ReportRequest request)
{
    var renderer = new ChromePdfRenderer();
    using var pdf = renderer.RenderHtmlAsPdf(request.Html);

    return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
[HttpPost]
public IActionResult GeneratePdf([FromBody] ReportRequest request)
{
    var renderer = new ChromePdfRenderer();
    using var pdf = renderer.RenderHtmlAsPdf(request.Html);

    return File(pdf.BinaryData, "application/pdf", "report.pdf");
}
$vbLabelText   $csharpLabel

IronPDF 不需要临时文件,直接从内存返回 PDF 二进制数据。

Web 应用程序的同步支持

ActivePDF 缺乏本地异步支持。IronPDF提供可扩展网络应用程序所必需的全部异步/等待功能:

using IronPdf;

public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
using IronPdf;

public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
$vbLabelText   $csharpLabel

依赖注入配置

对于 .NET 6+ 应用程序,请在 DI 容器中注册IronPDF服务:

// Program.cs (.NET 6+)
builder.Services.AddSingleton<ChromePdfRenderer>();

// Service wrapper
public interface IPdfService
{
    Task<byte[]> GeneratePdfAsync(string html);
    Task<byte[]> GeneratePdfFromUrlAsync(string url);
}

public class IronPdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;

    public IronPdfService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
    }

    public async Task<byte[]> GeneratePdfAsync(string html)
    {
        using var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }

    public async Task<byte[]> GeneratePdfFromUrlAsync(string url)
    {
        using var pdf = await _renderer.RenderUrlAsPdfAsync(url);
        return pdf.BinaryData;
    }
}
// Program.cs (.NET 6+)
builder.Services.AddSingleton<ChromePdfRenderer>();

// Service wrapper
public interface IPdfService
{
    Task<byte[]> GeneratePdfAsync(string html);
    Task<byte[]> GeneratePdfFromUrlAsync(string url);
}

public class IronPdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;

    public IronPdfService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
    }

    public async Task<byte[]> GeneratePdfAsync(string html)
    {
        using var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }

    public async Task<byte[]> GeneratePdfFromUrlAsync(string url)
    {
        using var pdf = await _renderer.RenderUrlAsPdfAsync(url);
        return pdf.BinaryData;
    }
}
$vbLabelText   $csharpLabel

错误处理迁移

ActivePDF 使用整数返回代码,需要查找表。 IronPdf 使用现代异常处理技术:

ActivePDF 错误处理:

Toolkit toolkit = new Toolkit();
int result = toolkit.OpenOutputFile(path);

if (result != 0)
{
    // Error - need to look up error code
    Console.WriteLine($"Error code: {result}");
}
Toolkit toolkit = new Toolkit();
int result = toolkit.OpenOutputFile(path);

if (result != 0)
{
    // Error - need to look up error code
    Console.WriteLine($"Error code: {result}");
}
$vbLabelText   $csharpLabel

IronPDF 错误处理:

try
{
    var renderer = new ChromePdfRenderer();
    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs(path);
}
catch (IronPdf.Exceptions.IronPdfProductException ex)
{
    Console.WriteLine($"IronPDF Error: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"General Error: {ex.Message}");
}
try
{
    var renderer = new ChromePdfRenderer();
    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs(path);
}
catch (IronPdf.Exceptions.IronPdfProductException ex)
{
    Console.WriteLine($"IronPDF Error: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"General Error: {ex.Message}");
}
$vbLabelText   $csharpLabel

性能优化技巧

重复使用渲染器实例

创建一个新的 ChromePdfRenderer 有初始化开销。 对于批量操作,请重复使用单个实例:

var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs($"output_{i}.pdf");
}
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs($"output_{i}.pdf");
}
$vbLabelText   $csharpLabel

在 Web 应用程序中使用异步

对于 ASP.NET Core 应用程序,异步 PDF 生成提高了吞吐量:

public async Task<IActionResult> GenerateReport()
{
    var renderer = new ChromePdfRenderer();
    using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return File(pdf.BinaryData, "application/pdf");
}
public async Task<IActionResult> GenerateReport()
{
    var renderer = new ChromePdfRenderer();
    using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return File(pdf.BinaryData, "application/pdf");
}
$vbLabelText   $csharpLabel

正确的资源处置

始终使用 using 语句以确保正确的清理:

using var pdf = renderer.RenderHtmlAsPdf(html);
return pdf.BinaryData;
using var pdf = renderer.RenderHtmlAsPdf(html);
return pdf.BinaryData;
$vbLabelText   $csharpLabel

图像压缩

通过图像压缩减少输出文件大小:

using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.CompressImages(85); // 85% quality
pdf.SaveAs("compressed.pdf");
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.CompressImages(85); // 85% quality
pdf.SaveAs("compressed.pdf");
$vbLabelText   $csharpLabel

常见迁移问题的故障排除

问题:页面大小差异

ActivePDF 使用点(612x792 = Letter),而IronPDF使用枚举或毫米:

// ActivePDF: Points
toolkit.SetPageSize(612, 792);

// IronPDF: Use enum
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
// Or custom in mm:
renderer.RenderingOptions.SetCustomPaperSizeInMillimeters(215.9, 279.4);
// ActivePDF: Points
toolkit.SetPageSize(612, 792);

// IronPDF: Use enum
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
// Or custom in mm:
renderer.RenderingOptions.SetCustomPaperSizeInMillimeters(215.9, 279.4);
$vbLabelText   $csharpLabel

问题:缺少 CloseOutputFile 等价函数

IronPDF 使用现代范式,没有明确的文件句柄管理:

// ActivePDF
toolkit.OpenOutputFile(path);
toolkit.AddHTML(html);
toolkit.CloseOutputFile(); // Required!

//IronPDF- no open/close needed
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(path); // 'using' handles cleanup
// ActivePDF
toolkit.OpenOutputFile(path);
toolkit.AddHTML(html);
toolkit.CloseOutputFile(); // Required!

//IronPDF- no open/close needed
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(path); // 'using' handles cleanup
$vbLabelText   $csharpLabel

问题:PDF 渲染空白

如果依赖 JavaScript 的内容呈现空白,请配置呈现延迟:

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.RenderDelay(2000);
// Or wait for element:
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.RenderDelay(2000);
// Or wait for element:
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");
$vbLabelText   $csharpLabel

问题:CSS/ 图像无法加载

为相对路径解析配置基本 URL:

renderer.RenderingOptions.BaseUrl = new Uri("https://yourdomain.com/assets/");
renderer.RenderingOptions.BaseUrl = new Uri("https://yourdomain.com/assets/");
$vbLabelText   $csharpLabel

迁移后核对表

完成代码迁移后,请验证以下内容:

  • 运行所有现有的单元测试和集成测试
  • 将 PDF 输出结果与以前的版本进行直观比较
  • 在测试环境中测试所有 PDF 工作流程
  • 验证许可是否正常工作( IronPdf.License.IsLicensed
  • 与之前的实现进行基准性能比较
  • 删除旧的ActivePDF安装文件和 DLL 引用
  • 更新 CI/CD 流水线依赖项
  • 为您的开发团队提供IronPDF模式文档

面向未来的 PDF 解决方案

.NET10即将推出,C# 14也将引入新的语言特性,选择一个积极开发的.NET PDF 库可以确保您的应用程序与不断发展的运行时功能保持兼容。IronPDFfor .NET 承诺支持最新的 .NET 版本,这意味着当您的项目延伸到 2025 年和 2026 年时,您的迁移投资将获得回报。

其他资源


从ActivePDF迁移到IronPDF可通过更简洁的 API、更好的 .NET 集成和积极的长期支持使您的 PDF 生成基础架构现代化。 在迁移方面的投资将通过提高代码可维护性、异步功能以及对 PDF 库持续发展的信心而获得回报。

Curtis Chau
技术作家

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

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