如何使用 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。 QuestPDF在開發人員需要使用C#程式碼從頭生成文件而不依賴HTML的情境中表現出色。
社區層級在MIT條款下對個人、非營利組織、開放原始碼專案和年收入低於100萬美元的組織免費。 超過該門檻後,QuestPDF提供的專業授權起價為999美元(永久授權,最多10位開發者),組織範圍的企業授權為2,999美元(永久授權),這些都需要納入長期規劃中。
核心問題:核心庫中無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條款)對個人、非營利組織、開放原始碼專案和年收入低於100萬美元的組織是免費的。 超過該門檻,您需要999美元的專業授權(永久授權,最多10位開發者)或2,999美元的企業(永久,組織範圍)。 由於觸發機制是您的組織收入而非座位數量,這可能會改變下游客戶的談話以及您自己的授權。
IronPDF 提供按開發者的商業授權:無收入審計,無客戶授權要求,成本可預測。
對於採用現代 .NET 版本的團隊,IronPDF 提供不基於收入的觸發按開發者授權,並使用標準HTML/CSS方法,利用現有的Web開發技能。
開始之前
前提條件
- .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 all QuestPDF usages in your codebase
grep -r "QuestPDF\|Document.Create\|\.GeneratePdf" --include="*.cs" .
# Find all QuestPDF usages 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 <p>, <h1>, <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
之後(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:Document.Create(), container.Page(), page.Content().Column(), .FontSize(20).Bold()的方法鏈進行樣式設計。 您還必須使用QuestPDF.Settings.License = LicenseType.Community設置授權型別。
IronPDF使用任何Web開發人員都知道的標準HTML:<p>用於段落。無需學習新的佈局DSL。 IronPDF的方法提供了更乾淨的語法,並與現代.NET 網路棧的其餘部分整合。 查看更多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
之後(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
之後(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使用FontSize。 {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() |
display: flex; flex-direction: column |
.Row() |
display: flex; flex-direction: row |
.RelativeItem() |
flex: 1 |
.Table() |
<table> 元素 |
.PaddingTop(20) |
<br/> |
.AlignCenter() |
text-align: center |
.FontSize(24) |
font-size: 24px |
.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到PDF | 核心:不支持(通過QuestPDF.HTML擴展有限支持) |
主要功能 |
| 學習曲線 | 流暢C# API | 標準Web技能 |
| 模板預覽 | 附屬應用 | 任何瀏覽器 |
| 設計協同 | 僅限開發人員 | 設計師與開發人員 |
| 現有資產 | 必須重建 | 重複使用HTML/CSS |
| PDF 操作 | 合併/提取/覆蓋(文件操作API,2024.12.0+) | 支援 |
| 安全/簽名 | 加密及權限(無數位簽章) | 加密及數位簽章 |
| 授權模型 | 基於收入(100萬美元門檻) | 每開發者 |
| 客戶影響 | 可能需要超過100萬美元收入的授權 | None |
| Bootstrap/Tailwind | 不支持 | 支援 |
| URL至PDF | 不支持 | 支援 |
遷移檢查表
遷移前
- 跨越所有QuestPDF文件模板(
Document.Create,.GeneratePdf) - 記錄所使用的DSL模式(
.Column(),.Row(),.Table(),.Text()) - 將樣式方法映射到CSS對應項
- 獲取IronPDF授權金鑰來自ironpdf.com
套件變更
- 移除
QuestPDFNuGet包 - 安裝
IronPdfNuGet包:dotnet add package IronPdf
程式碼變更
- 更新命名空間導入
- 移除
QuestPDF.Settings.License = LicenseType.Community - 轉換
ChromePdfRenderer+ HTML - 替換
.Column()/.Row()為CSS Flexbox - 用HTML
.Table() - 轉換
<h1 style='...'> - 用
page.Header()/page.Footer() - 用
.CurrentPageNumber() - 轉換
pdf.SaveAs() - 在應用程式啟動時新增授權初始化
遷移後
- PDF輸出的視覺比較
- 測試多頁文件中的正確分頁
- 根據需要新增新功能(安全性、合併、URL至PDF)

