如何在C#中将PDF转换为HTML
Full Comparison
Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against QuestPDF on pricing, HTML support, and licensing.
从QuestPDF迁移到IronPDF将您的 PDF 生成工作流程从 C# 流畅布局 API 转向基于标准 HTML/CSS 的方法,具有更广泛的 PDF 操作能力。 本指南提供逐步迁移路径,使您可以利用现有的 web 技能,重用 HTML 模板,并获取QuestPDF核心库所不包含的功能。
为什么要从QuestPDF迁移到 IronPDF.
了解 QuestPDF
QuestPDF 是一个现代、流畅的 API,专门用于用 C# 编程生成 PDF。 不同于提供全面 HTML 转 PDF 转换的库,QuestPDF 核心库仅限于程序化布局 API。 在开发人员需要使用 C# 代码从头开始生成文档,而不依赖 HTML 的场景中,QuestPDF 表现出色。
社区层在 MIT 条款下免费为个人、非营利组织、FOSS 项目和年总收入低于 100 万美元的组织使用。 超过该阈值,QuestPDF 提供起价 999 美元的 Professional 许可证(永久许可,最多 10 名开发者)和 2,999 美元的 Enterprise 许可证(永久性,组织范围),需要纳入长期规划。
核心问题:核心库中没有 HTML 引擎
有时会推荐使用QuestPDF进行 HTML 转 PDF 转换,但核心库不渲染 HTML。 社区维护的QuestPDF.HTML扩展覆盖了HTML/CSS的有限子集,但核心引擎仅限于编程方式,并且不运行真实的浏览器引擎。已经拥有HTML/CSS模板的团队通常需要在流畅API中重建它们。
| 特征 | QuestPDF | IronPDF |
|---|---|---|
| HTML 到 PDF(核心) | 不支持(仅限流畅 API) | 全面支持 |
| HTML 到 PDF(扩展) | 通过QuestPDF.HTML部分支持(有限子集) |
全面支持 |
| CSS样式 | 通过扩展有限 | 完整的 CSS3 |
| 现有模板 | 必须从头开始 | 重复使用 HTML/CSS 资产 |
| 设计工具兼容性 | None | 任何网页设计工具 |
| 学习曲线 | 新的流畅 C# API | 网络技能转移 |
| 布局预览 | 配套应用 | 在任何浏览器中预览 |
| PDF 操作 | 合并/提取/叠加/加密(文档操作 API,2024.12.0+) | 合并、拆分、编辑、签署 |
IronPDF 提供QuestPDF核心不包括的原生 HTML 转 PDF 渲染,消除了在 C# 代码中手动重建文档的需要。 它还涵盖了 PDF 操作功能,例如合并、拆分、编辑、保护和数字签名 -QuestPDF的文件操作 API(2024.12.0+)涵盖了合并、页面提取、叠加/衬底、附件和加密,但不包括编辑现有页面内容、OCR 或数字签名。
QuestPDF许可模式
QuestPDF 的社区许可证(MIT 条款)对个人、非营利组织、FOSS 项目和年总收入低于 100 万美元的组织免费。 超过这个阈值,您需要购买 999 美元(永久许可,最多 10 名开发者)的 Professional 许可证或 2,999 美元(永久性,整个组织)的 Enterprise 许可证。 因为触发条件是您组织的收入而不是席位数量,这也会改变下游客户端的对话以及您自己的许可情况。
IronPDF 提供每个开发者的商业许可证:无需收入审计,无需客户端许可要求,且成本可预测。
对于采用现代 .NET 版本的团队,IronPDF 提供不受收入触发影响的每个开发者许可证,并利用现有 web 开发技能的标准 HTML/CSS 方法。
开始之前
前提条件
- .NET 环境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 访问权限:能够安装 NuGet 包
- IronPDF 许可证:请从ironpdf.com获取您的许可证密钥。
NuGet 软件包变更
# Remove QuestPDF
dotnet remove package QuestPDF
# Add IronPDF
dotnet add package IronPdf
# Remove QuestPDF
dotnet remove package QuestPDF
# Add 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"
查找QuestPDF使用情况
# Find allQuestPDFusages in your codebase
grep -r "QuestPDF\|Document.Create\|\.GeneratePdf" --include="*.cs" .
# Find allQuestPDFusages in your codebase
grep -r "QuestPDF\|Document.Create\|\.GeneratePdf" --include="*.cs" .
完整的 API 参考
命名空间变更
// Before: QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
// After: IronPDF
using IronPdf;
// Before: QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
// After: IronPDF
using IronPdf;
Imports IronPdf
核心 API 映射
| QuestPDF 概念 | IronPDF 同等产品 |
|---|---|
Document.Create() |
new ChromePdfRenderer() |
.Page() |
RenderHtmlAsPdf() |
.Text() |
HTML <span> |
.Bold() |
CSS font-weight: bold |
.FontSize(24) |
CSS font-size: 24px |
.Image() |
HTML <img src="..."> |
.Table() |
HTML <table> |
.Column() |
CSS display: flex; flex-direction: column |
.Row() |
CSS display: flex; flex-direction: row |
PageSizes.A4 |
RenderingOptions.PaperSize |
.Margin() |
RenderingOptions.Margin* |
.GeneratePdf() |
pdf.SaveAs() |
| 不适用 | PdfDocument.Merge() |
| 不适用 | PdfDocument.FromFile() |
| 不适用 | pdf.SecuritySettings |
代码迁移示例
示例 1:基本文档创建(HTML 转 PDF)
之前 (QuestPDF):
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Content().Column(column =>
{
column.Item().Text("Hello World").FontSize(20).Bold();
column.Item().Text("This is a paragraph of text.");
});
});
}).GeneratePdf("output.pdf");
}
}
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Content().Column(column =>
{
column.Item().Text("Hello World").FontSize(20).Bold();
column.Item().Text("This is a paragraph of text.");
});
});
}).GeneratePdf("output.pdf");
}
}
Imports QuestPDF.Fluent
Imports QuestPDF.Helpers
Imports QuestPDF.Infrastructure
Module Program
Sub Main()
QuestPDF.Settings.License = LicenseType.Community
Document.Create(Sub(container)
container.Page(Sub(page)
page.Size(PageSizes.A4)
page.Margin(2, Unit.Centimetre)
page.Content().Column(Sub(column)
column.Item().Text("Hello World").FontSize(20).Bold()
column.Item().Text("This is a paragraph of text.")
End Sub)
End Sub)
End Sub).GeneratePdf("output.pdf")
End Sub
End Module
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a paragraph of text.</p>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a paragraph of text.</p>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a paragraph of text.</p>")
pdf.SaveAs("output.pdf")
End Sub
End Class
这个例子展示了范式的差异。 QuestPDF需要学习其流畅API:.FontSize(20).Bold()的方法链样式化。 您还必须使用QuestPDF.Settings.License = LicenseType.Community设置许可证类型。
IronPDF使用任何网络开发人员都知道的标准HTML:标题使用<p>。无需学习新的布局DSL。IronPDF的方法提供了更清晰的语法,并可以与现代 .NET web 堆栈的其余部分集成。 请参阅 HTML 转 PDF 文档,了解全面的示例。
示例 2:发票生成
之前 (QuestPDF):
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Content().Column(column =>
{
column.Item().Text("INVOICE").FontSize(24).Bold();
column.Item().Text("Invoice #: 12345").FontSize(12);
column.Item().PaddingTop(20);
column.Item().Text("Customer: John Doe");
column.Item().Text("Total: $100.00").Bold();
});
});
}).GeneratePdf("invoice.pdf");
}
}
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Content().Column(column =>
{
column.Item().Text("INVOICE").FontSize(24).Bold();
column.Item().Text("Invoice #: 12345").FontSize(12);
column.Item().PaddingTop(20);
column.Item().Text("Customer: John Doe");
column.Item().Text("Total: $100.00").Bold();
});
});
}).GeneratePdf("invoice.pdf");
}
}
Imports QuestPDF.Fluent
Imports QuestPDF.Helpers
Imports QuestPDF.Infrastructure
Module Program
Sub Main()
QuestPDF.Settings.License = LicenseType.Community
Document.Create(Sub(container)
container.Page(Sub(page)
page.Size(PageSizes.A4)
page.Margin(2, Unit.Centimetre)
page.Content().Column(Sub(column)
column.Item().Text("INVOICE").FontSize(24).Bold()
column.Item().Text("Invoice #: 12345").FontSize(12)
column.Item().PaddingTop(20)
column.Item().Text("Customer: John Doe")
column.Item().Text("Total: $100.00").Bold()
End Sub)
End Sub)
End Sub).GeneratePdf("invoice.pdf")
End Sub
End Module
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = @"
<h1>INVOICE</h1>
<p>Invoice #: 12345</p>
<br/>
<p>Customer: John Doe</p>
<p><strong>Total: $100.00</strong></p>
";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("invoice.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = @"
<h1>INVOICE</h1>
<p>Invoice #: 12345</p>
<br/>
<p>Customer: John Doe</p>
<p><strong>Total: $100.00</strong></p>
";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("invoice.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim htmlContent As String = "
<h1>INVOICE</h1>
<p>Invoice #: 12345</p>
<br/>
<p>Customer: John Doe</p>
<p><strong>Total: $100.00</strong></p>
"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("invoice.pdf")
End Sub
End Class
QuestPDF使用.PaddingTop(20)进行间距。 IronPDF使用标准HTML:标题使用<strong>。
真正的优势:使用 IronPDF,设计人员可以独立创建和修改 HTML 模板。 使用 QuestPDF,每次设计变更都需要 C# 开发人员修改代码。 在我们的教程中了解更多信息。
示例 3:带页码的页眉和页脚
之前 (QuestPDF):
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Header().Text("Document Header").FontSize(14).Bold();
page.Content().Text("Main content of the document.");
page.Footer().AlignCenter().Text(text =>
{
text.Span("Page ");
text.CurrentPageNumber();
});
});
}).GeneratePdf("document.pdf");
}
}
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
class Program
{
static void Main()
{
QuestPDF.Settings.License = LicenseType.Community;
Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
page.Header().Text("Document Header").FontSize(14).Bold();
page.Content().Text("Main content of the document.");
page.Footer().AlignCenter().Text(text =>
{
text.Span("Page ");
text.CurrentPageNumber();
});
});
}).GeneratePdf("document.pdf");
}
}
Imports QuestPDF.Fluent
Imports QuestPDF.Helpers
Imports QuestPDF.Infrastructure
Module Program
Sub Main()
QuestPDF.Settings.License = LicenseType.Community
Document.Create(Sub(container)
container.Page(Sub(page)
page.Size(PageSizes.A4)
page.Margin(2, Unit.Centimetre)
page.Header().Text("Document Header").FontSize(14).Bold()
page.Content().Text("Main content of the document.")
page.Footer().AlignCenter().Text(Sub(text)
text.Span("Page ")
text.CurrentPageNumber()
End Sub)
End Sub)
End Sub).GeneratePdf("document.pdf")
End Sub
End Module
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = "<p>Main content of the document.</p>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.Header = new TextHeaderFooter()
{
CenterText = "Document Header",
FontSize = 14
};
pdf.Footer = new TextHeaderFooter()
{
CenterText = "Page {page}"
};
pdf.SaveAs("document.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var htmlContent = "<p>Main content of the document.</p>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.Header = new TextHeaderFooter()
{
CenterText = "Document Header",
FontSize = 14
};
pdf.Footer = new TextHeaderFooter()
{
CenterText = "Page {page}"
};
pdf.SaveAs("document.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim htmlContent As String = "<p>Main content of the document.</p>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.Header = New TextHeaderFooter() With {
.CenterText = "Document Header",
.FontSize = 14
}
pdf.Footer = New TextHeaderFooter() With {
.CenterText = "Page {page}"
}
pdf.SaveAs("document.pdf")
End Sub
End Class
QuestPDF使用.CurrentPageNumber()。 IronPDF使用带有属性如TextHeaderFooter对象。 {page}占位符自动插入当前页码。
关键迁移说明
范式转变
核心变化是从自定义的 C# 流畅布局 API 迁移到标准 HTML/CSS:
// QuestPDF: Fluent C# layout API
container.Page(page =>
{
page.Content().Column(column =>
{
column.Item().Text("Invoice").Bold().FontSize(24);
column.Item().Row(row =>
{
row.RelativeItem().Text("Customer:");
row.RelativeItem().Text("Acme Corp");
});
});
});
// IronPDF: Standard HTML/CSS
var html = @"
<div style='font-family: Arial; padding: 40px;'>
<h1 style='font-weight: bold; font-size: 24px;'>Invoice</h1>
<div style='display: flex; justify-content: space-between;'>
<span>Customer:</span>
<span>Acme Corp</span>
</div>
</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// QuestPDF: Fluent C# layout API
container.Page(page =>
{
page.Content().Column(column =>
{
column.Item().Text("Invoice").Bold().FontSize(24);
column.Item().Row(row =>
{
row.RelativeItem().Text("Customer:");
row.RelativeItem().Text("Acme Corp");
});
});
});
// IronPDF: Standard HTML/CSS
var html = @"
<div style='font-family: Arial; padding: 40px;'>
<h1 style='font-weight: bold; font-size: 24px;'>Invoice</h1>
<div style='display: flex; justify-content: space-between;'>
<span>Customer:</span>
<span>Acme Corp</span>
</div>
</div>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
' QuestPDF: Fluent VB.NET layout API
container.Page(Sub(page)
page.Content().Column(Sub(column)
column.Item().Text("Invoice").Bold().FontSize(24)
column.Item().Row(Sub(row)
row.RelativeItem().Text("Customer:")
row.RelativeItem().Text("Acme Corp")
End Sub)
End Sub)
End Sub)
' IronPDF: Standard HTML/CSS
Dim html As String = "
<div style='font-family: Arial; padding: 40px;'>
<h1 style='font-weight: bold; font-size: 24px;'>Invoice</h1>
<div style='display: flex; justify-content: space-between;'>
<span>Customer:</span>
<span>Acme Corp</span>
</div>
</div>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
布局模式转换
| QuestPDF 模式 | HTML/CSS 同等内容 |
|---|---|
.Column() |
显示:flex; flex-direction: column |
.Row() |
显示:flex; flex-direction: row |
.RelativeItem() |
flex: 1 |
.Table() |
<table>元素 |
.PaddingTop(20) |
padding-top: 20px 或 <br/> |
.AlignCenter() |
text-align: center |
.FontSize(24) |
font-size: 24px |
.Bold() |
font-weight: bold 或 <strong> |
页面设置转换
// QuestPDF
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
// IronPDF
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20; // mm (2cm = 20mm)
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
// QuestPDF
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);
// IronPDF
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20; // mm (2cm = 20mm)
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
' QuestPDF
page.Size(PageSizes.A4)
page.Margin(2, Unit.Centimetre)
' IronPDF
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20 ' mm (2cm = 20mm)
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
迁移后的新功能
迁移到IronPDF后,您将获得QuestPDF无法提供的功能:
PDF 合并
var cover = renderer.RenderHtmlAsPdf("<h1>Cover</h1>");
var content = renderer.RenderHtmlAsPdf(reportHtml);
var existing = PdfDocument.FromFile("appendix.pdf");
var merged = PdfDocument.Merge(cover, content, existing);
merged.SaveAs("complete.pdf");
var cover = renderer.RenderHtmlAsPdf("<h1>Cover</h1>");
var content = renderer.RenderHtmlAsPdf(reportHtml);
var existing = PdfDocument.FromFile("appendix.pdf");
var merged = PdfDocument.Merge(cover, content, existing);
merged.SaveAs("complete.pdf");
Dim cover = renderer.RenderHtmlAsPdf("<h1>Cover</h1>")
Dim content = renderer.RenderHtmlAsPdf(reportHtml)
Dim existing = PdfDocument.FromFile("appendix.pdf")
Dim merged = PdfDocument.Merge(cover, content, existing)
merged.SaveAs("complete.pdf")
PDF安全
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "reader";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("protected.pdf");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "reader";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("protected.pdf");
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SecuritySettings.OwnerPassword = "admin"
pdf.SecuritySettings.UserPassword = "reader"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
pdf.SaveAs("protected.pdf")
URL到PDF
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
var pdf = renderer.RenderUrlAsPdf("https://example.com/report");
pdf.SaveAs("webpage.pdf");
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;
var pdf = renderer.RenderUrlAsPdf("https://example.com/report");
pdf.SaveAs("webpage.pdf");
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = True
Dim pdf = renderer.RenderUrlAsPdf("https://example.com/report")
pdf.SaveAs("webpage.pdf")
加载和编辑现有 PDF 文件
var pdf = PdfDocument.FromFile("existing.pdf");
// Modify, merge, add security, etc.
pdf.SaveAs("modified.pdf");
var pdf = PdfDocument.FromFile("existing.pdf");
// Modify, merge, add security, etc.
pdf.SaveAs("modified.pdf");
Dim pdf = PdfDocument.FromFile("existing.pdf")
' Modify, merge, add security, etc.
pdf.SaveAs("modified.pdf")
功能对比摘要
| 特征 | QuestPDF | IronPDF |
|---|---|---|
| HTML-to-PDF | 核心:不支持(通过QuestPDF.HTML扩展有限支持) |
主要特点 |
| 学习曲线 | 流畅 C# API | 标准网络技能 |
| 模板预览 | 配套应用 | 任何浏览器 |
| 设计协作 | 仅限开发人员 | 设计师 + 开发人员 |
| 现有资产 | 必须重建 | 重复使用 HTML/CSS |
| PDF 操作 | 合并/提取/叠加(文档操作 API,2024.12.0+) | 支持 |
| 安全/签名 | 加密 + 权限(无数字签名) | 加密 + 数字签名 |
| 许可模式 | 收入为基础(100 万美元门槛) | 每个开发人员 |
| 客户影响 | 可能需要超过 100 万美元收入的许可证 | None |
| Bootstrap/Tailwind(尾风 | 不支持 | 支持 |
| URL 转 PDF | 不支持 | 支持 |
迁移清单
迁移前
- 识别所有QuestPDF文档模板(
.GeneratePdf) - 记录使用的DSL模式(
.Text()) 将样式方法映射到等效的 CSS 样式 - 从ironpdf.com获取IronPDF许可证密钥
软件包变更
- 删除
QuestPDFNuGet包 - 安装
IronPdfNuGet包:dotnet add package IronPdf
代码更改
- 更新命名空间导入
- 删除
QuestPDF.Settings.License = LicenseType.Community - 转换
ChromePdfRenderer+ HTML - 替换
.Column()/.Row()为CSS Flexbox - 替换
.Table()为HTML<table>元素 - 转换
<h1 style='...'> - 替换
page.Header()/TextHeaderFooter - 替换
{page}占位符 - 转换
pdf.SaveAs() - 在应用程序启动时添加许可证初始化
后迁移
- PDF 输出的视觉比较
- 测试多页文档的分页符是否正确
- 根据需要添加新功能(安全性、合并、URL 转 PDF)

