跳過到頁腳內容
遷移指南

如何在 C# 中從 Apryse PDF 遷移到 IronPDF

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

Apryse PDF(前身為 PDFTron)是優質的企業級 PDF SDK,以其全面的文件處理功能而聞名。 然而,其高昂的定價模式(每位開發人員每年超過 1,500 美元)、複雜的整合需求以及 C++ 傳統,對於尋求直接 PDF 功能的開發團隊造成障礙。 本綜合指南提供了從Apryse PDF到IronPDF的逐步遷移路徑 -IronPDFfor .NET 是一個原生的 .NET PDF 函式庫,具有現代的 C# 慣例、更簡單的整合以及一次性永久授權。

為何要遷離 Apryse PDF? 雖然Apryse PDF提供強大的功能,但仍有幾個因素驅使開發團隊尋求替代方案來滿足他們的 PDF 生成需求。 ### 尊榮定價及訂閱模式 Apryse PDF 以企業客戶為目標,其定價對於中小型專案而言可能過高: |範疇|Apryse PDF (PDFTron)|IronPDF| |--------|-----------------|---------| | **起價** |1,500+美元/開發人員/年(已報告)|一次性 749 美元 (Lite)| |**授權模式**|年度訂閱|永久授權| |**閱讀器授權**|獨立、額外費用|不適用(使用標準檢視器)| |**伺服器授權條款**|需要企業定價|包含在授權層級中| |**三年總成本**|每位開發人員 4,500 美元以上|一次性 749 美元| ### 整合的複雜性 Apryse PDF 的 C++ 傳統帶來了影響開發速度的複雜性: |特點|Apryse PDF|IronPDF| |---------|--------|---------| |**設定**|模組路徑、外部二進位檔|單一 NuGet 套件| |**初始化**|`PDFNet.Initialize()` 具有許可證|簡單的屬性指派| |**HTML 渲染**|需要外部 html2pdf 模組|內建 Chromium 引擎| |**API 風格**|C++ 傳承、複雜|現代 C# 慣例| |**依賴性**|多個 DLL、特定平台|自成一格的套件| ### 何時考慮遷移 **如果:**迁移到 IronPDF - 您主要需要將 HTML/URL 轉換為 PDF - 您想要更簡單的 API 與更少的模板 - 對於您的使用個案而言,高價並不合理 - 您不需要 PDFViewCtrl 檢視器控制項 - 您偏好一次性授權而非訂閱 **如果:**繼續使用 Apryse PDF - 您需要他們的原生檢視器控制項 (PDFViewCtrl) - 您廣泛使用 XOD 或專屬格式 - 您需要特定的企業功能(進階編輯等) - 您的組織已經擁有企業授權 ## 遷移前的準備工作 ### 先決條件 確保您的環境符合這些要求: - .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9 - Visual Studio 2019+ 或具有 C# 擴充功能的 VS Code - NuGet 套件管理員存取權限 -IronPDF授權金鑰 (可於 [ironpdf.com](https://ironpdf.com/licensing/) 網站免費試用) ### 審核Apryse PDF使用情況 在您的解決方案目錄中執行這些指令,以辨識所有 Apryse 參考資料: ```bash # Find all pdftron using statements grep -r "using pdftron" --include="*.cs" . # Find PDFNet initialization grep -r "PDFNet.Initialize\|PDFNet.SetResourcesPath" --include="*.cs" . # Find PDFDoc usage grep -r "new PDFDoc\|PDFDoc\." --include="*.cs" . # Find HTML2PDF usage grep -r "HTML2PDF\|InsertFromURL\|InsertFromHtmlString" --include="*.cs" . # Find ElementReader/Writer usage grep -r "ElementReader\|ElementWriter\|ElementBuilder" --include="*.cs" . ``` ### 可預期的重大變更 |Apryse PDF 模式|變更要求| |----------------|-----------------| |<代碼>PDFNet.Initialize()SDFDoc.SaveOptionsPDFViewCtrlPDFDocPDF 文件HTML2PDFChromePdfRenderer文字萃取器PdfDocument.ExtractAllText()PdfDocument.ApplyWatermark()PDFDrawPdfDocument.ToBitmap()SecurityHandlerPdfDocument.FromBinaryData(bytes)pdf.SaveAs(路徑)pdf.BinaryDatadoc.Close()pdf.Dispose()doc.GetPageCount()pdf.PageCountPdfDocument.Merge(pdfs)RenderingOptions.PaperOrientation

Hello World

Content here

"; using (PDFDoc doc = new PDFDoc()) { HTML2PDF converter = new HTML2PDF(); converter.SetModulePath("path/to/html2pdf"); converter.InsertFromHtmlString(html); HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings(); settings.SetPrintBackground(true); settings.SetLoadImages(true); if (converter.Convert(doc)) { doc.Save("output.pdf", SDFDoc.SaveOptions.e_linearized); Console.WriteLine("PDF created successfully"); } else { Console.WriteLine($"Conversion failed: {converter.GetLog()}"); } } PDFNet.Terminate(); } } ``` **IronPDF 實作:** ```csharp // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); string html = "

Hello World

"; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("output.pdf"); } } ``` IronPdf 消除了初始化、模組路徑和清理代碼,將 35 行以上的代碼減少到 5 行。 ### URL 轉 PDF **Apryse PDF 實作:** ```csharp using pdftron; using pdftron.PDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc doc = new PDFDoc()) { HTML2PDF converter = new HTML2PDF(); converter.SetModulePath("path/to/html2pdf"); HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings(); settings.SetLoadImages(true); settings.SetAllowJavaScript(true); settings.SetPrintBackground(true); converter.InsertFromURL("https://example.com", settings); if (converter.Convert(doc)) { doc.Save("webpage.pdf", SDFDoc.SaveOptions.e_linearized); } } PDFNet.Terminate(); ``` **IronPDF 實作:** ```csharp // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); string url = "https://www.example.com"; var pdf = renderer.RenderUrlAsPdf(url); pdf.SaveAs("webpage.pdf"); } } ``` ### 合併多個 PDF 文件 **Apryse PDF 實作:** ```csharp using pdftron; using pdftron.PDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc mainDoc = new PDFDoc()) { string[] files = { "doc1.pdf", "doc2.pdf", "doc3.pdf" }; foreach (string file in files) { using (PDFDoc doc = new PDFDoc(file)) { mainDoc.AppendPages(doc, 1, doc.GetPageCount()); } } mainDoc.Save("merged.pdf", SDFDoc.SaveOptions.e_linearized); } PDFNet.Terminate(); ``` **IronPDF 實作:** ```csharp // NuGet: Install-Package IronPdf using IronPdf; 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(new List { pdf1, pdf2 }); merged.SaveAs("merged.pdf"); } } ``` IronPdf 的靜態 `Merge` 方法可直接接受多個文件,省去了頁面迭代模式。 ### 文字萃取 **Apryse PDF 實作:** ```csharp using pdftron; using pdftron.PDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc doc = new PDFDoc("document.pdf")) { TextExtractor extractor = new TextExtractor(); for (int i = 1; i <= doc.GetPageCount(); i++) { Page page = doc.GetPage(i); extractor.Begin(page); string pageText = extractor.GetAsText(); Console.WriteLine($"Page {i}:"); Console.WriteLine(pageText); } } PDFNet.Terminate(); ``` **IronPDF 實作:** ```csharp using IronPdf; var pdf = PdfDocument.FromFile("document.pdf"); // Extract all text at once string allText = pdf.ExtractAllText(); Console.WriteLine(allText); // Extract from specific page string page1Text = pdf.ExtractTextFromPage(0); // 0-indexed Console.WriteLine($"Page 1: {page1Text}"); ``` ### 新增水印 **Apryse PDF 實作:** ```csharp using pdftron; using pdftron.PDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc doc = new PDFDoc("document.pdf")) { Stamper stamper = new Stamper(Stamper.SizeType.e_relative_scale, 0.5, 0.5); stamper.SetAlignment(Stamper.HorizontalAlignment.e_horizontal_center, Stamper.VerticalAlignment.e_vertical_center); stamper.SetOpacity(0.3); stamper.SetRotation(45); stamper.SetFontColor(new ColorPt(1, 0, 0)); stamper.SetTextAlignment(Stamper.TextAlignment.e_align_center); stamper.StampText(doc, "CONFIDENTIAL", new PageSet(1, doc.GetPageCount())); doc.Save("watermarked.pdf", SDFDoc.SaveOptions.e_linearized); } PDFNet.Terminate(); ``` **IronPDF 實作:** ```csharp using IronPdf; using IronPdf.Editing; var pdf = PdfDocument.FromFile("document.pdf"); // HTML-based watermark with full styling control string watermarkHtml = @"
CONFIDENTIAL
"; pdf.ApplyWatermark(watermarkHtml, rotation: 45, verticalAlignment: VerticalAlignment.Middle, horizontalAlignment: HorizontalAlignment.Center); pdf.SaveAs("watermarked.pdf"); ``` IronPdf 使用 [基於 HTML/CSS 的水印](https://ironpdf.com/how-to/backgrounds-and-foregrounds/),透過熟悉的網頁技術提供完整的樣式控制。 ### 密碼保護 **Apryse PDF 實作:** ```csharp using pdftron; using pdftron.PDF; using pdftron.SDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc doc = new PDFDoc("document.pdf")) { SecurityHandler handler = new SecurityHandler(); handler.ChangeUserPassword("user123"); handler.ChangeMasterPassword("owner456"); handler.SetPermission(SecurityHandler.Permission.e_print, false); handler.SetPermission(SecurityHandler.Permission.e_extract_content, false); doc.SetSecurityHandler(handler); doc.Save("protected.pdf", SDFDoc.SaveOptions.e_linearized); } PDFNet.Terminate(); ``` **IronPDF 實作:** ```csharp using IronPdf; var pdf = PdfDocument.FromFile("document.pdf"); // Set passwords pdf.SecuritySettings.UserPassword = "user123"; pdf.SecuritySettings.OwnerPassword = "owner456"; // Set permissions pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint; pdf.SecuritySettings.AllowUserCopyPasteContent = false; pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit; pdf.SaveAs("protected.pdf"); ``` ### 頁首和頁尾 **IronPDF 實作:** ```csharp using IronPdf; var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter { HtmlFragment = "
Company Header
", DrawDividerLine = true, MaxHeight = 30 }; renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter { HtmlFragment = "
Page {page} of {total-pages}
", DrawDividerLine = true, MaxHeight = 25 }; var pdf = renderer.RenderHtmlAsPdf("

Content

"); pdf.SaveAs("with_headers.pdf"); ``` IronPdf 支援占位符記號,如 `{page}` 和 `{total-pages}` 以進行動態頁碼編排。 如需更多選項,請參閱 [headers and footers 文件](https://ironpdf.com/how-to/headers-and-footers/)。 ## ASP.NET Core 整合。 Apryse PDF 的初始化要求使網路應用程式整合變得複雜。 IronPdf 簡化了這種模式。 **IronPDF模式:** ```csharp [ApiController] [Route("[controller]")] public class PdfController : ControllerBase { [HttpGet("generate")] public IActionResult GeneratePdf() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("

Report

"); return File(pdf.BinaryData, "application/pdf", "report.pdf"); } [HttpGet("generate-async")] public async Task GeneratePdfAsync() { var renderer = new ChromePdfRenderer(); var pdf = await renderer.RenderHtmlAsPdfAsync("

Report

"); return File(pdf.Stream, "application/pdf", "report.pdf"); } } ``` ### 依賴注入配置 ```csharp // Program.cs public void ConfigureServices(IServiceCollection services) { // Set license once IronPdf.License.LicenseKey = Configuration["IronPdf:LicenseKey"]; // Register renderer as scoped service services.AddScoped(); // Or create a wrapper service services.AddScoped(); } // IronPdfService.cs public class IronPdfService : IPdfService { private readonly ChromePdfRenderer _renderer; public IronPdfService() { _renderer = new ChromePdfRenderer(); _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; _renderer.RenderingOptions.PrintHtmlBackgrounds = true; } public PdfDocument GenerateFromHtml(string html) => _renderer.RenderHtmlAsPdf(html); public Task GenerateFromHtmlAsync(string html) => _renderer.RenderHtmlAsPdfAsync(html); } ``` ## 效能比較 | 指標 |Apryse PDF|IronPDF| |--------|--------|---------| |**冷開始**|快速(原生代碼)|~2s (Chromium init)| |**後續渲染**| 快速地 | 快速地 | |**複雜的 HTML**。|變數 (html2pdf 模組)|優秀 (Chromium)| |**CSS 支援**。|限額|完整的 CSS3| |**JavaScript**。|限額|全面支援| ### 效能最佳化秘訣 ```csharp // 1. Reuse renderer instance private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer(); // 2. Disable unnecessary features for speed var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.EnableJavaScript = false; // If not needed renderer.RenderingOptions.WaitFor.RenderDelay(0); // No delay renderer.RenderingOptions.Timeout = 30000; // 30s max // 3. Proper disposal using (var pdf = renderer.RenderHtmlAsPdf(html)) { pdf.SaveAs("output.pdf"); } ``` ## 排除常見的遷移問題 ### 問題:模組路徑錯誤 移除所有模組路徑設定-IronPdf 內建 Chromium 引擎: ```csharp // Remove this converter.SetModulePath("path/to/html2pdf"); // Just use the renderer var renderer = new ChromePdfRenderer(); ``` ### 問題:PDFNet.Initialize() 未找到。 以 IronPdf 授權設定取代: ```csharp // Remove this PDFNet.Initialize("KEY"); PDFNet.SetResourcesPath("path"); // Use this (optional for development) IronPdf.License.LicenseKey = "YOUR-KEY"; ``` ### 問題:PDFViewCtrl 替換 IronPdf 不包含檢視器控制項。 選項: - 使用 PDF.js 作為網頁檢視器 - 使用系統 PDF 檢視器 - 考慮第三方檢視器元件 ## 遷移後檢查清單 完成程式碼遷移後,請驗證下列事項: - [驗證 PDF 輸出品質是否符合預期 - [ ] 測試所有邊緣情況(大型文件、複雜 CSS) - [ ] 比較效能指標 - [ ] 更新 Docker 配置(如適用 - [ ] 移除 Apryse 授權和相關配置 - [ ] 記錄任何 IronPdf 特有的配置 - [ ] 針對新的 API 模式訓練團隊 - [ ] 必要時更新 CI/CD 管道 ## Future-Proofing Your PDF Infrastructure 由於 .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/) --- 從Apryse PDF轉換到IronPDF可將您的 PDF 程式碼基礎從複雜的 C++ 模式轉換為慣用的 C#。 消除初始化模板、模組路徑設定和基於訂閱的授權,可立即提高生產力,同時降低長期成本。
Curtis Chau
技術作家

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

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