跳至頁尾內容
移民指南

如何使用 C# 將 PDF Duo 遷移到 IronPDF

從 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 .NETIronPDF
維護未知/非活躍積極、定期的更新
文件稀疏/缺失綜合的
支援沒有任何專業支援團隊
社群~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 .NETIronPDF
using PDFDuo;using IronPdf;
using PDFDuo.Document;using IronPdf;
using PDFDuo.Rendering;using IronPdf.Rendering;
using PDFDuo.Settings;using IronPdf;

HTML 轉 PDF 轉換映射

PDF Duo .NETIronPDF筆記
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 .NETIronPDF筆記
settings.PageSize = PageSize.A4RenderingOptions.PaperSize = PdfPaperSize.A4紙張尺寸
settings.PageSize = PageSize.LetterRenderingOptions.PaperSize = PdfPaperSize.Letter美國信紙
settings.Orientation = LandscapeRenderingOptions.PaperOrientation = Landscape方向
new Margins(top, right, bottom, left)個體邊際屬性見下文

邊緣映射

PDF Duo .NETIronPDF筆記
new Margins(top, right, bottom, left)個人屬性無邊距對象
margins.TopRenderingOptions.MarginTop上邊距(毫米)
margins.RightRenderingOptions.MarginRight右邊距(毫米)
margins.BottomRenderingOptions.MarginBottom下邊距(毫米)
margins.LeftRenderingOptions.MarginLeft左邊距(毫米)

文檔操作映射

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

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