跳至页脚内容
迁移指南

如何用 C# 从 ExpertPdf 迁移到 IronPDF

ExpertPdf 是一款适用于 .NET 的商用 HTML 到 PDF 转换器,多年来一直为开发人员提供服务。 然而,在当今快速发展的开发环境中,ExpertPdf 面临着巨大的挑战:文档自 2018 年起冻结,依赖于错过现代 CSS3 功能的 Chrome 旧版本,过时技术的溢价定价从 550 美元到 1200 美元不等,产品套件支离破碎,需要为合并、安全和拆分提供单独的许可证。 本综合指南提供了从ExpertPdf逐步迁移到IronPDF的路径--IronPDF 是一个现代的 .NET PDF 库,具有最新的 Chromium 渲染、每月更新和一体化软件包架构。

为什么要从ExpertPdf迁移到 IronPDF?

ExpertPdf 带来了一些挑战,促使开发团队对现代替代方案进行评估。 了解这些问题对于规划迁移策略至关重要。

ExpertPdf的问题

1.文档自 2018 年以来一直处于冻结状态:ExpertPdf的文档已经超过 6 年没有更新了。 随着 .NET 生态系统的发展,查找最新信息、示例和最佳实践变得越来越困难。

2.过时的 Chrome 版本:ExpertPdf依赖于旧版本的 Chrome 进行渲染。 现代 CSS3 功能(Flexbox、网格、CSS 变量)可能无法正确呈现,并且未应用安全补丁。

3.传统技术的高价定价:ExpertPdf的许可证价格为 550 美元至 1200 美元,却提供过时的渲染技术。

4.产品套件分散:ExpertPdf为不同的功能单独销售软件包——HtmlToPdf Converter、PDF Merger、PDF Security、PDF Splitter 和 PDF to Image——每个软件包都需要单独的许可。

5.现代 .NET 支持有限:虽然ExpertPdf有 .NET Core 包,但它们落后于现代 .NET 版本和实践。

架构比较

方面 ExpertPdf IronPDF
文档 自 2018 年起冻结 持续更新
渲染引擎 传统 Chrome 浏览器 最新 Chromium
CSS支持 有限的 CSS3 完整的 CSS3(Flexbox、网格)
价格 $550-$1,200 有竞争力的定价
更新频率 不经常 每月发布
产品模型 零散(5 个以上 DLL) 一体化库
现代.NET 有限的 .NET 6/7/8/9+ 原生语言
支持同步 有限的 完整的异步/等待

主要迁移优势

1.现代渲染:采用最新的 Chromium 引擎,实现像素级完美输出 2.一体化软件包:在一个 NuGet 包中完成 PDF 生成、合并、安全保护和提取。 3.积极开发:每月更新,包含新功能和安全补丁 4.更完善的文档:全面的教程和示例 5.真正的跨平台:支持 Windows、Linux、macOS 和 Docker。

迁移前准备

前提条件

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

  • .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ 或带有 C# 扩展的 VS Code
  • 访问 NuGet 包管理器 -IronPDF许可证密钥(可在ironpdf.com免费试用)

AuditExpertPdf的用法

在解决方案目录中运行这些命令,以识别所有ExpertPdf引用:

# Find allExpertPdfreferences
grep -r "ExpertPdf\|PdfConverter\|PDFMerge\|PdfSecurityManager" --include="*.cs" .

# Check NuGet packages
dotnet list package | grep -i "ExpertPdf"
# Find allExpertPdfreferences
grep -r "ExpertPdf\|PdfConverter\|PDFMerge\|PdfSecurityManager" --include="*.cs" .

# Check NuGet packages
dotnet list package | grep -i "ExpertPdf"
SHELL

常见的ExpertPdf软件包:

  • ExpertPdf.HtmlToPdf - HTML 到 PDF 的转换
  • ExpertPdf.PDFMerge - PDF 合并
  • ExpertPdf.PDFSecurity - 加密和密码
  • ExpertPdf.PDFSplit - PDF 分割
  • ExpertPdf.PdfToImage - PDF 到图像的转换

了解核心模式变更

ExpertPdf 使用PDFConverter直接返回字节数组的方法。IronPDF使用ChromePdfRenderer返回 PdfDocument 对象,这些对象在保存前提供了额外的操作功能。

逐步迁移过程

步骤 1:更新 NuGet 软件包

删除所有ExpertPdf软件包并安装 IronPDF:

# Remove allExpertPdfpackages
dotnet remove package ExpertPdf.HtmlToPdf
dotnet remove package ExpertPdf.PDFMerge
dotnet remove package ExpertPdf.PDFSecurity
dotnet remove package ExpertPdf.PDFSplit
dotnet remove package ExpertPdf.PdfToImage

# InstallIronPDF(includes all features)
dotnet add package IronPdf
# Remove allExpertPdfpackages
dotnet remove package ExpertPdf.HtmlToPdf
dotnet remove package ExpertPdf.PDFMerge
dotnet remove package ExpertPdf.PDFSecurity
dotnet remove package ExpertPdf.PDFSplit
dotnet remove package ExpertPdf.PdfToImage

# InstallIronPDF(includes all features)
dotnet add package IronPdf
SHELL

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

用IronPDF替换ExpertPdf命名空间:

// Remove these
using ExpertPdf.HtmlToPdf;

// Add this
using IronPdf;
// Remove these
using ExpertPdf.HtmlToPdf;

// Add this
using IronPdf;
$vbLabelText   $csharpLabel

步骤 3:配置许可证

ExpertPdf 采用按转换器授权的方式。 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";
$vbLabelText   $csharpLabel

完整的 API 迁移参考

核心类映射

ExpertPdf 类 IronPdf 同等产品 备注
PDFConverter ChromePdfRenderer 主要转换类
PdfDocumentOptions ChromePdfRenderOptions 通过 RenderingOptions
PdfHeaderOptions TextHeaderFooter</code> 或 <code>HtmlHeaderFooter 可配置
PdfFooterOptions TextHeaderFooter</code> 或 <code>HtmlHeaderFooter 可配置
PDFMerge PdfDocument.Merge() 静态方法

方法映射

ExpertPdf 方法 IronPdf 方法 备注
pdfConverter.GetPdfBytesFromHtmlString(html) renderer.RenderHtmlAsPdf(html).BinaryData
pdfConverter.GetPdfBytesFromUrl(url) renderer.RenderUrlAsPdf(url).BinaryData
pdfConverter.GetPdfBytesFromHtmlFile(path) renderer.RenderHtmlFileAsPdf(path).BinaryData
pdfConverter.SavePdfFromUrlToFile(url,路径) renderer.RenderUrlAsPdf(url).SaveAs(path) 两个步骤

选项映射

ExpertPdf 选项 IronPdf 渲染选项 备注
PdfDocumentOptions.PdfPageSize = PdfPageSize.A4 PaperSize = PdfPaperSize.A4
PdfDocumentOptions.PdfPageOrientation = Portrait PaperOrientation = PdfPaperOrientation.Portrait
PdfDocumentOptions.MarginTop 页边距 相同的属性名称
PdfHeaderOptions.HeaderText TextHeader.CenterText
PdfFooterOptions.FooterText TextFooter.RightText

页面编号标记转换

ExpertPdf 和IronPDF对页码使用不同的占位符语法:

ExpertPdf IronPDF
&p; {page}
&P; {总页数}

代码迁移示例

HTML 到 PDF 转换

HTML 到 PDF 的基本转换展示了从ExpertPdf的字节阵列模式到IronPDF的文档对象方法的转变。

ExpertPdf 的实现:

// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Convert HTML string to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlString("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        System.IO.File.WriteAllBytes("output.pdf", pdfBytes);

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

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Convert HTML string to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlString("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        System.IO.File.WriteAllBytes("output.pdf", pdfBytes);

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

IronPDF 实现:

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

class Program
{
    static void Main()
    {
        // Create a PDF from HTML string
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        pdf.SaveAs("output.pdf");

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

class Program
{
    static void Main()
    {
        // Create a PDF from HTML string
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        pdf.SaveAs("output.pdf");

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

IronPDF 的方法会返回一个 PdfDocument 对象,在保存之前可以进行其他操作(合并、水印、安全)。 有关更多选项,请参阅 HTML 转 PDF 文档

将 URL 转换为带有页面设置的 PDF 文件

ExpertPdf 的实现:

// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Set page size and orientation
        pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
        pdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;

        // Convert URL to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromUrl("https://www.example.com");

        // Save to file
        System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);

        Console.WriteLine("PDF from URL created successfully!");
    }
}
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Set page size and orientation
        pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
        pdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;

        // Convert URL to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromUrl("https://www.example.com");

        // Save to file
        System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);

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

IronPDF 实现:

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

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Set page size and orientation
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;

        // Convert URL to PDF
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        // Save to file
        pdf.SaveAs("webpage.pdf");

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

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Set page size and orientation
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;

        // Convert URL to PDF
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        // Save to file
        pdf.SaveAs("webpage.pdf");

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

IronPDF 的 RenderingOptions 为页面配置提供了直接的属性访问。 有关更多选项,请参阅 URL to PDF 文档

带页码的页眉和页脚

本示例展示了页眉/页脚配置的关键区别--ExpertPdf 使用单独的PdfHeaderOptionsPdfFooterOptions类,并带有 &p;/&P; 标记,而IronPDF使用 TextHeaderFooter 并带有 {page}/{total-pages} 占位符。

ExpertPdf 的实现:

// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Enable header
        pdfConverter.PdfHeaderOptions.ShowHeader = true;
        pdfConverter.PdfHeaderOptions.HeaderText = "Document Header";
        pdfConverter.PdfHeaderOptions.HeaderTextAlignment = HorizontalTextAlign.Center;

        // Enable footer with page numbers
        pdfConverter.PdfFooterOptions.ShowFooter = true;
        pdfConverter.PdfFooterOptions.FooterText = "Page &p; of &P;";
        pdfConverter.PdfFooterOptions.FooterTextAlignment = HorizontalTextAlign.Right;

        // Convert HTML file to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlFile("input.html");

        // Save to file
        System.IO.File.WriteAllBytes("output-with-header-footer.pdf", pdfBytes);

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Enable header
        pdfConverter.PdfHeaderOptions.ShowHeader = true;
        pdfConverter.PdfHeaderOptions.HeaderText = "Document Header";
        pdfConverter.PdfHeaderOptions.HeaderTextAlignment = HorizontalTextAlign.Center;

        // Enable footer with page numbers
        pdfConverter.PdfFooterOptions.ShowFooter = true;
        pdfConverter.PdfFooterOptions.FooterText = "Page &p; of &P;";
        pdfConverter.PdfFooterOptions.FooterTextAlignment = HorizontalTextAlign.Right;

        // Convert HTML file to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlFile("input.html");

        // Save to file
        System.IO.File.WriteAllBytes("output-with-header-footer.pdf", pdfBytes);

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF 实现:

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

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Configure header
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Document Header",
            DrawDividerLine = true
        };

        // Configure footer with page numbers
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            RightText = "Page {page} of {total-pages}",
            DrawDividerLine = true
        };

        // Convert HTML file to PDF
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");

        // Save to file
        pdf.SaveAs("output-with-header-footer.pdf");

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

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Configure header
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Document Header",
            DrawDividerLine = true
        };

        // Configure footer with page numbers
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            RightText = "Page {page} of {total-pages}",
            DrawDividerLine = true
        };

        // Convert HTML file to PDF
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");

        // Save to file
        pdf.SaveAs("output-with-header-footer.pdf");

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF 的 TextHeaderFooter 提供了 LeftText, CenterTextRightText 属性,并带有可选的分隔线。 对于基于 HTML 的标题,请使用 HtmlHeaderFooter. 有关更多选项,请参阅页眉和页脚文档

关键迁移说明

许可密钥位置

ExpertPdf 采用按转换器授权的方式。IronPDF在启动时使用一次全局许可设置:

//ExpertPdf- per converter
pdfConverter.LicenseKey = "EXPERTPDF-LICENSE";

//IronPDF- global, set once
IronPdf.License.LicenseKey = "IRONPDF-LICENSE";
//ExpertPdf- per converter
pdfConverter.LicenseKey = "EXPERTPDF-LICENSE";

//IronPDF- global, set once
IronPdf.License.LicenseKey = "IRONPDF-LICENSE";
$vbLabelText   $csharpLabel

页面编号标记转换

用IronPDF占位符替换ExpertPdf标记:

// ExpertPdf
"Page &p; of &P;"

// IronPDF
"Page {page} of {total-pages}"
// ExpertPdf
"Page &p; of &P;"

// IronPDF
"Page {page} of {total-pages}"
$vbLabelText   $csharpLabel

碎片化软件包合并

ExpertPdf 的独立软件包(PDFMerge、PDFSecurity、PDFSplit、PdfToImage)均包含在 IronPdf 的单一软件包中:

//ExpertPdf- requires separate PDFMerge package
var merger = new PdfMerge();
merger.AppendPDFFile("file1.pdf");
merger.AppendPDFFile("file2.pdf");
merger.SaveMergedPDFToFile("merged.pdf");

//IronPDF- included in main package
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
//ExpertPdf- requires separate PDFMerge package
var merger = new PdfMerge();
merger.AppendPDFFile("file1.pdf");
merger.AppendPDFFile("file2.pdf");
merger.SaveMergedPDFToFile("merged.pdf");

//IronPDF- included in main package
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
$vbLabelText   $csharpLabel

有关更多合并选项,请参阅 IronPDF合并文档

自定义页面大小

ExpertPdf 使用点。 IronPdf 使用毫米。 转换:点 / 72 * 25.4 = 毫米`

迁移后核对表

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

  • 生成PDF文件的可视化比较
  • 核对页眉/页脚和页码
  • 测试安全/加密设置
  • 验证合并操作
  • 检查自定义页面尺寸
  • 性能基准测试
  • 跨平台测试
  • 删除ExpertPdf许可证文件
  • 更新文档

未来保护您的 PDF 基础架构

.NET10即将推出,C# 14也将引入新的语言特性,因此选择一个开发活跃、渲染现代的 PDF 库可以确保长期的兼容性。IronPDF的每月更新和最新 Chrome 引擎为 PDF 生成奠定了基础,当项目扩展到 2025 年和 2026 年时,PDF 生成将继续正确使用现代 CSS3 布局(Flexbox、Grid)--不像ExpertPdf的传统 Chrome 版本被冻结在时间中。

其他资源


从ExpertPdf迁移到IronPDF可以消除文档冻结、传统 Chrome 浏览器渲染、零散的产品许可和有限的现代 .NET 支持等难题。 过渡到使用最新 Chromium 引擎积极维护的库,可确保您的 PDF 生成与不断发展的网络标准和 .NET Framework 保持同步。

Curtis Chau
技术作家

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

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