跳至頁尾內容
移民指南

如何在 C# 中將 DynamicPDF 遷移到 IronPDF

為什麼要從 動態PDF 遷移到 IronPDF?

DynamicPDF 的產品碎片化是推動使用者遷移的主要因素。 了解許可模式對於評估目前實施方案的真實成本至關重要。

產品碎片化問題

DynamicPDF 以獨立產品銷售,並附有單獨的許可證:

1.動態 PDF 產生器:從零開始建立 PDF

  1. DynamicPDF Merger:合併、分割和處理現有 PDF 檔案(需另外購買)
  2. DynamicPDF核心套件:組合產生器和合併器
  3. DynamicPDF ReportWriter:報表生成
  4. DynamicPDF HTML Converter: HTML 轉 PDF 轉換(獨立外掛程式)
  5. DynamicPDF 列印管理器:以程式方式列印 PDF

一套完整的 PDF 解決方案需要 3-5 個 動態PDF 的獨立許可證。 IronPDF 將所有功能都包含在一個軟體包中。

架構比較

方面動態PDFIronPDF
產品模型分散的(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 引擎與傳統渲染

  1. 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
SHELL

常見的軟體包:

  • ceTe.DynamicPDF.CoreSuite.NET
  • ceTe.DynamicPDF.Generator.NET
  • ceTe.DynamicPDF.Merger.NET
  • ceTe.DynamicPDF.HtmlConverter.NET

理解範式轉移

從 動態PDF 遷移到 IronPDF 時,最顯著的變化是文件建立方式的根本改變。 動態PDF 使用基於座標的定位,將元素放置在頁面上的特定 X、Y 座標處。 IronPDF 使用 HTML/CSS 渲染,您可以使用 Web 技術進行設計。

這種範式轉移意味著將LabelTextAreaTable2元素轉換為它們的 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
SHELL

步驟 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;
$vbLabelText   $csharpLabel

步驟 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";
$vbLabelText   $csharpLabel

完整的 API 遷移參考

核心類別映射

動態PDF 類IronPDF當量筆記
DocumentChromePdfRenderer用於產生新的PDF文件
DocumentPdfDocument用於修改現有PDF
PageHTML<div>分頁符或多次渲染。
MergeDocumentPdfDocument.Merge()靜態合併方法
HtmlConverterChromePdfRenderer內置,無需額外添加

頁面元素到 HTML 的映射

動態PDF 頁面元素IronPDF/HTML 等效項
Label<p><span><div>
TextArea<div><p>使用 CSS
Image<img>標籤
Table2HTML<table>
PageNumberingLabel{page} / {total-pages}佔位符

關鍵 API 映射

動態PDFIronPDF筆記
Document + PageChromePdfRenderer基於 HTML 的生成
LabelTextAreaHTML<p><div>使用 CSS 設定樣式
Table2HTML<table>完整的 CSS 樣式
MergeDocumentPdfDocument.Merge()靜態方法
HtmlConverterChromePdfRenderer內置,無需額外添加
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");
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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");
$vbLabelText   $csharpLabel

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");
$vbLabelText   $csharpLabel

關鍵遷移說明

基於座標的 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>";
$vbLabelText   $csharpLabel

頁碼文法

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}"
$vbLabelText   $csharpLabel

頁首和頁尾

將 動態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
};
$vbLabelText   $csharpLabel

如需更多頁首/頁尾選項,請參閱頁首和頁尾文件

安全設定

// IronPDF security
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
// IronPDF security
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
$vbLabelText   $csharpLabel

有關全面的安全性選項,請參閱加密文件

遷移後檢查清單

程式碼遷移完成後,請驗證以下內容:

  • 產生PDF檔案的可視化比較
  • 檢查文字位置和版面
  • 測試表格渲染和溢出
  • 檢查所有頁面的頁首/頁腳
  • 測試表單填寫功能
  • 驗證安全性/加密
  • 性能基準測試
  • 刪除未使用的 動態PDF 授權文件
  • 更新文檔

讓您的 PDF 基礎架構面向未來

隨著 .NET 10 即將到來,C# 14 也引入了新的語言特性,選擇一個採用現代 .NET 模式的 PDF 函式庫可以確保長期的兼容性。 IronPDF 對 .NET 6/7/8/9+ 的原生支援為專案擴展到 2025 年和 2026 年提供了清晰的發展路徑,而無需管理多個產品授權或處理分散的 API。

其他資源

IronPDF 文件


從 動態PDF 遷移到 IronPDF 可以消除管理多個產品授權的複雜性,同時提供基於 Chromium 的現代渲染和完整的 CSS3 支援。 從基於座標的定位過渡到 HTML/CSS 設計通常會產生更易於維護的程式碼,並利用熟悉的 Web 技術。

柯蒂斯·週
技術撰稿人

Curtis Chau擁有卡爾頓大學電腦科學學士學位,專長於前端開發,精通Node.js、TypeScript、JavaScript和React。他熱衷於打造直覺美觀的使用者介面,喜歡使用現代框架,並擅長撰寫結構清晰、視覺效果出色的使用者手冊。

除了開發工作之外,柯蒂斯對物聯網 (IoT) 也抱有濃厚的興趣,致力於探索硬體和軟體整合的創新方法。閒暇時,他喜歡玩遊戲和製作 Discord 機器人,將他對科技的熱愛與創造力結合。