從 ActivePDF 移轉到 IronPDF:(.NET 指南)
ActivePDF 一直是 .NET 開發人員可靠的 PDF 工具包。 然而,自從 Foxit 收購了該平台以來,許多開發團隊對該平台的未來、授權條款和持續開發感到不確定。 本指南提供了從 ActivePDF 到 IronPDF 的完整、逐步遷移路徑——IronPDF 是一個現代化的、積極維護的 .NET PDF 庫,支援 .NET Framework 4.6.2 到 .NET 9 及更高版本。
為什麼要考慮放棄 ActivePDF?
Foxit 收購 ActivePDF 為在 .NET 應用程式中開發 PDF 產生和處理解決方案的開發人員帶來了許多挑戰。
產品前景不明朗
ActivePDF 在 Foxit 的收購下,其發展前景引發了人們對該工具包長期發展道路的疑問。 依賴 ActivePDF 的開發者面臨著庫過時、支援減少和開發停滯的潛在風險。 對於計劃將專案延續到 2025 年和 2026 年的團隊來說,這種不確定性會造成重大的技術風險。
許可證上的複雜情況
此次收購帶來了許可方面的不確定性,可能會使部署變得複雜。 ActivePDF 傳統的機器鎖定許可模式在現代雲端和容器化環境中造成了摩擦,因為在這些環境中,應用程式需要跨基礎設施動態擴展。
遺留架構模式
ActivePDF 的架構體現了一種以有狀態工具包模式為中心的較早的設計理念。 OpenOutputFile / CloseOutputFile工作流程需要明確的檔案句柄管理,這與現代 C# 約定不符,如果處理不當,可能會引入資源管理問題。
安裝和設定開銷
與當代基於 NuGet 的套件管理不同,ActivePDF 在實例化工具包時通常需要手動引用 DLL 和明確路徑配置——這種模式增加了用戶上手的難度,並使 CI/CD 管道變得複雜。
ActivePDF 與 IronPDF:主要區別
在開始遷移程序之前,了解 ActivePDF 和 IronPDF 之間的根本區別有助於對所需的程式碼變更設定預期。
| 方面 | ActivePDF | IronPDF |
|---|---|---|
| 公司狀態 | 已被 Foxit 收購(未來前景不明) | 獨立、清晰的發展路線圖 |
| 安裝 | 手動 DLL 引用 | 簡單的NuGet 包 |
| API模式 | 有狀態( OpenOutputFile / CloseOutputFile ) | 流暢、函數式 API |
| 許可模式 | 機器鎖定 | 基於程式碼的密鑰 |
| .NET 支持 | 傳統 .NET Framework 重點 | Framework 4.6.2 至 .NET 9+ |
| 錯誤處理 | 整數返回碼 | 現代基於例外情況的 |
| 非同步支援 | 無法使用 | 完全支援異步/等待 |
遷移前準備
審核您的程式碼庫
在開始遷移之前,請確定您的解決方案中所有使用 ActivePDF 的地方。 請在解決方案目錄中執行以下命令:
grep -r "using ActivePDF" --include="*.cs" .
grep -r "using APToolkitNET" --include="*.cs" .
grep -r "APToolkitNET" --include="*.csproj" .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提供免費試用)
逐步遷移過程
步驟 1:更新 NuGet 套件
移除 ActivePDF 軟體包,然後安裝 IronPDF:
# Remove ActivePDF package
dotnet remove package APToolkitNET
# Install IronPDF
dotnet add package IronPdf# Remove ActivePDF package
dotnet remove package APToolkitNET
# Install IronPDF
dotnet add package IronPdf或者,透過 Visual Studio 套件管理器控制台:
Uninstall-Package APToolkitNET
Install-Package IronPdf對於手動引用 DLL 的項目,請從.csproj檔案中刪除該引用:
<!-- Remove this block -->
<Reference Include="APToolkitNET">
<HintPath>path\to\APToolkitNET.dll</HintPath>
</Reference><!-- Remove this block -->
<Reference Include="APToolkitNET">
<HintPath>path\to\APToolkitNET.dll</HintPath>
</Reference>步驟 2:設定許可證密鑰
在應用程式啟動時,在執行任何 PDF 操作之前,請新增 IronPDF 許可證金鑰:
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Verify license status
bool isLicensed = IronPdf.License.IsLicensed;// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Verify license status
bool isLicensed = IronPdf.License.IsLicensed;步驟 3:更新命名空間引用
對整個解決方案執行全域查找和取代:
| 尋找 | 替換為 |
|---|---|
using ActivePDF.Toolkit; | using IronPdf; |
using APToolkitNET; | using IronPdf; |
using APToolkitNET.PDFObjects; | using IronPdf; |
using APToolkitNET.Common; | using IronPdf; |
完整的 API 遷移參考
文件建立方法
| ActivePDF 方法 | IronPDF當量 | 筆記 |
|---|---|---|
new Toolkit() | new ChromePdfRenderer() | 渲染器建立 PDF |
toolkit.OpenOutputFile(path) | 無需等效物 | 最後只要呼叫SaveAs()即可 |
toolkit.CloseOutputFile() | 無需等效物 | 自動清理 |
toolkit.AddHTML(html) | renderer.RenderHtmlAsPdf(html) | 返回PdfDocument |
toolkit.AddURL(url) | renderer.RenderUrlAsPdf(url) | URL 轉 PDF |
toolkit.SaveAs(path) | pdf.SaveAs(path) | 儲存到文件 |
文件操作
| ActivePDF 方法 | IronPDF當量 | 筆記 |
|---|---|---|
toolkit.OpenInputFile(path) | PdfDocument.FromFile(path) | 載入現有PDF |
toolkit.AddPDF(path) | PdfDocument.Merge() | 對於合併操作 |
toolkit.GetPageCount() | pdf.PageCount | 物業通道 |
toolkit.GetText() | pdf.ExtractAllText() | 文字擷取 |
頁面配置
| ActivePDF 方法 | IronPDF當量 |
|---|---|
toolkit.SetPageSize(612, 792) | RenderingOptions.PaperSize = PdfPaperSize.Letter |
toolkit.SetOrientation("Landscape") | RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape |
toolkit.SetMargins(t, b, l, r) | RenderingOptions.MarginTop/Bottom/Left/Right |
安全方法
| ActivePDF 方法 | IronPDF當量 |
|---|---|
toolkit.Encrypt(password) | pdf.SecuritySettings.OwnerPassword |
toolkit.SetUserPassword(pwd) | pdf.SecuritySettings.UserPassword |
toolkit.SetPermissions(flags) | pdf.SecuritySettings.AllowUserXxx |
toolkit.AddWatermark(text) | pdf.ApplyWatermark(html) |
程式碼遷移範例
HTML 轉 PDF
將 HTML 字串轉換為 PDF 文件是最常見的 PDF 生成場景之一。 以下是程式碼在遷移過程中的轉換方式。
ActivePDF 實作:
// NuGet: Install-Package APToolkitNET
using ActivePDF.Toolkit;
using System;
class Program
{
static void Main()
{
Toolkit toolkit = new Toolkit();
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
if (toolkit.OpenOutputFile("output.pdf") == 0)
{
toolkit.AddHTML(htmlContent);
toolkit.CloseOutputFile();
Console.WriteLine("PDF created successfully");
}
}
}// NuGet: Install-Package APToolkitNET
using ActivePDF.Toolkit;
using System;
class Program
{
static void Main()
{
Toolkit toolkit = new Toolkit();
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
if (toolkit.OpenOutputFile("output.pdf") == 0)
{
toolkit.AddHTML(htmlContent);
toolkit.CloseOutputFile();
Console.WriteLine("PDF created successfully");
}
}
}IronPDF實現:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
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();
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}IronPDF 方法消除了明確的文件句柄管理,同時提供了更簡潔、更易讀的程式碼。 對於進階HTML 轉 PDF 場景,IronPDF 的ChromePdfRenderer使用基於 Chromium 的渲染引擎,可實現像素級完美的 CSS 和 JavaScript 支援。
URL 轉 PDF
將網頁捕獲為 PDF 文件也遵循類似的現代化模式。
ActivePDF 實作:
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");
}
}
}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實現:
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");
}
}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 實作:
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");
}
}
}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實現:
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");
}
}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");
}
}如需更進階的合併情境(包括選擇性頁面擷取),請參閱PDF 合併文件。
新增頁首和頁尾
ActivePDF 實作:
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();
}
}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實現:
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);
}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 為基礎的頁首和頁尾,提供完全的設計彈性。
密碼保護和安全
ActivePDF 實作:
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();
}
}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實現:
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);
}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使用強型別枚舉而非整數標誌,對文件權限進行精細控制。
文字擷取
ActivePDF 實作:
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;
}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實現:
using IronPdf;
public string ExtractText(string pdfPath)
{
using var pdf = PdfDocument.FromFile(pdfPath);
return pdf.ExtractAllText();
}using IronPdf;
public string ExtractText(string pdfPath)
{
using var pdf = PdfDocument.FromFile(pdfPath);
return pdf.ExtractAllText();
}IronPDF 的實作方式將多行文字擷取簡化為單一方法呼叫。
添加浮水印
ActivePDF 實作:
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();
}
}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實現:
using IronPdf;
public void AddWatermark(string inputPath, string outputPath, string watermarkText)
{
using var pdf = PdfDocument.FromFile(inputPath);
pdf.ApplyWatermark(
$"<h1 style='color:lightgray;font-size:72px;'>{watermarkText}</h1>",
rotation: 45,
opacity: 50);
pdf.SaveAs(outputPath);
}using IronPdf;
public void AddWatermark(string inputPath, string outputPath, string watermarkText)
{
using var pdf = PdfDocument.FromFile(inputPath);
pdf.ApplyWatermark(
$"<h1 style='color:lightgray;font-size:72px;'>{watermarkText}</h1>",
rotation: 45,
opacity: 50);
pdf.SaveAs(outputPath);
}IronPDF基於 HTML 的浮水印功能支援 CSS 樣式,無需逐頁迭代即可實現完全的設計控制。
ASP.NET Core 集成
現代 Web 應用程式從 IronPDF 更簡潔的整合模式中受益匪淺。
ActivePDF 模式:
[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");
}[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 圖案:
[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");
}[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 缺乏原生非同步支援。 IronPDF 提供完整的非同步/等待功能,這對於可擴展的 Web 應用程式至關重要:
using IronPdf;
public async Task<byte[]> GeneratePdfAsync(string html)
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}using IronPdf;
public async Task<byte[]> GeneratePdfAsync(string html)
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}依賴注入配置
對於 .NET 6+ 應用程序,請在您的依賴注入容器中註冊 IronPDF 服務:
// Program.cs (.NET 6+)
builder.Services.AddSingleton<ChromePdfRenderer>();
// Service wrapper
public interface IPdfService
{
Task<byte[]> GeneratePdfAsync(string html);
Task<byte[]> GeneratePdfFromUrlAsync(string url);
}
public class IronPdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public IronPdfService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
using var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
public async Task<byte[]> GeneratePdfFromUrlAsync(string url)
{
using var pdf = await _renderer.RenderUrlAsPdfAsync(url);
return pdf.BinaryData;
}
}// Program.cs (.NET 6+)
builder.Services.AddSingleton<ChromePdfRenderer>();
// Service wrapper
public interface IPdfService
{
Task<byte[]> GeneratePdfAsync(string html);
Task<byte[]> GeneratePdfFromUrlAsync(string url);
}
public class IronPdfService : IPdfService
{
private readonly ChromePdfRenderer _renderer;
public IronPdfService()
{
_renderer = new ChromePdfRenderer();
_renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
using var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}
public async Task<byte[]> GeneratePdfFromUrlAsync(string url)
{
using var pdf = await _renderer.RenderUrlAsPdfAsync(url);
return pdf.BinaryData;
}
}錯誤處理遷移
ActivePDF 使用整數回傳碼,需要找表。 IronPDF 使用現代異常處理技術:
ActivePDF 錯誤處理:
Toolkit toolkit = new Toolkit();
int result = toolkit.OpenOutputFile(path);
if (result != 0)
{
// Error - need to look up error code
Console.WriteLine($"Error code: {result}");
}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錯誤處理:
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}");
}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會有初始化開銷。 對於批次操作,請重複使用單一實例:
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"output_{i}.pdf");
}var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs($"output_{i}.pdf");
}在 Web 應用程式中使用非同步
對於 ASP.NET Core 應用程序,非同步 PDF 產生可以提高吞吐量:
public async Task<IActionResult> GenerateReport()
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}public async Task<IActionResult> GenerateReport()
{
var renderer = new ChromePdfRenderer();
using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
}妥善處置資源
始終使用using語句以確保正確清理:
using var pdf = renderer.RenderHtmlAsPdf(html);
return pdf.BinaryData;using var pdf = renderer.RenderHtmlAsPdf(html);
return pdf.BinaryData;影像壓縮
透過影像壓縮減小輸出檔案大小:
using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.CompressImages(85); // 85% quality
pdf.SaveAs("compressed.pdf");using var pdf = renderer.RenderHtmlAsPdf(html);
pdf.CompressImages(85); // 85% quality
pdf.SaveAs("compressed.pdf");解決常見遷移問題
問題:頁面尺寸差異
ActivePDF 使用點(612x792 = Letter),而 IronPDF 則使用枚舉或毫米:
// 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);// 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 採用了一個無需明確文件句柄管理的現代範式:
// 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// 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 的內容顯示為空白,請設定渲染延遲:
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.RenderDelay(2000);
// Or wait for element:
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.RenderDelay(2000);
// Or wait for element:
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");問題:CSS/圖片無法載入
配置相對路徑解析的基本 URL:
renderer.RenderingOptions.BaseUrl = new Uri("https://yourdomain.com/assets/");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 程式庫可以確保您的應用程式與不斷發展的執行時間功能保持相容。 IronPDF 致力於支援最新的 .NET 版本,這意味著隨著您的專案擴展到 2025 年和 2026 年,您的遷移投資將獲得回報。
其他資源
從 ActivePDF 遷移到 IronPDF 可以讓您 PDF 產生基礎架構現代化,提供更簡潔的 API、更好的 .NET 整合和積極的長期支援。 對遷移的投資會帶來豐厚的回報,包括提高程式碼可維護性、非同步功能以及增強對 PDF 庫持續開發的信心。






