如何在 C# 中从 SelectPdf 迁移到 IronPDF
从选择 PDF迁移到IronPDF可将您的 PDF 生成工作流程从使用过时渲染引擎的 Windows 专用解决方案转变为完全支持 CSS3 和 JavaScript 的现代跨平台库。 本指南提供了一个完整的、循序渐进的迁移路径,可以部署到 Linux、Docker、Azure Functions 以及选择 PDF无法支持的其他云平台。
为什么要从选择 PDF迁移到 IronPDF.
了解 SelectPdf.
SelectPdf 是一个商业库,旨在使用 C# 将 HTML 内容转换为 PDF。 该库专为需要在其应用程序中无缝集成 PDF 生成功能的开发人员量身定制。选择 PDF的优势在于其简单的应用程序接口(API),这使它成为那些 PDF 生成新手的理想选择。
但是,潜在用户必须了解其关键的局限性。 尽管选择 PDF宣传具有跨平台功能,但它只能在 Windows 环境下运行。 在考虑基于云的部署解决方案(如Azure 功能或 Docker 等容器)时,这会造成很大的障碍。 此外,其免费版本有很大的局限性,在应用激进的水印之前最多只能翻译 5 页。选择 PDF采用了过时的 Blink fork 和基于 WebKit 的架构,这导致了与CSS 网格和高级 flexbox 等现代网络技术的兼容性问题。
SelectPdf的关键限制
| 问题 | 影响 | IronPDF 解决方案 |
|---|---|---|
| 仅限窗口 | 无法部署到 Linux、Docker、Azure 功能 | 完全跨平台支持 |
| 过时的呈现引擎。 | 现代 CSS 失效,布局中断 | 最新的 Chromium |
| 5页免费版本限制 | 在 5 页之后添加强力水印 | 免费试用 |
| 不支持 .NET 10 | 面向未来的问题 | 完全支持 .NET 10 |
| 云部署受阻 | 无法使用 AWS Lambda、Azure Functions | 云原生 |
选择 PDF与IronPDF对比
| 特征 | 选择 PDF | IronPDF |
|---|---|---|
| 平台支持 | 仅限 Windows | 完全跨平台,10 多个发行版 |
| 支持现代网络标准 | 有限(过时 Blink) | 完全 CSS3、现代 Chromium |
| 最大免费版本页数限制 | 5 页 | 灵活,无硬性限制 |
| 定价 | 起价 499 美元 | 透明灵活的定价 |
| .NET 10 支持。 | 无 | 支持 |
| 云环境中的部署 | 不支持 | 完全支持 |
| CSS 网格 | 有限的 | 支持 |
| Flexbox | 有限的 | 支持 |
| CSS变量 | 不支持 | 支持 |
| 对接程序 | 不支持 | 官方图片 |
| Azure 函数 | 不支持 | 支持 |
| AWS-Lambda(AWS Lambda | 不支持 | 支持 |
对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队,SelectPdf 明确表示不支持 .NET 10,从而产生了面向未来的问题。IronPDF提供对所有现代 .NET 版本的全面支持。
开始之前
前提条件
- .NET 环境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9/10+
- NuGet 访问权限:能够安装 NuGet 包
- IronPDF 许可证:请从ironpdf.com获取您的许可证密钥。
NuGet 软件包变更
# Remove SelectPdf
dotnet remove package Select.HtmlToPdf
# Install IronPDF
dotnet add package IronPdf
# Remove SelectPdf
dotnet remove package Select.HtmlToPdf
# Install IronPDF
dotnet add package IronPdf
许可配置
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
完整的 API 参考
命名空间变更
// Before: SelectPdf
using SelectPdf;
// After: IronPDF
using IronPdf;
using IronPdf.Engines.Chrome;
// Before: SelectPdf
using SelectPdf;
// After: IronPDF
using IronPdf;
using IronPdf.Engines.Chrome;
' Before: SelectPdf
Imports SelectPdf
' After: IronPDF
Imports IronPdf
Imports IronPdf.Engines.Chrome
核心 API 映射
| 选择 PDF | IronPDF | 备注 |
|---|---|---|
HtmlToPdf |
ChromePdfRenderer |
核心转换器类 |
converter.ConvertHtmlString(html) |
renderer.RenderHtmlAsPdf(html) |
HTML 字符串转换 |
converter.ConvertUrl(url) |
renderer.RenderUrlAsPdf(url) |
URL 转换 |
doc.Save(path) |
pdf.SaveAs(path) |
保存到文件 |
doc.Close() |
不需要 | IronPDF 处理清理工作 |
converter.Options.PdfPageSize |
renderer.RenderingOptions.PaperSize |
纸张大小 |
converter.Options.PdfPageOrientation |
renderer.RenderingOptions.PaperOrientation |
定位 |
converter.Options.MarginTop |
renderer.RenderingOptions.MarginTop |
顶部保证金 |
converter.Options.MarginBottom |
renderer.RenderingOptions.MarginBottom |
底边 |
converter.Options.MarginLeft |
renderer.RenderingOptions.MarginLeft |
左侧空白 |
converter.Options.MarginRight |
renderer.RenderingOptions.MarginRight |
右边距 |
PdfPageSize.A4 |
PdfPaperSize.A4 |
A4 大小的枚举 |
PdfPageOrientation.Portrait |
PdfPaperOrientation.Portrait |
肖像枚举 |
PdfPageOrientation.Landscape |
PdfPaperOrientation.Landscape |
景观枚举 |
{page_number} |
{page} |
页码占位符 |
{total_pages} |
{total-pages} |
总页数占位符 |
代码迁移示例
示例 1:HTML 字符串到 PDF 的转换
之前 (SelectPdf):
// NuGet: Install-Package Select.HtmlToPdf
using SelectPdf;
using System;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
HtmlToPdf converter = new HtmlToPdf();
PdfDocument doc = converter.ConvertHtmlString(htmlContent);
doc.Save("document.pdf");
doc.Close();
Console.WriteLine("PDF generated from HTML string");
}
}
// NuGet: Install-Package Select.HtmlToPdf
using SelectPdf;
using System;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
HtmlToPdf converter = new HtmlToPdf();
PdfDocument doc = converter.ConvertHtmlString(htmlContent);
doc.Save("document.pdf");
doc.Close();
Console.WriteLine("PDF generated from HTML string");
}
}
Imports SelectPdf
Imports System
Class Program
Shared Sub Main()
Dim htmlContent As String = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim converter As New HtmlToPdf()
Dim doc As PdfDocument = converter.ConvertHtmlString(htmlContent)
doc.Save("document.pdf")
doc.Close()
Console.WriteLine("PDF generated from HTML string")
End Sub
End Class
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("document.pdf");
Console.WriteLine("PDF generated from HTML string");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("document.pdf");
Console.WriteLine("PDF generated from HTML string");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim htmlContent As String = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("document.pdf")
Console.WriteLine("PDF generated from HTML string")
End Sub
End Class
本示例展示了核心 API 的差异。选择 PDF使用 HtmlToPdf 作为转换器类,调用 ConvertHtmlString() 创建 PdfDocument,然后调用 Save() 和 Close() 进行持久化和清理。
IronPDF 使用 ChromePdfRenderer 和 RenderHtmlAsPdf(),返回 PdfDocument,该 SaveAs() 保存。 取消了 Close() 调用——IronPDF 自动处理资源管理。 请参阅 HTML 转 PDF 文档,了解全面的示例。
示例 2:URL 到 PDF 的转换
之前 (SelectPdf):
// NuGet: Install-Package Select.HtmlToPdf
using SelectPdf;
using System;
class Program
{
static void Main()
{
HtmlToPdf converter = new HtmlToPdf();
PdfDocument doc = converter.ConvertUrl("https://www.example.com");
doc.Save("output.pdf");
doc.Close();
Console.WriteLine("PDF created successfully");
}
}
// NuGet: Install-Package Select.HtmlToPdf
using SelectPdf;
using System;
class Program
{
static void Main()
{
HtmlToPdf converter = new HtmlToPdf();
PdfDocument doc = converter.ConvertUrl("https://www.example.com");
doc.Save("output.pdf");
doc.Close();
Console.WriteLine("PDF created successfully");
}
}
Imports SelectPdf
Imports System
Class Program
Shared Sub Main()
Dim converter As New HtmlToPdf()
Dim doc As PdfDocument = converter.ConvertUrl("https://www.example.com")
doc.Save("output.pdf")
doc.Close()
Console.WriteLine("PDF created successfully")
End Sub
End Class
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
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();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully")
End Sub
End Class
SelectPdf 的 ConvertUrl() 方法直接映射到IronPDF的 RenderUrlAsPdf()。 两者的关键区别在于渲染引擎:SelectPdf 使用的是过时的 Blink/WebKit fork,难以支持现代 CSS,而IronPDF使用的是最新稳定的 Chromium,完全支持 CSS3 和 JavaScript。 在我们的教程中了解更多信息。
示例 3:自定义页面设置和页边距
之前 (SelectPdf):
// NuGet: Install-Package Select.HtmlToPdf
using SelectPdf;
using System;
class Program
{
static void Main()
{
HtmlToPdf converter = new HtmlToPdf();
converter.Options.PdfPageSize = PdfPageSize.A4;
converter.Options.PdfPageOrientation = PdfPageOrientation.Portrait;
converter.Options.MarginTop = 20;
converter.Options.MarginBottom = 20;
converter.Options.MarginLeft = 20;
converter.Options.MarginRight = 20;
string html = "<html><body><h1>Custom Page Settings</h1></body></html>";
PdfDocument doc = converter.ConvertHtmlString(html);
doc.Save("custom-settings.pdf");
doc.Close();
Console.WriteLine("PDF with custom settings created");
}
}
// NuGet: Install-Package Select.HtmlToPdf
using SelectPdf;
using System;
class Program
{
static void Main()
{
HtmlToPdf converter = new HtmlToPdf();
converter.Options.PdfPageSize = PdfPageSize.A4;
converter.Options.PdfPageOrientation = PdfPageOrientation.Portrait;
converter.Options.MarginTop = 20;
converter.Options.MarginBottom = 20;
converter.Options.MarginLeft = 20;
converter.Options.MarginRight = 20;
string html = "<html><body><h1>Custom Page Settings</h1></body></html>";
PdfDocument doc = converter.ConvertHtmlString(html);
doc.Save("custom-settings.pdf");
doc.Close();
Console.WriteLine("PDF with custom settings created");
}
}
Imports SelectPdf
Imports System
Module Program
Sub Main()
Dim converter As New HtmlToPdf()
converter.Options.PdfPageSize = PdfPageSize.A4
converter.Options.PdfPageOrientation = PdfPageOrientation.Portrait
converter.Options.MarginTop = 20
converter.Options.MarginBottom = 20
converter.Options.MarginLeft = 20
converter.Options.MarginRight = 20
Dim html As String = "<html><body><h1>Custom Page Settings</h1></body></html>"
Dim doc As PdfDocument = converter.ConvertHtmlString(html)
doc.Save("custom-settings.pdf")
doc.Close()
Console.WriteLine("PDF with custom settings created")
End Sub
End Module
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Engines.Chrome;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
string html = "<html><body><h1>Custom Page Settings</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("custom-settings.pdf");
Console.WriteLine("PDF with custom settings created");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Engines.Chrome;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
string html = "<html><body><h1>Custom Page Settings</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("custom-settings.pdf");
Console.WriteLine("PDF with custom settings created");
}
}
Imports IronPdf
Imports IronPdf.Engines.Chrome
Imports System
Module Program
Sub Main()
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
Dim html As String = "<html><body><h1>Custom Page Settings</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("custom-settings.pdf")
Console.WriteLine("PDF with custom settings created")
End Sub
End Module
页面设置模式几乎完全相同,只是对属性名称进行了简单的更改:
converter.Options.PdfPageSize→renderer.RenderingOptions.PaperSizeconverter.Options.PdfPageOrientation→renderer.RenderingOptions.PaperOrientationPdfPageSize.A4→PdfPaperSize.A4PdfPageOrientation.Portrait→PdfPaperOrientation.Portrait
保证金属性保持相同的名称和单位。
仅限 Windows 的问题
选择 PDF的平台限制
尽管有各种营销宣传,但SelectPdf明确表示不支持:
- Linux(任何发行版)
- MacOS
- Docker 容器
- Azure 功能
- AWS Lambda
- 谷歌云功能
- 任何基于 ARM 的系统
这是一个基本的架构限制--SelectPdf 依赖于 Windows 特定的库,无法移植。
平台支持比较
|平台|选择 PDF|IronPDF| | ---------- | :---: | :---: ||Windows Server 2019+| ✅ | ✅ ||视窗 10/11| ✅ | ✅ ||Ubuntu 20.04+| ❌ | ✅ ||Debian 10+| ❌ | ✅ ||CentOS 7+| ❌ | ✅ ||高山 Linux| ❌ | ✅ ||亚马逊 Linux 2| ❌ | ✅ ||MacOS 10.15 以上| ❌ | ✅ ||Azure 应用服务(Linux)| ❌ | ✅ ||Azure 功能| ❌ | ✅ ||AWS Lambda| ❌ | ✅ ||Docker (Linux)| ❌ | ✅ ||Kubernetes| ❌ | ✅ |
过时的渲染引擎
CSS 功能支持比较
SelectPdf 使用的 Blink/WebKit fork 已经过时,跟不上现代网络标准的步伐:
| CSS 功能 | 选择 PDF | IronPDF |
|---|---|---|
| CSS 网格 | ⚠️ 部分/已损坏 | ✅ 全文 |
| Flexbox (基础) | ✅ | ✅ |
| Flexbox(间隙属性) | ❌ | ✅ |
| CSS 变量 | ❌ | ✅ |
| CSS calc() | ⚠️ 有限公司 | ✅ |
| @ 媒体打印 | ⚠️ 有限公司 | ✅ |
| @font-face | ⚠️ 有限公司 | ✅ |
| 网络字体 | ⚠️ 有限公司 | ✅ |
| SVG | ⚠️ Basic | ✅ 全文 |
| CSS 转换 | ⚠️ 有限公司 | ✅ |
| CSS 动画 | ❌ | ✅ |
迁移后的新功能
迁移到IronPDF后,您将获得选择 PDF无法提供的功能:
跨平台部署
// ✅IronPDF- Works everywhere
using IronPdf;
//Azure 应用服务(Linux)- WORKS
// Docker container - WORKS
//AWS Lambda- WORKS
// GitHub Actions on ubuntu-latest - WORKS
// macOS development - WORKS
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello</h1>");
pdf.SaveAs("output.pdf");
// ✅IronPDF- Works everywhere
using IronPdf;
//Azure 应用服务(Linux)- WORKS
// Docker container - WORKS
//AWS Lambda- WORKS
// GitHub Actions on ubuntu-latest - WORKS
// macOS development - WORKS
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello</h1>");
pdf.SaveAs("output.pdf");
Imports IronPdf
' ✅IronPDF- Works everywhere
'Azure 应用服务(Linux)- WORKS
' Docker container - WORKS
'AWS Lambda- WORKS
' GitHub Actions on ubuntu-latest - WORKS
' macOS development - WORKS
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello</h1>")
pdf.SaveAs("output.pdf")
现代 CSS 支持
// ✅IronPDF- Uses latest stable Chromium
var renderer = new ChromePdfRenderer();
var html = @"
<style>
:root { --primary: #007bff; --gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--gap); }
</style>
<div class='grid'>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 1</div>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 2</div>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// All modern CSS features render correctly!
// ✅IronPDF- Uses latest stable Chromium
var renderer = new ChromePdfRenderer();
var html = @"
<style>
:root { --primary: #007bff; --gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--gap); }
</style>
<div class='grid'>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 1</div>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 2</div>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html);
// All modern CSS features render correctly!
Imports IronPdf
' ✅IronPDF- Uses latest stable Chromium
Dim renderer As New ChromePdfRenderer()
Dim html As String = "
<style>
:root { --primary: #007bff; --gap: 20px; }
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--gap); }
</style>
<div class='grid'>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 1</div>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 2</div>
<div style='background: var(--primary); color: white; padding: 1rem;'>Item 3</div>
</div>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
' All modern CSS features render correctly!
无需 Close().
IronPDF 自动处理资源管理:
// Option 1: Let garbage collection handle it
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// No Close() needed
// Option 2: Explicit disposal
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
}
// Option 1: Let garbage collection handle it
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// No Close() needed
// Option 2: Explicit disposal
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
}
' Option 1: Let garbage collection handle it
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' No Close() needed
' Option 2: Explicit disposal
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Using
迁移清单
迁移前
- 审核代码库中所有选择 PDF的使用情况
- 记录当前转换器选项的映射
- 确定页眉/页脚的实现方式
- 检查页码占位符语法(
{page_number}→{page}) - 注意基本 URL 处理模式
- 验证目标部署平台
- 从ironpdf.com获取IronPDF许可证密钥
代码更新
- 删除
Select.HtmlToPdfNuGet 包 安装IronPdfNuGet 包 - 更新命名空间导入(
using SelectPdf;→using IronPdf;) - 将
HtmlToPdf替换为ChromePdfRenderer - 将
ConvertHtmlString()替换为RenderHtmlAsPdf() - 将
ConvertUrl()替换为RenderUrlAsPdf() - 更新选项属性名称(
Options.PdfPageSize→RenderingOptions.PaperSize) 将PdfPageSize转换为PdfPaperSize - 将
PdfPageOrientation转换为PdfPaperOrientation - 将
doc.Save()替换为pdf.SaveAs() - 删除所有
doc.Close()调用 - 修复页码占位符(
{page_number}→{page},{total_pages}→{total-pages}) - 在应用程序启动时添加许可证初始化
后迁移
- 运行所有单元测试
- 验证 CSS 渲染效果(尤其是 Grid/Flexbox 布局)
- 测试 JavaScript 执行
- 核对页眉/页脚页码
- 在目标平台(Linux、Docker 等)上进行测试
- 性能测试
- 比较 PDF 输出质量
- 更新 CI/CD 流水线
- 测试云部署(如适用)

