如何在 C# 中將 DynamicPDF 遷移到 IronPDF
為什麼要從 動態PDF 遷移到 IronPDF?
DynamicPDF 的產品碎片化是推動使用者遷移的主要因素。 了解許可模式對於評估目前實施方案的真實成本至關重要。
產品碎片化問題
DynamicPDF 以獨立產品銷售,並附有單獨的許可證:
1.動態 PDF 產生器:從零開始建立 PDF
- DynamicPDF Merger:合併、分割和處理現有 PDF 檔案(需另外購買)
- DynamicPDF核心套件:組合產生器和合併器
- DynamicPDF ReportWriter:報表生成
- DynamicPDF HTML Converter: HTML 轉 PDF 轉換(獨立外掛程式)
- DynamicPDF 列印管理器:以程式方式列印 PDF
一套完整的 PDF 解決方案需要 3-5 個 動態PDF 的獨立許可證。 IronPDF 將所有功能都包含在一個軟體包中。
架構比較
| 方面 | 動態PDF | IronPDF |
|---|---|---|
| 產品模型 | 分散的(5種以上產品) | 一體化圖書館 |
| 授權 | 需要多個許可證 | 單許可證 |
| HTML 轉 PDF | 單獨購買附加元件 | 內建的、基於鉻的 |
| CSS 支援 | 有限(需額外購買) | 完全基於 CSS3 的 Flexbox/Grid 佈局 |
| API 風格 | 基於座標的定位 | HTML/CSS + 操作 API |
| 學習曲線 | 陡峭(多個 API) | 溫和(網路技術) |
| 近代 .NET | .NET Standard 2.0 | .NET 6/7/8/9+ 原生 |
遷移的主要優勢
1.單包:一個 NuGet 套件即可取代 3-5 個 動態PDF 包 2.現代渲染: Chromium 引擎與傳統渲染
- Web 技術:使用 HTML/CSS 而非基於座標的定位 4.更簡潔的 API:程式碼更少,更易讀,更容易維護 5.無需額外購買: HTML、合併、安全功能全部包含在內
遷移前準備
先決條件
請確保您的環境符合以下要求:
- .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+ 或帶有 C# 擴充功能的 VS Code
- NuGet 套件管理器訪問
- IronPDF 許可證金鑰(可在ironpdf.com提供免費試用)
審核 動態PDF 使用情況
在解決方案目錄中執行以下命令,以識別所有 動態PDF 引用:
# Find all 動態PDF references
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep -i dynamic# Find all 動態PDF references
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep -i dynamic常見的軟體包:
ceTe.DynamicPDF.CoreSuite.NETceTe.DynamicPDF.Generator.NETceTe.DynamicPDF.Merger.NETceTe.DynamicPDF.HtmlConverter.NET
理解範式轉移
從 動態PDF 遷移到 IronPDF 時,最顯著的變化是文件建立方式的根本改變。 動態PDF 使用基於座標的定位,將元素放置在頁面上的特定 X、Y 座標處。 IronPDF 使用 HTML/CSS 渲染,您可以使用 Web 技術進行設計。
這種範式轉移意味著將Label 、 TextArea和Table2元素轉換為它們的 HTML 等效元素——這種改變通常會產生更易讀、更易於維護的程式碼。
逐步遷移過程
步驟 1:更新 NuGet 套件
移除所有 動態PDF 軟體包,然後安裝 IronPDF:
# Remove 動態PDF packages
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.Generator.NET
dotnet remove package ceTe.DynamicPDF.Merger.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET
# Install IronPDF
dotnet add package IronPdf# Remove 動態PDF packages
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.Generator.NET
dotnet remove package ceTe.DynamicPDF.Merger.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET
# Install IronPDF
dotnet add package IronPdf步驟 2:更新命名空間引用
將 動態PDF 命名空間替換為 IronPDF:
// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;
// Add this
using IronPdf;// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;
// Add this
using IronPdf;步驟 3:設定許可證
// 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";完整的 API 遷移參考
核心類別映射
| 動態PDF 類 | IronPDF當量 | 筆記 |
|---|---|---|
Document | ChromePdfRenderer | 用於產生新的PDF文件 |
Document | PdfDocument | 用於修改現有PDF |
Page | HTML<div>分頁符 | 或多次渲染。 |
MergeDocument | PdfDocument.Merge() | 靜態合併方法 |
HtmlConverter | ChromePdfRenderer | 內置,無需額外添加 |
頁面元素到 HTML 的映射
| 動態PDF 頁面元素 | IronPDF/HTML 等效項 |
|---|---|
Label | <p>,<span> ,<div> |
TextArea | <div>,<p>使用 CSS |
Image | <img>標籤 |
Table2 | HTML<table> |
PageNumberingLabel | {page} / {total-pages}佔位符 |
關鍵 API 映射
| 動態PDF | IronPDF | 筆記 |
|---|---|---|
Document + Page | ChromePdfRenderer | 基於 HTML 的生成 |
Label , TextArea | HTML<p> ,<div> | 使用 CSS 設定樣式 |
Table2 | HTML<table> | 完整的 CSS 樣式 |
MergeDocument | PdfDocument.Merge() | 靜態方法 |
HtmlConverter | ChromePdfRenderer | 內置,無需額外添加 |
document.Draw() | pdf.SaveAs() / pdf.BinaryData | |
PageNumberingLabel %%CP%% | {page}佔位符 | 不同的語法 |
程式碼遷移範例
HTML 轉 PDF
HTML 到 PDF 的轉換顯示 動態PDF 需要單獨的HtmlConverter插件,而 IronPDF 則內建了 Chromium 渲染功能。
DynamicPDF實作:
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
HtmlConverter converter = new HtmlConverter(html);
converter.Convert("output.pdf");
}
}// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
HtmlConverter converter = new HtmlConverter(html);
converter.Convert("output.pdf");
}
}IronPDF實現:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}IronPDF 的ChromePdfRenderer提供基於 Chromium 的渲染功能,並完全支援 CSS3——無需單獨購買外掛程式。 更多選項,請參閱HTML 轉 PDF 文件。
合併多個PDF文件
PDF 合併示範了 動態PDF 的MergeDocument類別(需要 Merger 產品許可證)與 IronPDF 的內建靜態Merge方法之間的差異。
DynamicPDF實作:
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;
class Program
{
static void Main()
{
MergeDocument document = new MergeDocument("document1.pdf");
document.Append("document2.pdf");
document.Draw("merged.pdf");
}
}// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;
class Program
{
static void Main()
{
MergeDocument document = new MergeDocument("document1.pdf");
document.Append("document2.pdf");
document.Draw("merged.pdf");
}
}IronPDF實現:
// NuGet: Install-Package IronPdf
using IronPdf;
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");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
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");
}
}IronPDF 的靜態Merge方法直接接受多個PdfDocument物件。 更多選項請參閱PDF 合併文件。
在PDF中加入文本
文字放置體現了從 動態PDF 基於座標的Label元素到 IronPDF 基於 HTML 的TextStamper範式轉變。
DynamicPDF實作:
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
class Program
{
static void Main()
{
Document document = new Document();
Page page = new Page(PageSize.Letter);
Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
page.Elements.Add(label);
document.Pages.Add(page);
document.Draw("output.pdf");
}
}// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
class Program
{
static void Main()
{
Document document = new Document();
Page page = new Page(PageSize.Letter);
Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
page.Elements.Add(label);
document.Pages.Add(page);
document.Draw("output.pdf");
}
}IronPDF實現:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalAlignment = VerticalAlignment.Top
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
var textStamper = new TextStamper()
{
Text = "Hello from IronPDF!",
FontSize = 20,
VerticalAlignment = VerticalAlignment.Top
};
pdf.ApplyStamp(textStamper);
pdf.SaveAs("output.pdf");
}
}IronPDF 的TextStamper提供基於對齊的定位,而不是基於座標的放置,使佈局能夠更好地適應不同的頁面尺寸。 更多選項,請參閱浮水印和印章文件。
完整文件產生範例
這個全面的範例展示如何將包含多個元素的 動態PDF 文件轉換為 IronPDF 的 HTML 方法。
DynamicPDF實作:
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);
Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");
// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);
Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");
// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");IronPDF實現:
using IronPdf;
var renderer = new ChromePdfRenderer();
// All features in one library
var html = @"
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; padding: 40px; }
h1 { text-align: center; font-size: 18pt; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ccc; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice Report</h1>
<table>
<tr><th>Product</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
</table>
</body>
</html>";
var invoice = renderer.RenderHtmlAsPdf(html);
// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");using IronPdf;
var renderer = new ChromePdfRenderer();
// All features in one library
var html = @"
<html>
<head>
<style>
body { font-family: Helvetica, sans-serif; padding: 40px; }
h1 { text-align: center; font-size: 18pt; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ccc; padding: 8px; }
</style>
</head>
<body>
<h1>Invoice Report</h1>
<table>
<tr><th>Product</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
</table>
</body>
</html>";
var invoice = renderer.RenderHtmlAsPdf(html);
// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");關鍵遷移說明
基於座標的 HTML/CSS 定位
這種根本性的典範轉移需要將 X、Y 座標定位轉換為基於 CSS 的佈局:
// 動態PDF - coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);
// IronPDF - CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";
// IronPDF - preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";// 動態PDF - coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);
// IronPDF - CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";
// IronPDF - preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";頁碼文法
DynamicPDF 和 IronPDF 使用不同的佔位語法來表示頁碼:
// 動態PDF placeholders
"Page %%CP%% of %%TP%%"
// IronPDF placeholders
"Page {page} of {total-pages}"// 動態PDF placeholders
"Page %%CP%% of %%TP%%"
// IronPDF placeholders
"Page {page} of {total-pages}"頁首和頁尾
將 動態PDF Template元素轉換為 IronPDF HtmlHeaderFooter :
// IronPDF header/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};// IronPDF header/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};如需更多頁首/頁尾選項,請參閱頁首和頁尾文件。
安全設定
// IronPDF security
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";// IronPDF security
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";有關全面的安全性選項,請參閱加密文件。
遷移後檢查清單
程式碼遷移完成後,請驗證以下內容:
- 產生PDF檔案的可視化比較
- 檢查文字位置和版面
- 測試表格渲染和溢出
- 檢查所有頁面的頁首/頁腳
- 測試表單填寫功能
- 驗證安全性/加密
- 性能基準測試
- 刪除未使用的 動態PDF 授權文件
- 更新文檔
讓您的 PDF 基礎架構面向未來
隨著 .NET 10 即將到來,C# 14 也引入了新的語言特性,選擇一個採用現代 .NET 模式的 PDF 函式庫可以確保長期的兼容性。 IronPDF 對 .NET 6/7/8/9+ 的原生支援為專案擴展到 2025 年和 2026 年提供了清晰的發展路徑,而無需管理多個產品授權或處理分散的 API。
其他資源
從 動態PDF 遷移到 IronPDF 可以消除管理多個產品授權的複雜性,同時提供基於 Chromium 的現代渲染和完整的 CSS3 支援。 從基於座標的定位過渡到 HTML/CSS 設計通常會產生更易於維護的程式碼,並利用熟悉的 Web 技術。






