跳過到頁腳內容
遷移指南

如何用 C# 從 Api2pdf 轉移到 IronPDF

從Api2pdf遷移到 IronPDF:完整的 C# 遷移指南。

Api2pdf 提供方便的雲端 PDF 生成服務,但將敏感性文件傳送至第三方伺服器會產生安全風險、合規性挑戰,以及無限期累積的持續成本。 本綜合指南提供了從Api2pdf到IronPDF的逐步遷移路徑 -IronPDFfor .NET 是一個原生的 .NET PDF 函式庫,可以完全在您自己的基礎架構上處理文件,消除了資料傳輸的疑慮,同時將每次轉換的成本轉換為一次性投資。

為何要遷離 Api2pdf? 雖然Api2pdf提供方便的雲端式 PDF 生成功能,但仍有幾個因素促使開發團隊尋求內部部署的替代方案,以滿足其 PDF 生成需求。 ### 安全性與合規性風險 Api2pdf 以雲端服務的方式運作,您的敏感 HTML 和文件會傳送到第三方伺服器進行處理。 這對於處理受監管資料的組織造成了重大的疑慮。 |風險|Api2pdf|IronPDF| |------|---------|---------| |**資料傳輸**|所有發送至外部伺服器的內容|在您的基礎架構上進行本機處理| |**符合 GDPR 規範**|資料跨越司法管轄區|資料永不離開您的環境| |**HIPAA 合規性**|從外部傳輸的 PHI|PHI 保留在您的系統中| |**SOC 2**|第三方依賴|完全控制資料處理| |**PCI DSS**|可能暴露的卡片資料|無外部傳輸| ### 隨時間累積的成本 Api2pdf 無限期收取每次轉換約 0.005 美元的費用,而IronPDF則提供一次性永久授權。 對於產生大量 PDF 的應用程式而言,成本差異會變得相當大: |工作量|Api2pdf (年度)|IronPdf (一次性)| |--------|-----------------|-------------------| |每月 10,000 份 PDF|~$600/年|$749 (Lite)| |每月 50,000 份 PDF|~$3,000/year|$749 (Lite)| |每月 100,000 份 PDF|~$6,000/year|1,499 美元 (Plus)| 對於大多數生產應用程式而言,IronPDF 可在幾個月內收回成本。 ### 效能與可用性 Api2pdf 需要網路迴圈,每次產生 PDF 請求會增加 2-5 秒的延遲。IronPDF 在本地處理的時間為 100-500 毫秒。 此外,IronPdf 可在完全離線和空氣封閉的環境中運作 - 這對於無法依賴外部服務可用性的應用程式來說非常重要。 ##Api2pdfvs. IronPDF:主要差異 |範疇|Api2pdf|IronPDF| |--------|---------|---------| |**資料處理**|傳送至第三方雲端伺服器|在您的基礎架構上進行本地處理| |**定價**|每次轉換付費 (~$0.005/PDF)|一次性永久授權| |**交稿時間**|2-5 秒 (網路往返)|100-500 毫秒(本地處理)| |**離線**|無法提供|完全離線工作| |**安裝**|API 金鑰 + HTTP 客戶端|簡單的 [NuGet 套件](https://ironpdf.com/get-started/installation-overview/)。| |**合規性**|GDPR/HIPAA 關注 (資料離開網路)|完全符合規定的控制| ## 逐步遷移的過程 ### 步驟 1:更新 NuGet 套件 移除Api2pdf套件並安裝 IronPDF: ```bash # Remove Api2pdf dotnet remove package Api2Pdf # Install IronPDF dotnet add package IronPdf ``` 或透過套件管理員控制台: ```powershell Uninstall-Package Api2Pdf Install-Package IronPdf ``` ### 步驟 2:更新命名空間參考資料 用IronPDF取代Api2pdf命名空間: ```csharp // Remove these using Api2Pdf; using Api2Pdf.DotNet; // Add these using IronPdf; using IronPdf.Rendering; ``` ### 步驟 3:配置授權金鑰 在應用程式啟動時設定 IronPdf 授權金鑰: ```csharp // Set once at application startup IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY"; // Or configure via appsettings.json: // { "IronPdf.LicenseKey": "YOUR-IRONPDF-LICENSE-KEY" } ``` ### 步驟 4:移除 API 金鑰組態 IronPDF 可在本機執行,不需要 API 金鑰: ```csharp // Remove thisApi2pdfpattern var client = new Api2PdfClient("API_KEY"); // Just create the renderer directly var renderer = new ChromePdfRenderer(); ``` ## 完整的 API 遷移參考。 ### 核心類映射 |Api2pdf 類別|IronPdf 同等級產品| 筆記 | |---------------|-------------------|-------| |`Api2PdfClient`|<代碼>ChromePdfRendererApi2PdfResultPDF 文件pdf.SaveAs(路徑)pdf.BinaryDataPdfDocument.Merge(pdfs)pdf.SecuritySettings.OwnerPasswordRenderingOptions.WaitFor.RenderDelay(5000)Hello World"); Console.WriteLine(apiResponse.Pdf); } } ``` **IronPDF 實作:** ```csharp // NuGet: Install-Package IronPdf using System; using IronPdf; class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("

Hello World

"); pdf.SaveAs("output.pdf"); Console.WriteLine("PDF created successfully"); } } ``` IronPDF 省去了網路往返、API 金鑰管理,以及Api2pdf基於 URL 的回應模式所需的獨立下載步驟。 ### URL 轉 PDF **Api2pdf 實作:** ```csharp // NuGet: Install-Package Api2Pdf.DotNet using System; using System.Threading.Tasks; using Api2Pdf.DotNet; class Program { static async Task Main(string[] args) { var a2pClient = new Api2PdfClient("your-api-key"); var apiResponse = await a2pClient.HeadlessChrome.FromUrlAsync("https://www.example.com"); Console.WriteLine(apiResponse.Pdf); } } ``` **IronPDF 實作:** ```csharp // NuGet: Install-Package IronPdf using System; using IronPdf; class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderUrlAsPdf("https://www.example.com"); pdf.SaveAs("webpage.pdf"); Console.WriteLine("PDF created from URL successfully"); } } ``` ### 將 HTML 檔案轉換為 PDF 的選項 **Api2pdf 實作:** ```csharp // NuGet: Install-Package Api2Pdf.DotNet using System; using System.IO; using System.Threading.Tasks; using Api2Pdf.DotNet; class Program { static async Task Main(string[] args) { var a2pClient = new Api2PdfClient("your-api-key"); string html = File.ReadAllText("input.html"); var options = new HeadlessChromeOptions { Landscape = true, PrintBackground = true }; var apiResponse = await a2pClient.HeadlessChrome.FromHtmlAsync(html, options); Console.WriteLine(apiResponse.Pdf); } } ``` **IronPDF 實作:** ```csharp // NuGet: Install-Package IronPdf using System; using System.IO; using IronPdf; class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Landscape; renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print; string html = File.ReadAllText("input.html"); var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("output.pdf"); Console.WriteLine("PDF created with options successfully"); } } ``` IronPdf 可直接在渲染器物件上設定渲染選項,而非將其作為單獨的選項參數傳送給每個 API 呼叫。 ### 合併多個 PDF 文件 **Api2pdf 實作:** ```csharp using Api2Pdf.DotNet; var a2pClient = new Api2PdfClient("YOUR_API_KEY"); var pdfUrls = new List{ "https://example.com/pdf1.pdf", "https://example.com/pdf2.pdf", "https://example.com/pdf3.pdf" }; var request = new PdfMergeRequest { Urls = pdfUrls }; var response = await a2pClient.PdfSharp.MergePdfsAsync(request); if (response.Success) { // Download merged PDF from response.Pdf URL } ``` **IronPDF 實作:** ```csharp using IronPdf; // Load PDFs from files var pdf1 = PdfDocument.FromFile("document1.pdf"); var pdf2 = PdfDocument.FromFile("document2.pdf"); var pdf3 = PdfDocument.FromFile("document3.pdf"); // Merge all PDFs var merged = PdfDocument.Merge(pdf1, pdf2, pdf3); merged.SaveAs("merged.pdf"); ``` IronPdf 的靜態 `Merge` 方法可直接接受多個文件,省去了基於 URL 的工作流程。 ### 受密碼保護的 PDF 文件 **Api2pdf 實作:** ```csharp using Api2Pdf.DotNet; var a2pClient = new Api2PdfClient("YOUR_API_KEY"); // Generate PDF first var pdfResponse = await a2pClient.HeadlessChrome.FromHtmlAsync("

Confidential

"); // Then add password protection in separate call var protectedResponse = await a2pClient.PdfSharp.SetPasswordAsync( pdfResponse.Pdf, "secretpassword" ); ``` **IronPDF 實作:** ```csharp using IronPdf; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("

Confidential

"); // Set security in one step pdf.SecuritySettings.OwnerPassword = "owner123"; pdf.SecuritySettings.UserPassword = "user123"; pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint; pdf.SecuritySettings.AllowUserCopyPasteContent = false; pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit; pdf.SaveAs("protected.pdf"); ``` IronPDF 透過 `SecuritySettings` 屬性對 PDF 權限提供細粒度的控制。 ### 頁首和頁尾 **Api2pdf 實作:** ```csharp using Api2Pdf.DotNet; var a2pClient = new Api2PdfClient("YOUR_API_KEY"); var options = new HeadlessChromeOptions { HeaderHtml = "
Company Header
", FooterHtml = "
Page
" }; var response = await a2pClient.HeadlessChrome.FromHtmlAsync(html, options); ``` **IronPDF 實作:** ```csharp using IronPdf; var renderer = new ChromePdfRenderer(); // HTML headers and footers with full styling renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter { HtmlFragment = "
Company Header
", DrawDividerLine = true }; renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter { HtmlFragment = "
Page {page} of {total-pages}
", DrawDividerLine = true }; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("with-headers.pdf"); ``` IronPdf 支援占位符記號,如 `{page}` 和 `{total-pages}` 以進行動態頁碼編排。 如需更多選項,請參閱 [headers and footers 文件](https://ironpdf.com/how-to/headers-and-footers/)。 ## ASP.NET Core 整合。 Api2pdf 的 async HTTP 模式與IronPDF的直接 PDF 生成有很大的不同。 **Api2pdf模式:** ```csharp [ApiController] public class PdfController : ControllerBase { private readonly Api2PdfClient _client; public PdfController() { _client = new Api2PdfClient("YOUR_API_KEY"); } [HttpGet("generate")] public async TaskGeneratePdf() { var response = await _client.HeadlessChrome.FromHtmlAsync("

Report

"); if (!response.Success) return BadRequest(response.Error); // Redirect to download URL return Redirect(response.Pdf); } } ``` **IronPDF模式:** ```csharp [ApiController] public class PdfController : ControllerBase { [HttpGet("generate")] public IActionResult GeneratePdf() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("

Report

"); // Return PDF directly - no download step needed return File(pdf.BinaryData, "application/pdf", "report.pdf"); } [HttpGet("generate-async")] public async TaskGeneratePdfAsync() { var renderer = new ChromePdfRenderer(); var pdf = await renderer.RenderHtmlAsPdfAsync("

Report

"); return File(pdf.Stream, "application/pdf", "report.pdf"); } } ``` IronPdf 直接透過 `BinaryData` 或 `Stream` 傳回 PDF,省去了從重定向到下載的模式。 ### 依賴注入配置 ```csharp // Program.cs or Startup.cs public void ConfigureServices(IServiceCollection services) { services.AddScoped(); } // IPdfService.cs public interface IPdfService { PdfDocument GenerateFromHtml(string html); TaskGenerateFromHtmlAsync(string html); } // IronPdfService.cs public class IronPdfService : IPdfService { private readonly ChromePdfRenderer _renderer; public IronPdfService() { _renderer = new ChromePdfRenderer(); _renderer.RenderingOptions.PrintHtmlBackgrounds = true; _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; } public PdfDocument GenerateFromHtml(string html) => _renderer.RenderHtmlAsPdf(html); public TaskGenerateFromHtmlAsync(string html) => _renderer.RenderHtmlAsPdfAsync(html); } ``` ## 錯誤處理轉換 Api2pdf 使用回應物件檢查。 IronPdf 使用標準的 .NET 例外。 **Api2pdf模式:** ```csharp var response = await a2pClient.HeadlessChrome.FromHtmlAsync(html); if (!response.Success) { Console.WriteLine($"Error: {response.Error}"); return; } ``` **IronPDF模式:** ```csharp try { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("output.pdf"); } catch (IronPdf.Exceptions.IronPdfLicenseException ex) { Console.WriteLine($"License error: {ex.Message}"); } catch (IronPdf.Exceptions.IronPdfRenderingException ex) { Console.WriteLine($"Rendering error: {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}"); } ``` ## 效能比較 | 指標 |Api2pdf|IronPDF| |--------|---------|---------| |**簡單的 HTML**|2-5 秒 (網路)|100-500 毫秒(本地)| |**複雜頁面**|5-10 秒|500ms-2s| |**每批 100 份**|分鐘 (費率限制)|秒 (平行)| |**離線**|無法提供|工作完全| |**冷開始**|無|~2s (第一次渲染)| ### 效能最佳化秘訣 ```csharp // 1. Reuse renderer instance private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer(); public PdfDocument GeneratePdf(string html) { return SharedRenderer.RenderHtmlAsPdf(html); } // 2. Parallel generation var tasks = htmlDocs.Select(html => Task.Run(() => SharedRenderer.RenderHtmlAsPdf(html))); var results = await Task.WhenAll(tasks); // 3. Disable unnecessary features for speed var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.EnableJavaScript = false; // If not needed renderer.RenderingOptions.WaitFor.RenderDelay(0); // No delay ``` ## 排除常見的遷移問題 ### 問題:PDF 看起來與Api2pdf輸出不同。 配合Api2pdf的 Headless Chrome 設定: ```csharp var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print; renderer.RenderingOptions.PrintHtmlBackgrounds = true; renderer.RenderingOptions.ViewPortWidth = 1280; renderer.RenderingOptions.EnableJavaScript = true; renderer.RenderingOptions.WaitFor.RenderDelay(1000); ``` ### 問題:外部資源無法載入 設定資源載入逾時: ```csharp var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.WaitFor.AllFontsLoaded(timeout: 10000); renderer.RenderingOptions.WaitFor.NetworkIdle(timeout: 10000); // Or use base URL for relative paths var pdf = renderer.RenderHtmlAsPdf(html, baseUrl: "https://example.com/"); ``` ### 問題:PDF 檔案大小過大 生成後壓縮圖像: ```csharp renderer.RenderingOptions.ImageQuality = 80; // Or compress after generation pdf.CompressImages(quality: 75); pdf.SaveAs("compressed.pdf"); ``` ## 遷移後檢查清單 完成程式碼遷移後,請驗證下列事項: - [驗證 PDF 輸出品質是否符合預期 - [ ] 測試所有邊緣情況(大型文件、特殊字符) - [ ] 驗證效能指標(應該看到顯著的改善) - [ ] 更新 Docker 配置(如適用 - [移除Api2pdf入口網站帳號和 API 金鑰 - [ ] 更新監控(不再需要 API 延遲追蹤) - [ ] 為您的團隊記錄新的模式 - [ ] 更新 CI/CD 管道 ## Future-Proofing Your PDF Infrastructure 隨著 .NET 10 的臨近以及 C# 14 引入新的語言功能,選擇原生的 .NET PDF 函式庫可確保與不斷演進的執行時功能相容。IronPDF承諾支援最新的 .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/) --- 從Api2pdf轉移到IronPDF可將您的 PDF 生成從依賴雲端、每次轉換的成本模式轉變為本地、一次性投資。 您的敏感文件會保留在您的基礎架構上,延遲時間會從幾秒鐘降至幾毫秒鐘,而且您可以消除此重要應用程式功能對供應商的依賴。
Curtis Chau
技術作家

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

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