跳過到頁腳內容
MIGRATION GUIDES

How to Migrate from PDF Duo to IronPDF in C#

從 PDF Duo .NET 遷移到 IronPDF,會將您的 .NET PDF 工作流程從一個晦澀難懂、文件匱乏且維護狀態不明的庫,轉移到一個穩定、文檔齊全且積極維護的解決方案。 本指南提供了一個全面的、循序漸進的遷移路徑,消除了與廢棄庫相關的風險,同時獲得了 PDF Duo 無法提供的高級功能。

為什麼要從 PDF Duo 遷移到 IronPDF

PDF Duo風險問題

PDF Duo .NET 是 .NET 生態系統中一個鮮為人知且難以捉摸的函式庫。 雖然該庫可能吸引了追求簡潔性的開發者,但其晦澀難懂的特性對生產應用帶來了重大挑戰:

1.來源不明:開發者身分不明,沒有可驗證的公司支援。 沒有可見的 GitHub 程式碼庫或原始程式碼,NuGet 下載統計資料有限,授權條款也不確定。

2.缺少文件:幾乎不可能找到可靠的資訊。 目前沒有官方 API 參考文檔,社群範例也很少,更沒有官方教學或指南。 由於缺乏可靠的文檔,任何使用 PDF Duo 的嘗試都會受到阻礙。

3.已棄用或不活躍狀態:有明顯的疏於管理跡象,更新斷斷續續或根本沒有更新。 支援論壇顯示,2019 年的貼文均無人回覆。 棄置的風險非常現實,這會影響其在重大專案中的可行性。

4.功能有限:僅提供基本功能-簡單的 HTML 轉 PDF 和基本的 PDF 合併,沒有表單、安全或浮水印等進階功能。

5.未知渲染引擎:對底層工作原理一無所知。 CSS/JavaScript 支援情況未知,渲染品質無法預測,對現代 Web 功能的支援情況也不確定。

6.支援風險:設備損壞時沒有補救措施。 沒有專業支持,沒有社區幫助,完全有被遺棄的風險。

PDF Duo 與 IronPDF 對比

方面 PDF Duo .NET IronPDF
維護 未知/非活躍 積極、定期的更新
文件 稀疏/缺失 綜合的
支援 沒有任何 專業支援團隊
社群 ~0 位用戶 NuGet 下載量超過 4,100 萬次
渲染 未知引擎 現代鉻
特徵 基本的 功能齊全
穩定 未知 生產驗證
授權 不清楚 透明的

對於計劃在 2025 年和 2026 年採用 .NET 10 和 C# 14 的團隊而言,IronPDF 提供了一個穩定的基礎,並擁有積極的開發和全面的文檔,從而消除了依賴已棄用的庫所帶來的不確定性。


開始之前

先決條件

  1. .NET 環境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet 存取權限:能夠安裝 NuGet 套件
  3. IronPDF 許可證:請從ironpdf.com取得您的許可證密鑰。

NuGet 套件變更

# Remove PDF Duo .NET (if you can find the correct package name)
dotnet remove package PDFDuo.NET
dotnet remove package PDFDuo
dotnet remove package PDF-Duo

# Install IronPDF
dotnet add package IronPdf
# Remove PDF Duo .NET (if you can find the correct package name)
dotnet remove package PDFDuo.NET
dotnet remove package PDFDuo
dotnet remove package PDF-Duo

# Install IronPDF
dotnet add package IronPdf
SHELL

許可證配置

// 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

識別 PDF Duo 使用情況

# Find all PDF Duo references
grep -r "PDFDuo\|HtmlToPdfConverter\|PdfMerger" --include="*.cs" .
# Find all PDF Duo references
grep -r "PDFDuo\|HtmlToPdfConverter\|PdfMerger" --include="*.cs" .
SHELL

完整 API 參考

命名空間變更

PDF Duo .NET IronPDF
using PDFDuo; using IronPdf;
using PDFDuo.Document; using IronPdf;
using PDFDuo.Rendering; using IronPdf.Rendering;
using PDFDuo.Settings; using IronPdf;

HTML 轉 PDF 轉換映射

PDF Duo .NET IronPDF 筆記
new HtmlToPdfConverter() new ChromePdfRenderer() 主渲染器
converter.ConvertHtmlString(html, path) renderer.RenderHtmlAsPdf(html).SaveAs(path) HTML字串
converter.ConvertUrl(url, path) renderer.RenderUrlAsPdf(url).SaveAs(path) URL轉換
converter.ConvertFile(htmlPath, pdfPath) renderer.RenderHtmlFileAsPdf(htmlPath).SaveAs(pdfPath) HTML 文件

頁面配置映射

PDF Duo .NET IronPDF 筆記
settings.PageSize = PageSize.A4 RenderingOptions.PaperSize = PdfPaperSize.A4 紙張尺寸
settings.PageSize = PageSize.Letter RenderingOptions.PaperSize = PdfPaperSize.Letter 美國信紙
settings.Orientation = Landscape RenderingOptions.PaperOrientation = Landscape 方向
new Margins(top, right, bottom, left) 個體邊際屬性 見下文

邊緣映射

PDF Duo .NET IronPDF 筆記
new Margins(top, right, bottom, left) 個人屬性 無邊距對象
margins.Top RenderingOptions.MarginTop 上邊距(毫米)
margins.Right RenderingOptions.MarginRight 右邊距(毫米)
margins.Bottom RenderingOptions.MarginBottom 下邊距(毫米)
margins.Left RenderingOptions.MarginLeft 左邊距(毫米)

文檔操作映射

PDF Duo .NET IronPDF 筆記
PDFDocument.Load(path) PdfDocument.FromFile(path) 載入PDF
document.Save(path) pdf.SaveAs(path) 儲存PDF
document.ToBytes() pdf.BinaryData 取得位元組數組
new PdfMerger() PdfDocument.Merge() 靜態方法
merger.AddFile(path) PdfDocument.FromFile(path) 加載然後合併
merger.Merge(output) merged.SaveAs(output) 合併後

PDF Duo 中不提供新功能

特徵 IronPDF
頁首/頁尾 RenderingOptions.HtmlHeader , HtmlFooter
頁碼 {page}{total-pages}佔位符
水印 pdf.ApplyWatermark(html)
密碼保護 pdf.SecuritySettings
表格填寫 pdf.Form.Fields
數位簽名 pdf.SignWithFile()
文字擷取 pdf.ExtractAllText()
PDF 轉影像 pdf.RasterizeToImageFiles()

程式碼遷移範例

範例 1:HTML 轉 PDF

之前(PDF Duo):

// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
        converter.ConvertHtmlString(htmlContent, "output.pdf");
        Console.WriteLine("PDF created successfully!");
    }
}
// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
        converter.ConvertHtmlString(htmlContent, "output.pdf");
        Console.WriteLine("PDF created successfully!");
    }
}
$vbLabelText   $csharpLabel

(IronPDF 之後):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        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 htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully!");
    }
}
$vbLabelText   $csharpLabel

根本差別在於 API 模式。 PDF Duo 的HtmlToPdfConverter.ConvertHtmlString()在一次呼叫中同時接收 HTML 和輸出路徑,並同時處理轉換和儲存。 IronPDF 的ChromePdfRenderer.RenderHtmlAsPdf()先傳回一個PdfDocument對象,然後您可以使用SaveAs()儲存該物件。

這種物件導向的方法提供了顯著的優勢:您可以在儲存之前對 PDF 進行操作(添加浮水印、合併文件、添加安全措施、提取文字)——而 PDF Duo 的直接儲存到文件的方法都無法做到這一點。 有關其他渲染選項,請參閱HTML 轉 PDF 文件

範例 2:URL 轉 PDF

之前(PDF Duo):

// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        converter.ConvertUrl("https://www.example.com", "webpage.pdf");
        Console.WriteLine("Webpage converted to PDF!");
    }
}
// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        converter.ConvertUrl("https://www.example.com", "webpage.pdf");
        Console.WriteLine("Webpage converted to PDF!");
    }
}
$vbLabelText   $csharpLabel

(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("webpage.pdf");
        Console.WriteLine("Webpage converted to PDF!");
    }
}
// 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("webpage.pdf");
        Console.WriteLine("Webpage converted to PDF!");
    }
}
$vbLabelText   $csharpLabel

PDF Duo 使用相同的HtmlToPdfConverter類別進行 URL 轉換,使用ConvertUrl(url, outputPath) 。 IronPDF 使用ChromePdfRenderer專用RenderUrlAsPdf(url)方法,傳回一個PdfDocument物件。

IronPDF 的一個主要優勢在於,其基於 Chromium 的渲染引擎提供了現代 CSS3 和 JavaScript 支持,而 PDF Duo 的渲染引擎未知,導致 CSS/JavaScript 支援不確定,渲染品質也無法預測。 了解更多關於URL轉PDF的資訊

範例 3:PDF 合併

之前(PDF Duo):

// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;

class Program
{
    static void Main()
    {
        var merger = new PdfMerger();
        merger.AddFile("document1.pdf");
        merger.AddFile("document2.pdf");
        merger.Merge("merged.pdf");
        Console.WriteLine("PDFs merged successfully!");
    }
}
// NuGet: Install-Package PDFDuo.NET
using PDFDuo;
using System;

class Program
{
    static void Main()
    {
        var merger = new PdfMerger();
        merger.AddFile("document1.pdf");
        merger.AddFile("document2.pdf");
        merger.Merge("merged.pdf");
        Console.WriteLine("PDFs merged successfully!");
    }
}
$vbLabelText   $csharpLabel

(IronPDF 之後):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

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");
        Console.WriteLine("PDFs merged successfully!");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

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");
        Console.WriteLine("PDFs merged successfully!");
    }
}
$vbLabelText   $csharpLabel

這個例子展現了架構上的根本差異。 PDF Duo 使用專用的PdfMerger類,其中包含AddFile()方法,用於將檔案加入佇列,然後使用Merge()一步合併並儲存。

IronPDF 使用不同的模式:使用PdfDocument.FromFile()將每個 PDF 載入為PdfDocument ,然後使用靜態PdfDocument.Merge()方法將它們合併。 這將會傳回一個新的PdfDocument對象,您可以使用SaveAs()單獨儲存該物件。

IronPDF 方法提供了更大的靈活性——您可以在合併之前操作任何 PDF 文件,為合併結果添加浮水印,應用安全設定等等。 要合併多個文件,可以使用 LINQ:

var paths = new[] { "document1.pdf", "document2.pdf", "document3.pdf" };
var pdfs = paths.Select(PdfDocument.FromFile).ToList();
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs("merged.pdf");
var paths = new[] { "document1.pdf", "document2.pdf", "document3.pdf" };
var pdfs = paths.Select(PdfDocument.FromFile).ToList();
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs("merged.pdf");
$vbLabelText   $csharpLabel

了解更多關於合併和拆分PDF的資訊


遷移後的新功能

遷移到 IronPDF 後,您將獲得 PDF Duo 無法提供的功能:

附頁碼的頁首和頁尾

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center; font-size:10px;'>Company Report</div>",
    MaxHeight = 25
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("report.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center; font-size:10px;'>Company Report</div>",
    MaxHeight = 25
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("report.pdf");
$vbLabelText   $csharpLabel

PDF Duo 不支援頁首或頁尾-沒有類似的功能。 IronPDF 提供完整的 HTML/CSS 支持,並內建了用於動態內容(例如頁碼)的佔位符。 請參閱頁首和頁尾指南

水印

using IronPdf;
using IronPdf.Editing;

var pdf = PdfDocument.FromFile("document.pdf");

pdf.ApplyWatermark(
    "<h1 style='color:red; opacity:0.3;'>CONFIDENTIAL</h1>",
    45,
    VerticalAlignment.Middle,
    HorizontalAlignment.Center);

pdf.SaveAs("watermarked.pdf");
using IronPdf;
using IronPdf.Editing;

var pdf = PdfDocument.FromFile("document.pdf");

pdf.ApplyWatermark(
    "<h1 style='color:red; opacity:0.3;'>CONFIDENTIAL</h1>",
    45,
    VerticalAlignment.Middle,
    HorizontalAlignment.Center);

pdf.SaveAs("watermarked.pdf");
$vbLabelText   $csharpLabel

PDF Duo不支援浮水印。 IronPDF 提供基於 HTML 的浮水印,並完全支援 CSS 樣式。

密碼保護

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("secured.pdf");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("secured.pdf");
$vbLabelText   $csharpLabel

PDF Duo不支援密碼保護或安全性設定。

文字擷取

var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();
$vbLabelText   $csharpLabel

PDF Duo不支援文字擷取。


關鍵遷移說明

將邊距物件轉換為單一屬性

PDF Duo 使用單一Margins物件; IronPDF 使用各個屬性:

// PDF Duo:
new Margins(top: 20, right: 15, bottom: 20, left: 15)

// IronPDF:
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginRight = 15;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 15;
// PDF Duo:
new Margins(top: 20, right: 15, bottom: 20, left: 15)

// IronPDF:
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginRight = 15;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 15;
$vbLabelText   $csharpLabel

儲存方法命名

不同的保存方法名稱:

// PDF Duo:
document.Save("output.pdf");

// IronPDF:
pdf.SaveAs("output.pdf");
// PDF Duo:
document.Save("output.pdf");

// IronPDF:
pdf.SaveAs("output.pdf");
$vbLabelText   $csharpLabel

正在載入PDF文件

不同的載入方法名稱:

// PDF Duo:
PDFDocument.Load("document.pdf")

// IronPDF:
PdfDocument.FromFile("document.pdf")
// PDF Duo:
PDFDocument.Load("document.pdf")

// IronPDF:
PdfDocument.FromFile("document.pdf")
$vbLabelText   $csharpLabel

設定對像到屬性

PDF Duo 使用傳遞給建構函數的設定物件; IronPDF 使用以下屬性:

// PDF Duo:
var settings = new PDFSettings { PageSize = PageSize.A4 };
var converter = new HtmlToPdfConverter(settings);

// IronPDF:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
// PDF Duo:
var settings = new PDFSettings { PageSize = PageSize.A4 };
var converter = new HtmlToPdfConverter(settings);

// IronPDF:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
$vbLabelText   $csharpLabel

功能對比

特徵 PDF Duo .NET IronPDF
HTML 轉 PDF 基本的 完整的 CSS3 和 JavaScript
PDF檔案的URL 基本的 完全支援身份驗證
PDF合併 是的 是的
頁首/頁尾 完全支援 HTML
頁碼 內建佔位符
水印 基於HTML
密碼保護 全面安全選項
表格填寫 是的
數位簽名 是的
文字擷取 是的
PDF 轉影像 是的
非同步支援 未知 完全異步/等待
.NET Core/5+ 未知 全力支持

遷移清單

遷移前

  • 在程式碼庫中尋找所有 PDF Duo 引用
  • 記錄目前設定(頁面大小、頁邊距等) 列出所有已使用的 PDF 操作
  • 尋找新功能(標題、浮水印、安全)的機會
  • 取得 IronPDF 許可證密鑰

軟體包變更

  • 刪除PDFDuo.NET NuGet 套件 安裝IronPdf NuGet 套件: dotnet add package IronPdf
  • 將命名空間匯入從using PDFDuo;更新為using IronPdf;

程式碼更改

  • 在啟動時新增許可證金鑰配置
  • HtmlToPdfConverter替換為ChromePdfRenderer
  • ConvertHtmlString(html, path)替換為RenderHtmlAsPdf(html).SaveAs(path)
  • ConvertUrl(url, path)替換為RenderUrlAsPdf(url).SaveAs(path)
  • PdfMerger模式替換為PdfDocument.Merge()模式
  • Margins物件轉換為單獨的邊距屬性
  • Save()替換為SaveAs()
  • Load()替換為FromFile()

移民後

  • 執行迴歸測試,比較 PDF 輸出
  • 核實頁面尺寸和邊距是否一致
  • 使用複雜的 HTML/CSS 進行測試(IronPDF 的現代引擎應該可以更好地處理這種情況)
  • 新增功能(頁首、頁尾、浮水印、安全功能)
  • 更新文檔

Curtis Chau
技術撰稿人

Curtis Chau 擁有電腦科學學士學位(卡爾頓大學),專長於前端開發,精通 Node.js、TypeScript、JavaScript 和 React。Curtis 對製作直覺且美觀的使用者介面充滿熱情,他喜歡使用現代化的架構,並製作結構良好且視覺上吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 也有濃厚的興趣,他喜歡探索整合硬體與軟體的創新方式。在空閒時間,他喜歡玩遊戲和建立 Discord bots,將他對技術的熱愛與創意結合。