MIGRATION GUIDES How to Migrate from Api2pdf to IronPDF in C# Curtis Chau 發表日期:2026年1月11日 下載 IronPDF NuGet 下載 DLL 下載 Windows 安裝程式 開始免費試用 法學碩士副本 法學碩士副本 將頁面複製為 Markdown 格式,用於 LLMs 在 ChatGPT 中打開 請向 ChatGPT 諮詢此頁面 在雙子座打開 請向 Gemini 詢問此頁面 在 Grok 中打開 向 Grok 詢問此頁面 打開困惑 向 Perplexity 詢問有關此頁面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 複製連結 電子郵件文章 Api2pdf 提供基於雲端的 PDF 生成服務,但將敏感文件傳送到外部伺服器可能會導致安全風險、合規性問題以及持續的成本,這些成本會隨著時間的推移而累積。本指南詳細介紹了從 API2PDF 遷移到 IronPDF 的路徑。 IronPDF 是一個原生 .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 美元(小) 每月 50,000 個 PDF 文件 每年約3000美元 749 美元(小) 每月產生 10 萬份 PDF 文件 每年約 6,000 美元 1,499 美元(含稅) 對於大多數生產應用而言,IronPDF 只需幾個月就能收回成本。 效能和可用性 Api2pdf 需要網路往返,這會為每次 PDF 產生請求增加 2-5 秒的延遲。 IronPDF 在本地處理只需 100-500 毫秒。 此外,IronPDF 完全可以離線運行,並且可以在物理隔離的環境中運行——這對於無法依賴外部服務可用性的應用程式來說至關重要。 API2PDF 與 IronPDF:主要區別 方面 API2PDF IronPDF 資料處理 發送到第三方雲端伺服器 在您的本機基礎架構上處理 定價 按轉換付費(約 0.005 美元/PDF) 一次永久許可 延遲 2-5秒(網路往返) 100-500毫秒(本地處理) 離線 無法使用 完全離線可用 安裝 API金鑰 + HTTP客戶端 簡單的NuGet 包 遵守 GDPR/HIPAA 問題(資料離開網路) 全面合規控制 逐步遷移過程 步驟 1:更新 NuGet 套件 移除 API2PDF 軟體包並安裝 IronPDF: # Remove Api2pdf dotnet remove package Api2Pdf # Install IronPDF dotnet add package IronPdf # Remove Api2pdf dotnet remove package Api2Pdf # Install IronPDF dotnet add package IronPdf SHELL 或透過軟體包管理器控制台: Uninstall-Package Api2Pdf Install-Package IronPdf 步驟 2:更新命名空間引用 將 API2PDF 命名空間替換為 IronPDF: // Remove these using Api2Pdf; using Api2Pdf.DotNet; // Add these using IronPdf; using IronPdf.Rendering; // Remove these using Api2Pdf; using Api2Pdf.DotNet; // Add these using IronPdf; using IronPdf.Rendering; $vbLabelText $csharpLabel 步驟 3:設定許可證密鑰 在應用程式啟動時設定 IronPDF 許可證密鑰: // Set once at application startup IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY"; // Or configure via appsettings.json: // { "IronPdf.LicenseKey": "YOUR-IRONPDF-LICENSE-KEY" } // Set once at application startup IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY"; // Or configure via appsettings.json: // { "IronPdf.LicenseKey": "YOUR-IRONPDF-LICENSE-KEY" } $vbLabelText $csharpLabel 步驟 4:移除 API 金鑰配置 IronPDF 可在本機上運行,無需 API 金鑰: // Remove this API2PDF pattern var client = new Api2PdfClient("API_KEY"); // Just create the renderer directly var renderer = new ChromePdfRenderer(); // Remove this API2PDF pattern var client = new Api2PdfClient("API_KEY"); // Just create the renderer directly var renderer = new ChromePdfRenderer(); $vbLabelText $csharpLabel 完整的 API 遷移參考 核心類別映射 API2PDF 類 IronPDF當量 筆記 Api2PdfClient ChromePdfRenderer 主渲染類 Api2PdfResult PdfDocument 代表 PDF HeadlessChromeOptions ChromePdfRenderOptions 渲染配置 方法映射 API2PDF 方法 IronPDF 方法 筆記 client.HeadlessChrome.FromHtmlAsync(html) renderer.RenderHtmlAsPdf(html) HTML 轉 PDF client.HeadlessChrome.FromUrlAsync(url) renderer.RenderUrlAsPdf(url) PDF檔案的URL response.Pdf (URL) pdf.SaveAs(path) 儲存到文件 response.Pdf (下載) pdf.BinaryData 取得為位元組數組 client.PdfSharp.MergePdfsAsync(urls) PdfDocument.Merge(pdfs) 合併PDF client.PdfSharp.SetPasswordAsync(url, pwd) pdf.SecuritySettings.OwnerPassword 密碼保護 渲染選項映射 API2PDF選項 IronPDF選項 筆記 Landscape = true RenderingOptions.PaperOrientation = Landscape 頁面方向 PageSize = "A4" RenderingOptions.PaperSize = PdfPaperSize.A4 紙張尺寸 PrintBackground = true RenderingOptions.PrintHtmlBackgrounds = true 背景顏色 MarginTop等。 RenderingOptions.MarginTop等。 邊距(毫米) Delay = 5000 RenderingOptions.WaitFor.RenderDelay(5000) 渲染前請稍等 程式碼遷移範例 HTML 轉 PDF 最常見的 API2PDF 操作反映了根本性的轉變——從雲端 API 呼叫到本地處理。 API2PDF實作: // 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.FromHtmlAsync("<h1>Hello World</h1>"); Console.WriteLine(apiResponse.Pdf); } } // 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.FromHtmlAsync("<h1>Hello World</h1>"); Console.WriteLine(apiResponse.Pdf); } } $vbLabelText $csharpLabel IronPDF實現: // NuGet: Install-Package IronPdf using System; using IronPdf; class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>"); pdf.SaveAs("output.pdf"); Console.WriteLine("PDF created successfully"); } } // NuGet: Install-Package IronPdf using System; using IronPdf; class Program { static void Main(string[] args) { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>"); pdf.SaveAs("output.pdf"); Console.WriteLine("PDF created successfully"); } } $vbLabelText $csharpLabel IronPDF 消除了 API2PDF 基於 URL 的回應模式所需的網路往返、API 金鑰管理以及單獨的下載步驟。 URL 轉 PDF API2PDF實作: // 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); } } // 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); } } $vbLabelText $csharpLabel IronPDF實現: // 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"); } } // 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"); } } $vbLabelText $csharpLabel HTML 檔案轉 PDF(含選項) API2PDF實作: // 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); } } // 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); } } $vbLabelText $csharpLabel IronPDF實現: // 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"); } } // 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"); } } $vbLabelText $csharpLabel IronPDF 直接在渲染器物件上配置渲染選項,而不是將它們作為單獨的選項參數傳遞給每個 API 呼叫。 合併多個PDF文件 API2PDF實作: using Api2Pdf.DotNet; var a2pClient = new Api2PdfClient("YOUR_API_KEY"); var pdfUrls = new List<string> { "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 } using Api2Pdf.DotNet; var a2pClient = new Api2PdfClient("YOUR_API_KEY"); var pdfUrls = new List<string> { "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 } $vbLabelText $csharpLabel IronPDF實現: 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"); 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"); $vbLabelText $csharpLabel IronPDF 的靜態Merge方法直接接受多個文檔,而無需基於 URL 的工作流程。 受密碼保護的PDF文件 API2PDF實作: using Api2Pdf.DotNet; var a2pClient = new Api2PdfClient("YOUR_API_KEY"); // Generate PDF first var pdfResponse = await a2pClient.HeadlessChrome.FromHtmlAsync("<h1>Confidential</h1>"); // Then add password protection in separate call var protectedResponse = await a2pClient.PdfSharp.SetPasswordAsync( pdfResponse.Pdf, "secretpassword" ); using Api2Pdf.DotNet; var a2pClient = new Api2PdfClient("YOUR_API_KEY"); // Generate PDF first var pdfResponse = await a2pClient.HeadlessChrome.FromHtmlAsync("<h1>Confidential</h1>"); // Then add password protection in separate call var protectedResponse = await a2pClient.PdfSharp.SetPasswordAsync( pdfResponse.Pdf, "secretpassword" ); $vbLabelText $csharpLabel IronPDF實現: using IronPdf; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>"); // 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"); using IronPdf; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>"); // 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"); $vbLabelText $csharpLabel IronPDF 透過SecuritySettings屬性提供 PDF 權限的精細控制。 頁首和頁尾 API2PDF實作: using Api2Pdf.DotNet; var a2pClient = new Api2PdfClient("YOUR_API_KEY"); var options = new HeadlessChromeOptions { HeaderHtml = "<div style='font-size:10px'>Company Header</div>", FooterHtml = "<div style='font-size:10px'>Page <span class='pageNumber'></span></div>" }; var response = await a2pClient.HeadlessChrome.FromHtmlAsync(html, options); using Api2Pdf.DotNet; var a2pClient = new Api2PdfClient("YOUR_API_KEY"); var options = new HeadlessChromeOptions { HeaderHtml = "<div style='font-size:10px'>Company Header</div>", FooterHtml = "<div style='font-size:10px'>Page <span class='pageNumber'></span></div>" }; var response = await a2pClient.HeadlessChrome.FromHtmlAsync(html, options); $vbLabelText $csharpLabel IronPDF實現: using IronPdf; var renderer = new ChromePdfRenderer(); // HTML headers and footers with full styling renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter { HtmlFragment = "<div style='font-size:10px; text-align:center;'>Company Header</div>", DrawDividerLine = true }; renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter { HtmlFragment = "<div style='font-size:10px; text-align:center;'>Page {page} of {total-pages}</div>", DrawDividerLine = true }; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("with-headers.pdf"); using IronPdf; var renderer = new ChromePdfRenderer(); // HTML headers and footers with full styling renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter { HtmlFragment = "<div style='font-size:10px; text-align:center;'>Company Header</div>", DrawDividerLine = true }; renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter { HtmlFragment = "<div style='font-size:10px; text-align:center;'>Page {page} of {total-pages}</div>", DrawDividerLine = true }; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("with-headers.pdf"); $vbLabelText $csharpLabel IronPDF 支援使用{page}和{total-pages}等佔位符號標記進行動態頁碼編號。 更多選項請參閱頁首和頁尾文件。 ASP.NET Core 集成 Api2pdf 的非同步 HTTP 模式與 IronPDF 的直接 PDF 產生方式有很大不同。 API2PDF模式: [ApiController] public class PdfController : ControllerBase { private readonly Api2PdfClient _client; public PdfController() { _client = new Api2PdfClient("YOUR_API_KEY"); } [HttpGet("generate")] public async Task<IActionResult> GeneratePdf() { var response = await _client.HeadlessChrome.FromHtmlAsync("<h1>Report</h1>"); if (!response.Success) return BadRequest(response.Error); // Redirect to download URL return Redirect(response.Pdf); } } [ApiController] public class PdfController : ControllerBase { private readonly Api2PdfClient _client; public PdfController() { _client = new Api2PdfClient("YOUR_API_KEY"); } [HttpGet("generate")] public async Task<IActionResult> GeneratePdf() { var response = await _client.HeadlessChrome.FromHtmlAsync("<h1>Report</h1>"); if (!response.Success) return BadRequest(response.Error); // Redirect to download URL return Redirect(response.Pdf); } } $vbLabelText $csharpLabel IronPDF 圖案: [ApiController] public class PdfController : ControllerBase { [HttpGet("generate")] public IActionResult GeneratePdf() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>"); // Return PDF directly - no download step needed return File(pdf.BinaryData, "application/pdf", "report.pdf"); } [HttpGet("generate-async")] public async Task<IActionResult> GeneratePdfAsync() { var renderer = new ChromePdfRenderer(); var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>"); return File(pdf.Stream, "application/pdf", "report.pdf"); } } [ApiController] public class PdfController : ControllerBase { [HttpGet("generate")] public IActionResult GeneratePdf() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>"); // Return PDF directly - no download step needed return File(pdf.BinaryData, "application/pdf", "report.pdf"); } [HttpGet("generate-async")] public async Task<IActionResult> GeneratePdfAsync() { var renderer = new ChromePdfRenderer(); var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>"); return File(pdf.Stream, "application/pdf", "report.pdf"); } } $vbLabelText $csharpLabel IronPDF 直接透過BinaryData或Stream返回 PDF,消除了重定向到下載的模式。 依賴注入配置 // Program.cs or Startup.cs public void ConfigureServices(IServiceCollection services) { services.AddScoped<IPdfService, IronPdfService>(); } // IPdfService.cs public interface IPdfService { PdfDocument GenerateFromHtml(string html); Task<PdfDocument> GenerateFromHtmlAsync(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 Task<PdfDocument> GenerateFromHtmlAsync(string html) => _renderer.RenderHtmlAsPdfAsync(html); } // Program.cs or Startup.cs public void ConfigureServices(IServiceCollection services) { services.AddScoped<IPdfService, IronPdfService>(); } // IPdfService.cs public interface IPdfService { PdfDocument GenerateFromHtml(string html); Task<PdfDocument> GenerateFromHtmlAsync(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 Task<PdfDocument> GenerateFromHtmlAsync(string html) => _renderer.RenderHtmlAsPdfAsync(html); } $vbLabelText $csharpLabel 錯誤處理遷移 Api2pdf 使用回應對象檢查。 IronPDF 使用標準的 .NET 異常。 API2PDF模式: var response = await a2pClient.HeadlessChrome.FromHtmlAsync(html); if (!response.Success) { Console.WriteLine($"Error: {response.Error}"); return; } var response = await a2pClient.HeadlessChrome.FromHtmlAsync(html); if (!response.Success) { Console.WriteLine($"Error: {response.Error}"); return; } $vbLabelText $csharpLabel IronPDF 圖案: 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}"); } 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}"); } $vbLabelText $csharpLabel 效能比較 指標 API2PDF IronPDF 簡單的 HTML 2-5秒(網路) 100-500毫秒(本地時間) 複雜頁面 5-10秒 500毫秒-2秒 一批100人 分鐘(速率限制) 秒(並行) 離線 無法使用 功能完全正常 冷啟動 沒有任何 約2秒(首次渲染) 效能優化技巧 // 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 // 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 $vbLabelText $csharpLabel 解決常見遷移問題 問題:PDF 檔案與 API2PDF 輸出的檔案看起來不一樣 匹配 API2PDF 的無頭 Chrome 設定: 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); 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); $vbLabelText $csharpLabel 問題:外部資源未加載 配置資源載入逾時: 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/"); 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/"); $vbLabelText $csharpLabel 問題:PDF 文件過大 生成影像後進行壓縮: renderer.RenderingOptions.ImageQuality = 80; // Or compress after generation pdf.CompressImages(quality: 75); pdf.SaveAs("compressed.pdf"); renderer.RenderingOptions.ImageQuality = 80; // Or compress after generation pdf.CompressImages(quality: 75); pdf.SaveAs("compressed.pdf"); $vbLabelText $csharpLabel 遷移後檢查清單 程式碼遷移完成後,請驗證以下內容: 驗證 PDF 輸出品質是否符合預期 測試所有極端情況(大型文件、特殊字元) 驗證績效指標(應有顯著改善) 如果需要,更新 Docker 配置 刪除 API2PDF 入口網站帳戶和 API 金鑰 更新監控(不再需要追蹤 API 延遲) 為你的團隊記錄新模式 更新 CI/CD 管線 讓您的 PDF 基礎架構面向未來 隨著 .NET 10 的臨近和 C# 14 引入新的語言特性,選擇原生 .NET PDF 庫可以確保與不斷發展的運行時功能相容。 IronPDF 致力於支援最新的 .NET 版本,這意味著隨著專案擴展到 2025 年和 2026 年,您的遷移投資將獲得回報,而無需不斷累積每次轉換成本。 其他資源 IronPDF 文件 HTML 轉 PDF 教學課程 API 參考 NuGet 套件 -授權選項 從 API2PDF 遷移到 IronPDF 會將您的 PDF 產生方式從依賴雲端的按轉換付費模式轉變為本地的一次性投資。 您的敏感文件保留在您自己的基礎設施上,延遲從幾秒鐘降至幾毫秒,您無需依賴供應商即可獲得此關鍵應用程式功能。 Curtis Chau 立即與工程團隊聊天 技術撰稿人 Curtis Chau 擁有電腦科學學士學位(卡爾頓大學),專長於前端開發,精通 Node.js、TypeScript、JavaScript 和 React。Curtis 對製作直覺且美觀的使用者介面充滿熱情,他喜歡使用現代化的架構,並製作結構良好且視覺上吸引人的手冊。除了開發之外,Curtis 對物聯網 (IoT) 也有濃厚的興趣,他喜歡探索整合硬體與軟體的創新方式。在空閒時間,他喜歡玩遊戲和建立 Discord bots,將他對技術的熱愛與創意結合。 相關文章 發表日期 2026年2月1日 How to Migrate from ZetPDF to IronPDF in C# Master the migration from ZetPDF to IronPDF with this complete C# guide. Switch from a coordinate-based library to a modern HTML-to-PDF solution. Includes code examples for HTML conversion, merging PDFs, and removing PDFSharp dependencies. 閱讀更多 發表日期 2026年2月1日 How to Migrate from Scryber.Core to IronPDF in C# Master the migration from Scryber.Core to IronPDF with this complete C# guide. Switch from custom XML/HTML parsing to a modern Chromium renderer. Includes code examples for HTML conversion, URL rendering, and replacing proprietary bindings. 閱讀更多 發表日期 2026年2月1日 How to Migrate from XFINIUM.PDF to IronPDF in C# Master the migration from XFINIUM.PDF to IronPDF with this complete C# guide. Switch from manual coordinate-based positioning to declarative HTML/CSS rendering. Includes code examples for replacing graphics primitives and automatic layout. 閱讀更多 How to Migrate from Apryse PDF to IronPDF in C#How to Migrate from Apache PDFBox t...
發表日期 2026年2月1日 How to Migrate from ZetPDF to IronPDF in C# Master the migration from ZetPDF to IronPDF with this complete C# guide. Switch from a coordinate-based library to a modern HTML-to-PDF solution. Includes code examples for HTML conversion, merging PDFs, and removing PDFSharp dependencies. 閱讀更多
發表日期 2026年2月1日 How to Migrate from Scryber.Core to IronPDF in C# Master the migration from Scryber.Core to IronPDF with this complete C# guide. Switch from custom XML/HTML parsing to a modern Chromium renderer. Includes code examples for HTML conversion, URL rendering, and replacing proprietary bindings. 閱讀更多
發表日期 2026年2月1日 How to Migrate from XFINIUM.PDF to IronPDF in C# Master the migration from XFINIUM.PDF to IronPDF with this complete C# guide. Switch from manual coordinate-based positioning to declarative HTML/CSS rendering. Includes code examples for replacing graphics primitives and automatic layout. 閱讀更多