跳至頁尾內容
移民指南

如何在 C# 中將 ExpertPDF 遷移到 IronPDF

ExpertPdf 是一款針對 .NET 的商業 HTML 轉 PDF 轉換器,多年來一直為開發人員提供服務。 然而,ExpertPdf 在當今快速發展的發展環境中面臨著重大挑戰:文檔自 2018 年以來一直停滯不前,依賴於缺少現代 CSS3 功能的舊版 Chrome,使用過時技術卻收取 550 美元至 1200 美元的高價,以及產品套件分散,合併、安全和拆分都需要單獨的許可證。 本綜合指南提供了從 專家PDF 到 IronPDF 的逐步遷移路徑——IronPDF 是一個現代化的 .NET PDF 庫,具有最新的 Chromium 渲染、每月更新和一體化軟體包架構。

為什麼要從 ExpertPDF 遷移到 IronPDF?

ExpertPdf 提出了一些挑戰,促使開發團隊評估現代替代方案。 了解這些問題對於制定遷移策略至關重要。

ExpertPDF 問題

1.文檔自 2018 年以來一直處於凍結狀態: 專家PDF 的文檔已經超過 6 年沒有更新了。 隨著 .NET 生態系統的發展,尋找最新資訊、範例和最佳實踐變得越來越困難。

2.過時的 Chrome 版本: 專家PDF 依賴舊版本的 Chrome 進行渲染。 現代 CSS3 功能(Flexbox、Grid、CSS 變數)可能無法正確渲染,且未套用安全性修補程式。

3.傳統技術的高價定價: 專家PDF 的授權價格為 550 美元至 1200 美元,卻提供過時的渲染技術。

4.產品套件分散: 專家PDF 為不同的功能單獨銷售軟體包-HtmlToPdf Converter、PDF Merger、PDF Security、PDF Splitter 和 PDF to Image-每個軟體包都需要單獨的許可。

5.現代 .NET 支援有限:雖然 專家PDF 有 .NET Core 包,但它們落後於現代 .NET 版本和實踐。

架構比較

方面專家PDFIronPDF
文件自2018年起冷凍持續更新
渲染引擎舊版 Chrome最新鉻
CSS 支援有限的 CSS3完整的 CSS3(Flexbox、Grid)
價格550-1200美元價格競爭力強
更新頻率不頻繁每月發布
產品模型碎片化(5個以上DLL檔)一體化圖書館
近代 .NET有限的.NET 6/7/8/9+ 原生
非同步支援有限的完全異步/等待

遷移的主要優勢

1.現代渲染:採用最新的 Chromium 引擎,實現像素級完美輸出 2.一體化軟體套件:在一個 NuGet 套件中完成 PDF 產生、合併、安全保護和擷取。 3.積極開發:每月更新,包含新功能和安全補丁 4.更完善的文件:全面的教學與範例 5.真正的跨平台:支援 Windows、Linux、macOS 和 Docker。

遷移前準備

先決條件

請確保您的環境符合以下要求:

  • .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ 或帶有 C# 擴充功能的 VS Code
  • NuGet 套件管理器訪問
  • IronPDF 許可證金鑰(可在ironpdf.com提供免費試用)

審計專家PDF使用情況

在解決方案目錄中執行以下命令,以識別所有 專家PDF 參考:

# Find all 專家PDF references
grep -r "ExpertPdf\|PdfConverter\|PDFMerge\|PdfSecurityManager" --include="*.cs" .

# Check NuGet packages
dotnet list package | grep -i "ExpertPdf"
# Find all 專家PDF references
grep -r "ExpertPdf\|PdfConverter\|PDFMerge\|PdfSecurityManager" --include="*.cs" .

# Check NuGet packages
dotnet list package | grep -i "ExpertPdf"
SHELL

常見的 專家PDF 軟體包:

ExpertPdf.HtmlToPdf - HTML 轉 PDF 轉換

  • ExpertPdf.PDFMerge - PDF 合併
  • ExpertPdf.PDFSecurity - 加密和密碼 ExpertPdf.PDFSplit - PDF 分割 ExpertPdf.PdfToImage - PDF 轉影像

理解核心模式變化

ExpertPdf 使用PdfConverter ,並採用直接傳回位元組數組的方法。 IronPDF 使用ChromePdfRenderer傳回PdfDocument對象,這些物件在儲存之前提供額外的操作功能。

逐步遷移過程

步驟 1:更新 NuGet 套件

移除所有 ExpertPDF 軟體包,然後安裝 IronPDF:

# Remove all 專家PDF packages
dotnet remove package ExpertPdf.HtmlToPdf
dotnet remove package ExpertPdf.PDFMerge
dotnet remove package ExpertPdf.PDFSecurity
dotnet remove package ExpertPdf.PDFSplit
dotnet remove package ExpertPdf.PdfToImage

# Install IronPDF (includes all features)
dotnet add package IronPdf
# Remove all 專家PDF packages
dotnet remove package ExpertPdf.HtmlToPdf
dotnet remove package ExpertPdf.PDFMerge
dotnet remove package ExpertPdf.PDFSecurity
dotnet remove package ExpertPdf.PDFSplit
dotnet remove package ExpertPdf.PdfToImage

# Install IronPDF (includes all features)
dotnet add package IronPdf
SHELL

步驟 2:更新命名空間引用

將 專家PDF 命名空間替換為 IronPDF:

// Remove these
using ExpertPdf.HtmlToPdf;

// Add this
using IronPdf;
// Remove these
using ExpertPdf.HtmlToPdf;

// Add this
using IronPdf;
$vbLabelText   $csharpLabel

步驟 3:設定許可證

ExpertPdf採用轉換器授權的方式。 IronPDF採用單一全球授權:

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
$vbLabelText   $csharpLabel

完整的 API 遷移參考

核心類別映射

專家PDF 類IronPDF當量筆記
PdfConverterChromePdfRenderer主轉換類
PdfDocumentOptionsChromePdfRenderOptions透過RenderingOptions
PdfHeaderOptionsTextHeaderFooterHtmlHeaderFooter可配置
PdfFooterOptionsTextHeaderFooterHtmlHeaderFooter可配置
PDFMergePdfDocument.Merge()靜態方法

方法映射

ExpertPDF 方法IronPDF 方法筆記
pdfConverter.GetPdfBytesFromHtmlString(html)renderer.RenderHtmlAsPdf(html).BinaryData
pdfConverter.GetPdfBytesFromUrl(url)renderer.RenderUrlAsPdf(url).BinaryData
pdfConverter.GetPdfBytesFromHtmlFile(path)renderer.RenderHtmlFileAsPdf(path).BinaryData
pdfConverter.SavePdfFromUrlToFile(url, path)renderer.RenderUrlAsPdf(url).SaveAs(path)兩步

選項映射

ExpertPdf選項IronPDF渲染選項筆記
PdfDocumentOptions.PdfPageSize = PdfPageSize.A4PaperSize = PdfPaperSize.A4
PdfDocumentOptions.PdfPageOrientation = PortraitPaperOrientation = PdfPaperOrientation.Portrait
PdfDocumentOptions.MarginTopMarginTop相同的房產名稱
PdfHeaderOptions.HeaderTextTextHeader.CenterText
PdfFooterOptions.FooterTextTextFooter.RightText

頁碼標記轉換

ExpertPDF 和 IronPDF 使用不同的佔位語法來表示頁碼:

專家PDFIronPDF
&p;{page}
&P;{total-pages}

程式碼遷移範例

HTML 轉 PDF

基本的 HTML 到 PDF 轉換體現了從 專家PDF 的位元組數組模式到 IronPDF 的文檔物件方法的轉變。

ExpertPdf實作:

// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Convert HTML string to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlString("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        System.IO.File.WriteAllBytes("output.pdf", pdfBytes);

        Console.WriteLine("PDF created successfully!");
    }
}
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Convert HTML string to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlString("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        System.IO.File.WriteAllBytes("output.pdf", pdfBytes);

        Console.WriteLine("PDF created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF實現:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF from HTML string
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        pdf.SaveAs("output.pdf");

        Console.WriteLine("PDF created successfully!");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF from HTML string
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        pdf.SaveAs("output.pdf");

        Console.WriteLine("PDF created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF 的方法傳回PdfDocument對象,因此可以在儲存之前進行額外的操作(合併、浮水印、安全設定)。 更多選項,請參閱HTML 轉 PDF 文件

指向包含頁面設定的 PDF 檔案的 URL

ExpertPdf實作:

// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Set page size and orientation
        pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
        pdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;

        // Convert URL to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromUrl("https://www.example.com");

        // Save to file
        System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);

        Console.WriteLine("PDF from URL created successfully!");
    }
}
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Set page size and orientation
        pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
        pdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;

        // Convert URL to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromUrl("https://www.example.com");

        // Save to file
        System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);

        Console.WriteLine("PDF from URL created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF實現:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Set page size and orientation
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;

        // Convert URL to PDF
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        // Save to file
        pdf.SaveAs("webpage.pdf");

        Console.WriteLine("PDF from URL created successfully!");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Set page size and orientation
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;

        // Convert URL to PDF
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        // Save to file
        pdf.SaveAs("webpage.pdf");

        Console.WriteLine("PDF from URL created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF 的RenderingOptions提供了對頁面配置的直接屬性存取。 更多選項請參閱PDF 文件的 URL

附頁碼的頁首和頁尾

此範例示範了頁首/頁尾配置的關鍵差異-ExpertPdf 使用單獨的PdfHeaderOptionsPdfFooterOptions類,帶有&amp;p; / &amp;P;標記,而 IronPDF 使用TextHeaderFooter帶有{page} / {total-pages}佔位符。

ExpertPdf實作:

// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Enable header
        pdfConverter.PdfHeaderOptions.ShowHeader = true;
        pdfConverter.PdfHeaderOptions.HeaderText = "Document Header";
        pdfConverter.PdfHeaderOptions.HeaderTextAlignment = HorizontalTextAlign.Center;

        // Enable footer with page numbers
        pdfConverter.PdfFooterOptions.ShowFooter = true;
        pdfConverter.PdfFooterOptions.FooterText = "Page &p; of &P;";
        pdfConverter.PdfFooterOptions.FooterTextAlignment = HorizontalTextAlign.Right;

        // Convert HTML file to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlFile("input.html");

        // Save to file
        System.IO.File.WriteAllBytes("output-with-header-footer.pdf", pdfBytes);

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Enable header
        pdfConverter.PdfHeaderOptions.ShowHeader = true;
        pdfConverter.PdfHeaderOptions.HeaderText = "Document Header";
        pdfConverter.PdfHeaderOptions.HeaderTextAlignment = HorizontalTextAlign.Center;

        // Enable footer with page numbers
        pdfConverter.PdfFooterOptions.ShowFooter = true;
        pdfConverter.PdfFooterOptions.FooterText = "Page &p; of &P;";
        pdfConverter.PdfFooterOptions.FooterTextAlignment = HorizontalTextAlign.Right;

        // Convert HTML file to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlFile("input.html");

        // Save to file
        System.IO.File.WriteAllBytes("output-with-header-footer.pdf", pdfBytes);

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF實現:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Configure header
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Document Header",
            DrawDividerLine = true
        };

        // Configure footer with page numbers
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            RightText = "Page {page} of {total-pages}",
            DrawDividerLine = true
        };

        // Convert HTML file to PDF
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");

        // Save to file
        pdf.SaveAs("output-with-header-footer.pdf");

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Configure header
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Document Header",
            DrawDividerLine = true
        };

        // Configure footer with page numbers
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            RightText = "Page {page} of {total-pages}",
            DrawDividerLine = true
        };

        // Convert HTML file to PDF
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");

        // Save to file
        pdf.SaveAs("output-with-header-footer.pdf");

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF 的TextHeaderFooter提供LeftTextCenterTextRightText屬性,並可選配分隔線。 對於基於 HTML 的標頭,請使用HtmlHeaderFooter 。 更多選項請參閱頁首和頁尾文件

關鍵遷移說明

許可證密鑰位置

ExpertPdf採用轉換器授權的方式。 IronPDF 在啟動時使用一次性的全域授權集:

// 專家PDF - per converter
pdfConverter.LicenseKey = "EXPERTPDF-LICENSE";

// IronPDF - global, set once
IronPdf.License.LicenseKey = "IRONPDF-LICENSE";
// 專家PDF - per converter
pdfConverter.LicenseKey = "EXPERTPDF-LICENSE";

// IronPDF - global, set once
IronPdf.License.LicenseKey = "IRONPDF-LICENSE";
$vbLabelText   $csharpLabel

頁碼標記轉換

將 專家PDF 標記替換為 IronPDF 佔位符:

// ExpertPdf
"Page &p; of &P;"

// IronPDF
"Page {page} of {total-pages}"
// ExpertPdf
"Page &p; of &P;"

// IronPDF
"Page {page} of {total-pages}"
$vbLabelText   $csharpLabel

碎片化包裹合併

ExpertPdf 的各個獨立軟體包(PDFMerge、PDFSecurity、PDFSplit、PdfToImage)都包含在 IronPDF 的單一軟體包中:

// 專家PDF - requires separate PDFMerge package
var merger = new PdfMerge();
merger.AppendPDFFile("file1.pdf");
merger.AppendPDFFile("file2.pdf");
merger.SaveMergedPDFToFile("merged.pdf");

// IronPDF - included in main package
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
// 專家PDF - requires separate PDFMerge package
var merger = new PdfMerge();
merger.AppendPDFFile("file1.pdf");
merger.AppendPDFFile("file2.pdf");
merger.SaveMergedPDFToFile("merged.pdf");

// IronPDF - included in main package
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
$vbLabelText   $csharpLabel

如需更多合併選項,請參閱PDF 合併文件

自訂頁面尺寸

ExpertPdf 使用點數。 IronPDF 使用毫米作為單位。 換算: points / 72 * 25.4 = mm

遷移後檢查清單

程式碼遷移完成後,請驗證以下內容:

  • 產生PDF檔案的可視化比較
  • 核對頁首/頁尾和頁碼
  • 測試安全/加密設置
  • 驗證合併操作
  • 檢查自訂頁面尺寸
  • 性能基準測試
  • 跨平台測試
  • 刪除 專家PDF 授權文件
  • 更新文檔

讓您的 PDF 基礎架構面向未來

隨著 .NET 10 即將到來,C# 14 也引入了新的語言特性,選擇一個具有活躍開發和現代渲染功能的 PDF 庫可以確保長期的兼容性。 IronPDF 的每月更新和最新的 Chromium 引擎為 PDF 生成奠定了基礎,即使項目擴展到 2025 年和 2026 年,它也能繼續與現代 CSS3 佈局(Flexbox、Grid)正確配合使用——這與 專家PDF 停滯不前的舊版 Chrome 版本截然不同。

其他資源

IronPDF 文件


從 專家PDF 遷移到 IronPDF 可以消除文件凍結、舊版 Chrome 渲染、產品許可碎片化以及現代 .NET 支援有限的挑戰。 過渡到使用最新 Chromium 引擎的積極維護庫,可確保您的 PDF 產生與不斷發展的網路標準和 .NET 框架保持同步。

柯蒂斯·週
技術撰稿人

Curtis Chau擁有卡爾頓大學電腦科學學士學位,專長於前端開發,精通Node.js、TypeScript、JavaScript和React。他熱衷於打造直覺美觀的使用者介面,喜歡使用現代框架,並擅長撰寫結構清晰、視覺效果出色的使用者手冊。

除了開發工作之外,柯蒂斯對物聯網 (IoT) 也抱有濃厚的興趣,致力於探索硬體和軟體整合的創新方法。閒暇時,他喜歡玩遊戲和製作 Discord 機器人,將他對科技的熱愛與創造力結合。