跳過到頁腳內容
遷移指南

從 ActivePDF 遷移到 IronPDF:(.NET指南)

從ActivePDF移轉至 IronPDF:完整的 C# 遷移指南。

ActivePDF 一直是 .NET 開發人員可靠的 PDF 操作工具包。 然而,自從被 Foxit 收購之後,許多開發團隊都面臨平台未來發展方向、License 條款以及持續創新的不確定性。 本指南提供了從ActivePDF到IronPDF的全面、循序漸進的轉換路徑--IronPDF 是一個現代化的、積極維護的 .NET PDF 函式庫,完全支援從 .NET Framework 4.6.2 到 .NET 9 以及更高的版本。

為何要遷離 ActivePDF? Foxit 收購ActivePDF帶來了幾項挑戰,影響了在 .NET 應用程式中建立 PDF 生成和處理解決方案的開發人員。 ### 不確定的產品未來 ActivePDF 在 Foxit 擁有下的過渡,對於工具包的長期發展軌跡提出了合理的疑問。 依賴ActivePDF的開發人員可能會面臨該函式庫成為傳統產品、支援減少以及創新停滯不前的潛在風險。 對於計劃將專案延伸至 2025 年和 2026 年的團隊而言,這種不確定性會造成重大的技術風險。 ### 授權複雜性 收購引入了授權的不確定性,可能會使部署變得複雜。ActivePDF的傳統機器鎖定授權模式會在現代雲端和容器化環境中產生摩擦,在這種環境中,應用程式會在基礎結構中動態擴展。 ### Legacy 架構模式 ActivePDF 的架構反映了以有狀態工具包模式為中心的舊式設計哲學。 `OpenOutputFile`/`CloseOutputFile`工作流程需要明確的檔案句柄管理,這並不符合現代 C# 的慣例,如果不小心處理,可能會引發資源管理問題。 ### 安裝與設定開銷 與當代基於 NuGet 的套件管理不同,ActivePDF 在實作工具包時通常需要手動 DLL 引用和明確的路徑配置 - 這種模式增加了上線的摩擦,並使 CI/CD 管道變得複雜。 ##ActivePDFvs. IronPDF:主要差異 在進入遷移過程之前,瞭解ActivePDF和IronPDF的基本差異有助於設定對所需代碼變更的期望。 |範疇|ActivePDF|IronPDF| |--------|-----------|---------| |**公司狀態**|已被 Foxit 收購(前途未卜)|獨立、明確的開發路線圖| |**安裝**|手冊 DLL 引用|簡單的 [NuGet 套件](https://ironpdf.com/docs/questions/installation/)。| |**API模式**|有狀態 (`OpenOutputFile`/`CloseOutputFile`)|流暢、實用的 API| |**授權模式**|機器鎖定|基於程式碼的關鍵| |**.NET支援**|傳統 .NET Framework 的重點|Framework 4.6.2 至 .NET 9+| |**錯誤處理**|整數回傳碼|基於例外的現代| |**Async 支援**|無法提供|完整的 async/await 支援| ## 遷移前的準備工作 ### 審核您的程式碼庫 在開始遷移之前,請確認您的解決方案中所有ActivePDF的使用情況。 在您的解決方案目錄中執行這些指令: ```bash grep -r "using ActivePDF" --include="*.cs" . grep -r "using APToolkitNET" --include="*.cs" . grep -r "APToolkitNET" --include="*.csproj" . ``` ### 文件破壞性變更 瞭解基本的 API 差異有助於規劃您的遷移策略: |類別|ActivePDF 行為|IronPdf 行為|遷移行動| |----------|-------------------|------------------|------------------| |物件模型|單一 `Toolkit` 物件|`ChromePdfRenderer` + `PdfDocument`|分開關注| |檔案作業|`OpenOutputFile()`/`CloseOutputFile()`。|直接 `SaveAs()`|移除開啟/關閉呼叫| |頁面製作|`NewPage()` 方法|從 HTML 自動化|移除建立頁面的呼叫| |回傳值|整數錯誤代碼|例外情況|執行 try/catch| |頁面大小單位|點數 (612x792 = 字母)|枚數或毫米|更新測量| ### 先決條件 確保您的環境符合這些要求: - .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9 - Visual Studio 2019+ 或 JetBrains Rider - NuGet 套件管理員存取權限 -IronPDF授權金鑰 (可於 [ironpdf.com](https://ironpdf.com/licensing/) 網站免費試用) ## 逐步遷移的過程 ### 步驟 1:更新 NuGet 套件 移除ActivePDF套件並安裝 IronPDF: ```bash # RemoveActivePDFpackage dotnet remove package APToolkitNET # Install IronPDF dotnet add package IronPdf ``` 或透過 Visual Studio Package Manager Console: ```powershell Uninstall-Package APToolkitNET Install-Package IronPdf ``` 對於手動引用 DLL 的專案,請移除 `.csproj` 檔案中的引用: ```xml path\to\APToolkitNET.dll ``` ### 步驟 2:配置授權金鑰 在啟動應用程式時,於任何 PDF 作業之前,加入IronPDF授權金鑰: ```csharp // Add at application startup (Program.cs or Startup.cs) IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"; // Verify license status bool isLicensed = IronPdf.License.IsLicensed; ``` ### 步驟 3:更新命名空間參考資料 在您的解決方案中執行全局搜尋與取代: |尋找|取代| |------|--------------| |`使用 ActivePDF.Toolkit;`|`使用 IronPdf;`。| |`使用 APToolkitNET;`|`使用 IronPdf;`。| |`使用 APToolkitNET.PDFObjects;`|`使用 IronPdf;`。| |`使用 APToolkitNET.Common;`。|`使用 IronPdf;`。| ## 完整的 API 遷移參考。 ### 文件建立方法 |ActivePDF 方法|IronPdf 同等級產品| 筆記 | |------------------|-------------------|-------| |`新工具包()`。|`新的 ChromePdfRenderer()`|渲染器創建 PDF| |`toolkit.OpenOutputFile(path)`。|不需要對應的語言|只需在最後呼叫 `SaveAs()`| |`toolkit.CloseOutputFile()`。|不需要對應的語言|自動清理| |`toolkit.AddHTML(html)`|`renderer.RenderHtmlAsPdf(html)`。|返回 `PdfDocument`| |`toolkit.AddURL(url)`。|`renderer.RenderUrlAsPdf(url)`。|[URL 轉換為 PDF](https://ironpdf.com/how-to/url-to-pdf/)| |`toolkit.SaveAs(path)`。|<代碼>pdf.SaveAs(路徑)toolkit.AddPDF(路徑)PdfDocument.Merge()toolkit.GetPageCount()pdf.PageCounttoolkit.GetText()pdf.ExtractAllText()pdf.SecuritySettings.OwnerPasswordtoolkit.SetPermissions(flags)pdf.SecuritySettings.AllowUserXxx

Hello World

"; if (toolkit.OpenOutputFile("output.pdf") == 0) { toolkit.AddHTML(htmlContent); toolkit.CloseOutputFile(); Console.WriteLine("PDF created successfully"); } } } ``` **IronPDF 實作:** ```csharp // NuGet: Install-Package IronPdf using IronPdf; using System; class Program { static void Main() { var renderer = new ChromePdfRenderer(); string htmlContent = "

Hello World

"; var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs("output.pdf"); Console.WriteLine("PDF created successfully"); } } ``` IronPDF 方法消除了明確的檔案句柄管理,同時提供更乾淨、可讀性更高的程式碼。 對於進階的 [HTML to PDF 應用程式](https://ironpdf.com/how-to/html-file-to-pdf/),IronPDF 的 `ChromePdfRenderer` 使用基於 Chromium 的渲染引擎來提供像素級完美的 CSS 和 JavaScript 支援。 ### URL 轉 PDF 將網頁擷取成 PDF 文件也遵循類似的現代化模式。 **ActivePDF 實作:** ```csharp using ActivePDF.Toolkit; using System; class Program { static void Main() { Toolkit toolkit = new Toolkit(); string url = "https://www.example.com"; if (toolkit.OpenOutputFile("webpage.pdf") == 0) { toolkit.AddURL(url); toolkit.CloseOutputFile(); Console.WriteLine("PDF from URL created successfully"); } } } ``` **IronPDF 實作:** ```csharp using IronPdf; using System; class Program { static void Main() { var renderer = new ChromePdfRenderer(); string url = "https://www.example.com"; var pdf = renderer.RenderUrlAsPdf(url); pdf.SaveAs("webpage.pdf"); Console.WriteLine("PDF from URL created successfully"); } } ``` ### 合併多個 PDF 文件 將多個 PDF 文件合併為單一文件,展示了IronPDF在文件操作方面的功能性方法。 **ActivePDF 實作:** ```csharp using ActivePDF.Toolkit; using System; class Program { static void Main() { Toolkit toolkit = new Toolkit(); if (toolkit.OpenOutputFile("merged.pdf") == 0) { toolkit.AddPDF("document1.pdf"); toolkit.AddPDF("document2.pdf"); toolkit.CloseOutputFile(); Console.WriteLine("PDFs merged successfully"); } } } ``` **IronPDF 實作:** ```csharp using IronPdf; using System; using System.Collections.Generic; 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"); } } ``` 如需更進階的合併情境,包括選擇性抽取頁面,請參閱 [IronPDF合併文件](https://ironpdf.com/how-to/merge-split-pdfs/)。 ### 新增頁首與頁尾 **ActivePDF 實作:** ```csharp using ActivePDF.Toolkit; public void CreatePdfWithHeaderFooter(string html, string outputPath) { Toolkit toolkit = new Toolkit(); if (toolkit.OpenOutputFile(outputPath) == 0) { toolkit.SetHeader("My Document", 12, "Arial"); toolkit.SetFooter("Page %p of %P", 10, "Arial"); toolkit.AddHTML(html); toolkit.CloseOutputFile(); } } ``` **IronPDF 實作:** ```csharp using IronPdf; public void CreatePdfWithHeaderFooter(string html, string outputPath) { var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.TextHeader = new TextHeaderFooter { CenterText = "My Document", FontSize = 12, FontFamily = "Arial" }; renderer.RenderingOptions.TextFooter = new TextHeaderFooter { CenterText = "Page {page} of {total-pages}", FontSize = 10, FontFamily = "Arial" }; using var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs(outputPath); } ``` IronPdf 支援基於文字的頁首和頁尾[HTML頁首和頁尾](https://ironpdf.com/how-to/headers-and-footers/),提供完整的設計彈性。 ### 密碼保護與安全性 **ActivePDF 實作:** ```csharp using ActivePDF.Toolkit; public void ProtectPdf(string inputPath, string outputPath, string password) { Toolkit toolkit = new Toolkit(); if (toolkit.OpenInputFile(inputPath) == 0) { toolkit.Encrypt(password); toolkit.SetUserPassword(password); toolkit.SetPermissions(4); // Print only toolkit.SaveAs(outputPath); toolkit.CloseInputFile(); } } ``` **IronPDF 實作:** ```csharp using IronPdf; public void ProtectPdf(string inputPath, string outputPath, string password) { using var pdf = PdfDocument.FromFile(inputPath); pdf.SecuritySettings.OwnerPassword = password; pdf.SecuritySettings.UserPassword = password; pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights; pdf.SecuritySettings.AllowUserCopyPasteContent = false; pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit; pdf.SaveAs(outputPath); } ``` IronPdf 的[安全設定 API](https://ironpdf.com/how-to/pdf-encryption-and-decryption/) 使用強列類型的枚數而非整數旗標來提供文件權限的精細控制。 ### 文字萃取 **ActivePDF 實作:** ```csharp using ActivePDF.Toolkit; public string ExtractText(string pdfPath) { Toolkit toolkit = new Toolkit(); string text = ""; if (toolkit.OpenInputFile(pdfPath) == 0) { int pageCount = toolkit.GetPageCount(); for (int i = 1; i <= pageCount; i++) { text += toolkit.GetTextFromPage(i) + "\n"; } toolkit.CloseInputFile(); } return text; } ``` **IronPDF 實作:** ```csharp using IronPdf; public string ExtractText(string pdfPath) { using var pdf = PdfDocument.FromFile(pdfPath); return pdf.ExtractAllText(); } ``` IronPDF 實作將多行文字擷取減少為單一方法呼叫。 ### 新增水印 **ActivePDF 實作:** ```csharp using ActivePDF.Toolkit; public void AddWatermark(string inputPath, string outputPath, string watermarkText) { Toolkit toolkit = new Toolkit(); if (toolkit.OpenInputFile(inputPath) == 0) { int pageCount = toolkit.GetPageCount(); for (int i = 1; i <= pageCount; i++) { toolkit.SetPage(i); toolkit.AddWatermark(watermarkText, 45, 0.5f); } toolkit.SaveAs(outputPath); toolkit.CloseInputFile(); } } ``` **IronPDF 實作:** ```csharp using IronPdf; public void AddWatermark(string inputPath, string outputPath, string watermarkText) { using var pdf = PdfDocument.FromFile(inputPath); pdf.ApplyWatermark( $"

{watermarkText}

", rotation: 45, opacity: 50); pdf.SaveAs(outputPath); } ``` IronPdf 的[基於 HTML 的浮水印](https://ironpdf.com/how-to/background-foreground/)可使用 CSS 設定樣式,以進行完整的設計控制,而無需逐頁反覆處理。 ## ASP.NET Core 整合。 現代網路應用程式可從 IronPdf 更為簡潔的整合模式中獲益良多。 **ActivePDF模式:** ```csharp [HttpPost] public IActionResult GeneratePdf([FromBody] ReportRequest request) { Toolkit toolkit = new Toolkit(); if (toolkit.OpenOutputFile("temp.pdf") == 0) { toolkit.AddHTML(request.Html); toolkit.CloseOutputFile(); byte[] bytes = System.IO.File.ReadAllBytes("temp.pdf"); return File(bytes, "application/pdf", "report.pdf"); } return BadRequest("PDF generation failed"); } ``` **IronPDF模式:** ```csharp [HttpPost] public IActionResult GeneratePdf([FromBody] ReportRequest request) { var renderer = new ChromePdfRenderer(); using var pdf = renderer.RenderHtmlAsPdf(request.Html); return File(pdf.BinaryData, "application/pdf", "report.pdf"); } ``` IronPDF 不需要臨時檔案,直接從記憶體回傳 PDF 的二進位資料。 ### Web 應用程式的同步支援 ActivePDF 缺乏本機 async 支援。IronPDF提供可擴充的 Web 應用程式所必備的完整 async/await 功能: ```csharp using IronPdf; public async Task GeneratePdfAsync(string html) { var renderer = new ChromePdfRenderer(); using var pdf = await renderer.RenderHtmlAsPdfAsync(html); return pdf.BinaryData; } ``` ### 依賴注入配置 對於 .NET 6+ 應用程式,請在 DI 容器中註冊IronPDF服務: ```csharp // Program.cs (.NET 6+) builder.Services.AddSingleton(); // Service wrapper public interface IPdfService { Task GeneratePdfAsync(string html); Task GeneratePdfFromUrlAsync(string url); } public class IronPdfService : IPdfService { private readonly ChromePdfRenderer _renderer; public IronPdfService() { _renderer = new ChromePdfRenderer(); _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; } public async Task GeneratePdfAsync(string html) { using var pdf = await _renderer.RenderHtmlAsPdfAsync(html); return pdf.BinaryData; } public async Task GeneratePdfFromUrlAsync(string url) { using var pdf = await _renderer.RenderUrlAsPdfAsync(url); return pdf.BinaryData; } } ``` ## 錯誤處理轉換 ActivePDF 使用需要查詢表的整數回傳代碼。 IronPdf 使用現代的異常處理方式: **ActivePDF 錯誤處理:** ```csharp Toolkit toolkit = new Toolkit(); int result = toolkit.OpenOutputFile(path); if (result != 0) { // Error - need to look up error code Console.WriteLine($"Error code: {result}"); } ``` **IronPDF 錯誤處理:** ```csharp try { var renderer = new ChromePdfRenderer(); using var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs(path); } catch (IronPdf.Exceptions.IronPdfProductException ex) { Console.WriteLine($"IronPDF Error: {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"General Error: {ex.Message}"); } ``` ## 效能優化技巧 ### 重複使用渲染器實例 建立一個新的 `ChromePdfRenderer` 有初始化開銷。 對於批次作業,請重複使用單一範例: ```csharp var renderer = new ChromePdfRenderer(); foreach (var html in htmlList) { using var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs($"output_{i}.pdf"); } ``` ### 在 Web 應用程式中使用 Async 對於 ASP.NET Core 應用程式,動態 PDF 生成可提高吞吐量: ```csharp public async Task GenerateReport() { var renderer = new ChromePdfRenderer(); using var pdf = await renderer.RenderHtmlAsPdfAsync(html); return File(pdf.BinaryData, "application/pdf"); } ``` ### 正確的資源處理方式 請務必使用 `using` 語句,以確保正確的清理: ```csharp using var pdf = renderer.RenderHtmlAsPdf(html); return pdf.BinaryData; ``` ### 影像壓縮 使用影像壓縮來減少輸出檔案大小: ```csharp using var pdf = renderer.RenderHtmlAsPdf(html); pdf.CompressImages(85); // 85% quality pdf.SaveAs("compressed.pdf"); ``` ## 排除常見的遷移問題 ### 問題:頁面大小差異 ActivePDF 使用點 (612x792 = Letter),而IronPDF則使用枚舉或毫米: ```csharp // ActivePDF: Points toolkit.SetPageSize(612, 792); // IronPDF: Use enum renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter; // Or custom in mm: renderer.RenderingOptions.SetCustomPaperSizeInMillimeters(215.9, 279.4); ``` ### 問題:缺少 CloseOutputFile 等效項目 IronPDF 使用現代範式,沒有明確的檔案句柄管理: ```csharp // ActivePDF toolkit.OpenOutputFile(path); toolkit.AddHTML(html); toolkit.CloseOutputFile(); // Required! //IronPDF- no open/close needed using var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs(path); // 'using' handles cleanup ``` ### 問題:PDF 渲染空白 如果依賴 JavaScript 的內容呈現空白,請設定呈現延遲: ```csharp var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.WaitFor.RenderDelay(2000); // Or wait for element: renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded"); ``` ### 問題:CSS/Images 無法載入。 為相對路徑解析設定基本 URL: ```csharp renderer.RenderingOptions.BaseUrl = new Uri("https://yourdomain.com/assets/"); ``` ## 遷移後檢查清單 完成程式碼遷移後,請驗證下列事項: - [ ] 執行所有現有的單元與整合測試 - [ ] 比較 PDF 輸出與先前版本的視覺效果 - [ ] 在暫存環境中測試所有 PDF 工作流程 - [ ] 驗證授權是否正常運作 (`IronPdf.License.IsLicensed`) - [ ] 與先前的實作比較效能基準 - [ ] 移除舊的ActivePDF安裝檔案和 DLL 參考檔 - [ ] 更新 CI/CD 管道的相依性 - [ ] 為您的開發團隊記錄 IronPdf 模式 ## 面向未來的 PDF 解決方案 由於 .NET 10 即將推出,而 C# 14 也將引進新的語言功能,因此選擇一個積極開發的 .NET PDF 函式庫,可確保您的應用程式與不斷演進的執行時功能相容。IronPDFfor .NET 承諾支援最新的 .NET 版本,這意味著當您的專案延伸至 2025 年和 2026 年時,您的移轉投資將獲得回報。 ## 其他資源 - [IronPDF文件](https://ironpdf.com/docs/)。 - [HTML to PDF Tutorials](https://ironpdf.com/tutorials/) - [API Reference](https://ironpdf.com/object-reference/api/) - [NuGet 套件](https://www.nuget.org/packages/IronPdf/)。 - [授權選項](https://ironpdf.com/licensing/) --- 從ActivePDF遷移到IronPDF可使您的 PDF 生成基礎結構現代化,具有更簡潔的 API、更好的 .NET 整合以及積極的長期支援。 透過改善程式碼的可維護性、async 功能,以及對您的 PDF 函式庫持續發展的信心,在轉換上的投資將帶來回報。
Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。