如何使用 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 .NET | IronPDF |
|---|---|---|
| 維護 | 未知/非活躍 | 積極、定期的更新 |
| 文件 | 稀疏/缺失 | 綜合的 |
| 支援 | 沒有任何 | 專業支援團隊 |
| 社群 | ~0 位用戶 | NuGet 下載量超過 4,100 萬次 |
| 渲染 | 未知引擎 | 現代鉻 |
| 特徵 | 基本的 | 功能齊全 |
| 穩定 | 未知 | 生產驗證 |
| 授權 | 不清楚 | 透明的 |
對於計劃在 2025 年和 2026 年採用 .NET 10 和 C# 14 的團隊而言,IronPDF 提供了一個穩定的基礎,並擁有積極的開發和全面的文檔,從而消除了依賴已棄用的庫所帶來的不確定性。
開始之前
先決條件
- .NET 環境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 存取權限:能夠安裝 NuGet 套件
- 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許可證配置
// 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";識別 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" .完整 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!");
}
}(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!");
}
}根本差別在於 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!");
}
}(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!");
}
}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!");
}
}(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!");
}
}這個例子展現了架構上的根本差異。 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");了解更多關於合併和拆分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");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");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");PDF Duo不支援密碼保護或安全性設定。
文字擷取
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();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;儲存方法命名
不同的保存方法名稱:
// PDF Duo:
document.Save("output.pdf");
// IronPDF:
pdf.SaveAs("output.pdf");// PDF Duo:
document.Save("output.pdf");
// IronPDF:
pdf.SaveAs("output.pdf");正在載入PDF文件
不同的載入方法名稱:
// PDF Duo:
PDFDocument.Load("document.pdf")
// IronPDF:
PdfDocument.FromFile("document.pdf")// PDF Duo:
PDFDocument.Load("document.pdf")
// IronPDF:
PdfDocument.FromFile("document.pdf")設定對像到屬性
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;功能對比
| 特徵 | PDF Duo .NET | IronPDF |
|---|---|---|
| HTML 轉 PDF | 基本的 | 完整的 CSS3 和 JavaScript |
| PDF檔案的URL | 基本的 | 完全支援身份驗證 |
| PDF合併 | 是的 | 是的 |
| 頁首/頁尾 | 不 | 完全支援 HTML |
| 頁碼 | 不 | 內建佔位符 |
| 水印 | 不 | 基於HTML |
| 密碼保護 | 不 | 全面安全選項 |
| 表格填寫 | 不 | 是的 |
| 數位簽名 | 不 | 是的 |
| 文字擷取 | 不 | 是的 |
| PDF 轉影像 | 不 | 是的 |
| 非同步支援 | 未知 | 完全異步/等待 |
| .NET Core/5+ | 未知 | 全力支持 |
遷移清單
遷移前
- 在程式碼庫中尋找所有 PDF Duo 引用
- 記錄目前設定(頁面大小、頁邊距等) 列出所有已使用的 PDF 操作
- 尋找新功能(標題、浮水印、安全)的機會
- 取得 IronPDF 許可證密鑰
軟體包變更
- 刪除
PDFDuo.NETNuGet 套件 安裝IronPdfNuGet 套件: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 的現代引擎應該可以更好地處理這種情況)
- 新增功能(頁首、頁尾、浮水印、安全功能)
- 更新文檔






