跳過到頁腳內容
MIGRATION GUIDES

How to Migrate from Adobe PDF Library SDK to IronPDF

透過 Datalogics 提供的 Adobe PDF 函式庫 SDK 提供了具有高級功能的正版 Adobe PDF 引擎。 然而,高昂的授權費用、複雜的原生 SDK 整合和底層 API 設計使得它對許多開發團隊來說並不實用。 本指南提供了從 Adobe PDF 函式庫 SDK 到 IronPDF 的逐步遷移路徑——IronPDF 是一個現代化的、經濟高效的 .NET PDF 庫,支援 .NET Framework 4.6.2 到 .NET 9 及未來版本。

為什麼要考慮放棄 Adobe PDF Library SDK?

雖然 Adobe PDF 函式庫 SDK 提供了真正的 Adobe PDF 引擎,但多種因素促使開發團隊探索其他方法來滿足其 PDF 生成和操作需求。

高昂的許可證費用

Adobe PDF Library SDK 採用企業級定價策略,通常每年價格在 10,000 美元到 50,000 美元以上。 這種成本結構使得 SDK 對於中小型企業、新創公司、個人開發者以及不需要完整 Adobe 引擎功能的專案來說並不實用。

複雜的本地 SDK 集成

Adobe PDF Library SDK 是基於原生 C++ 程式碼構建,需要特定於平台的二進位。 開發人員必須謹慎管理內存,處理顯式初始化和終止模式,並完成複雜的設定過程。 這會增加大量的開發開銷,並使 CI/CD 管線變得複雜。

底層 API 設計

使用 Adobe PDF 函式庫 SDK 建立 PDF 涉及以程式設計方式建立頁面、內容流、文字流和字型。 像渲染 HTML 內容這樣的簡單任務變成了涉及座標計算、字體嵌入和手動內容元素管理的多步驟操作。

圖書館生命週期管理開銷

每個操作都需要將程式碼包裝在Library.Initialize()Library.Terminate()區塊中,並仔細釋放 COM 物件。 忘記執行清理步驟會導致資源洩漏和應用程式不穩定。

對於典型項目而言,這有點過度了

對於主要需要 HTML 轉 PDF、基本文件操作或報告產生的應用程式來說,完整的 Adobe PDF 引擎代表著過度設計,而更簡單的解決方案就能達到相同的效果。

Adobe PDF 函式庫 SDK 與 IronPDF:主要差異

了解這些程式庫之間的基本架構差異有助於制定有效的遷移策略。

方面 Adobe PDF 函式庫 SDK IronPDF
定價 年營業額 1 萬至 5 萬美元以上的企業 經濟實惠的按開發者收費許可
安裝 本地 DLL,平台特定 簡單的NuGet 包
文件創建 底層頁面/內容構建 HTML/CSS渲染
初始化 Library.Initialize() / Terminate()是必需的 自動的
座標系 PostScript 點,左下角原點 基於 CSS 的佈局
字體處理 需要手動嵌入 自動的
記憶體管理 手動處置 COM 對象 標準拋棄式圖案
非同步支援 無法使用 完全支援異步/等待

遷移前準備

先決條件

在開始遷移之前,請確保您的環境符合以下要求:

  • .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ 或 JetBrains Rider
  • NuGet 套件管理器訪問
  • IronPDF 許可證金鑰(可在ironpdf.com提供免費試用)

審核 Adobe PDF 庫 SDK 使用情況

在解決方案目錄中執行以下命令,以識別所有 Adobe PDF 函式庫 SDK 參考:

grep -r "using Datalogics" --include="*.cs" .
grep -r "Adobe.PDF.Library" --include="*.csproj" .
grep -r "Library.Initialize\|Library.Terminate" --include="*.cs" .
grep -r "using Datalogics" --include="*.cs" .
grep -r "Adobe.PDF.Library" --include="*.csproj" .
grep -r "Library.Initialize\|Library.Terminate" --include="*.cs" .
SHELL

需要預見的重大變化

類別 Adobe PDF 函式庫 SDK IronPDF 移民行動
初始化 Library.Initialize() / Terminate() 自動的 移除生命週期代碼
文件創建 帶有頁面構造的new Document() ChromePdfRenderer 使用 HTML 渲染
座標系 PostScript 點,左下角原點 基於 CSS 的佈局 使用 HTML/CSS
字體處理 手動建立和嵌入Font 自動的 移除字體程式碼
記憶體管理 手動處置 COM 對象 標準一次性 使用using語句
頁面構造 CreatePage()AddContent() 自動從 HTML 大幅簡化

逐步遷移過程

步驟 1:更新 NuGet 套件

移除 Adobe PDF 函式庫 SDK 軟體包,然後安裝 IronPDF:

# Remove Adobe PDF Library
dotnet remove package Adobe.PDF.Library.LM.NET

# Install IronPDF
dotnet add package IronPdf
# Remove Adobe PDF Library
dotnet remove package Adobe.PDF.Library.LM.NET

# Install IronPDF
dotnet add package IronPdf
SHELL

步驟 2:設定許可證密鑰

將 Adobe 的許可協議替換為 IronPDF 的基於代碼的許可密鑰:

// Replace Adobe's Library.LicenseKey with IronPDF license
// Add at application startup, before any IronPDF operations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

// Verify license status
bool isLicensed = IronPdf.License.IsLicensed;
// Replace Adobe's Library.LicenseKey with IronPDF license
// Add at application startup, before any IronPDF operations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

// Verify license status
bool isLicensed = IronPdf.License.IsLicensed;
$vbLabelText   $csharpLabel

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

對整個解決方案執行全域查找和取代:

尋找 替換為
using Datalogics.PDFL; using IronPdf;
using Datalogics.PDFL.Document; using IronPdf;
using Datalogics.PDFL.Page; using IronPdf;
using Datalogics.PDFL.Content; using IronPdf;

步驟 4:移除庫生命週期程式碼

其中一項最重要的簡化是移除初始化和終止模式:

// Adobe PDF 函式庫 SDK - REMOVE THIS PATTERN
Library.Initialize();
try
{
    // PDF operations
}
finally
{
    Library.Terminate(); // Must always terminate
}

// IronPDF - Just use directly
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// Adobe PDF 函式庫 SDK - REMOVE THIS PATTERN
Library.Initialize();
try
{
    // PDF operations
}
finally
{
    Library.Terminate(); // Must always terminate
}

// IronPDF - Just use directly
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
$vbLabelText   $csharpLabel

完整的 API 遷移參考

圖書館生命週期方法

Adobe 方法 IronPDF當量 筆記
Library.Initialize() 不需要 自動初始化
Library.Terminate() 不需要 自動清理
Library.LicenseKey = "KEY" IronPdf.License.LicenseKey = "KEY" 啟動時設定一次
using (Library lib = new Library()) 不需要 無需包裝

文件建立方法

Adobe 方法 IronPDF 方法 筆記
new Document() new ChromePdfRenderer() HTML渲染器
new Document(path) PdfDocument.FromFile(path) 載入現有PDF
doc.CreatePage(index, rect) 自動從 HTML 頁面自動建立
doc.Save(SaveFlags.Full, path) pdf.SaveAs(path) 儲存到文件
doc.NumPages pdf.PageCount 頁面計數屬性
doc.GetPage(index) pdf.Pages[index] 訪問頁面
doc.InsertPages(...) PdfDocument.Merge() 合併文檔

內容創作(重大典範轉移)

Adobe PDF Library SDK 需要底層內容建置。 IronPDF 使用 HTML/CSS:

Adobe 方法 IronPDF 方法 筆記
new Text() 使用 HTML<p><h1> , ETC。 HTML標籤
text.AddRun(textRun) 使用 HTML 透過 HTML 發送文字
new TextRun(text, font, size, point) CSS樣式 透過 CSS 實現樣式
new Font(name, flags) CSS font-family 透過 CSS 實現字體
new Image(path) HTML<img>標籤 圖片透過 HTML 傳輸
content.AddElement(...) HTML 內容 使用 HTML 構建
page.UpdateContent() 不需要 自動的

水印和安全方法

Adobe 方法 IronPDF 方法 筆記
new Watermark(doc, textParams, wmParams) pdf.ApplyWatermark(html) HTML浮水印
WatermarkParams.Opacity CSS opacity 透過 CSS 控制不透明度
new EncryptionHandler(user, owner, perms) pdf.SecuritySettings 安全性設定
PermissionFlags.PrintDoc AllowUserPrinting 列印許可

文字擷取

Adobe 方法 IronPDF 方法 筆記
new WordFinder(doc, config) pdf.ExtractAllText() 簡單提取
wordFinder.GetWordList() pdf.Pages[i].Text 每頁文本
複雜詞/字符迭代 單方法調用 簡單得多

程式碼遷移範例

HTML 轉 PDF

將內容轉換為 PDF 時,簡化效果最為顯著。 Adobe PDF 函式庫 SDK 需要手動建立頁面、嵌入字體和進行座標定位。

Adobe PDF 函式庫 SDK 實作:

// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;

class AdobeHtmlToPdf
{
    static void Main()
    {
        using (Library lib = new Library())
        {
            // Adobe PDF Library requires complex setup with HTML conversion parameters
            HTMLConversionParameters htmlParams = new HTMLConversionParameters();
            htmlParams.PaperSize = PaperSize.Letter;
            htmlParams.Orientation = Orientation.Portrait;

            string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

            // Convert HTML to PDF
            Document doc = Document.CreateFromHTML(htmlContent, htmlParams);
            doc.Save(SaveFlags.Full, "output.pdf");
            doc.Dispose();
        }
    }
}
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;

class AdobeHtmlToPdf
{
    static void Main()
    {
        using (Library lib = new Library())
        {
            // Adobe PDF Library requires complex setup with HTML conversion parameters
            HTMLConversionParameters htmlParams = new HTMLConversionParameters();
            htmlParams.PaperSize = PaperSize.Letter;
            htmlParams.Orientation = Orientation.Portrait;

            string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

            // Convert HTML to PDF
            Document doc = Document.CreateFromHTML(htmlContent, htmlParams);
            doc.Save(SaveFlags.Full, "output.pdf");
            doc.Dispose();
        }
    }
}
$vbLabelText   $csharpLabel

IronPDF實現:

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

class IronPdfHtmlToPdf
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        // Convert HTML to PDF with simple API
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class IronPdfHtmlToPdf
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        // Convert HTML to PDF with simple API
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

IronPDF 消除了庫生命週期包裝器、轉換參數物件和明確處置。 ChromePdfRenderer使用基於 Chromium 的引擎,可實現像素級完美的 CSS 和 JavaScript 支援。 對於進階場景,請參閱HTML 轉 PDF 文件

合併多個PDF文件

PDF合併清楚地顯示了API複雜性的差異。

Adobe PDF 函式庫 SDK 實作:

// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;

class AdobeMergePdfs
{
    static void Main()
    {
        using (Library lib = new Library())
        {
            // Open first PDF document
            Document doc1 = new Document("document1.pdf");
            Document doc2 = new Document("document2.pdf");

            // Insert pages from second document into first
            PageInsertParams insertParams = new PageInsertParams();
            insertParams.InsertFlags = PageInsertFlags.None;

            for (int i = 0; i < doc2.NumPages; i++)
            {
                Page page = doc2.GetPage(i);
                doc1.InsertPage(doc1.NumPages - 1, page, insertParams);
            }

            doc1.Save(SaveFlags.Full, "merged.pdf");
            doc1.Dispose();
            doc2.Dispose();
        }
    }
}
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;

class AdobeMergePdfs
{
    static void Main()
    {
        using (Library lib = new Library())
        {
            // Open first PDF document
            Document doc1 = new Document("document1.pdf");
            Document doc2 = new Document("document2.pdf");

            // Insert pages from second document into first
            PageInsertParams insertParams = new PageInsertParams();
            insertParams.InsertFlags = PageInsertFlags.None;

            for (int i = 0; i < doc2.NumPages; i++)
            {
                Page page = doc2.GetPage(i);
                doc1.InsertPage(doc1.NumPages - 1, page, insertParams);
            }

            doc1.Save(SaveFlags.Full, "merged.pdf");
            doc1.Dispose();
            doc2.Dispose();
        }
    }
}
$vbLabelText   $csharpLabel

IronPDF實現:

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

class IronPdfMergePdfs
{
    static void Main()
    {
        // Load PDF documents
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        // Merge PDFs with simple method
        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class IronPdfMergePdfs
{
    static void Main()
    {
        // Load PDF documents
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        // Merge PDFs with simple method
        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");
    }
}
$vbLabelText   $csharpLabel

Adobe 的方法需要逐頁迭代,並插入參數。 IronPDF 提供了一種可以接受多個文件的Merge方法。

添加浮水印

水印功能展示了 IronPDF 如何利用 HTML/CSS 實現樣式彈性。

Adobe PDF 函式庫 SDK 實作:

// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;

class AdobeAddWatermark
{
    static void Main()
    {
        using (Library lib = new Library())
        {
            Document doc = new Document("input.pdf");

            // Create watermark with complex API
            WatermarkParams watermarkParams = new WatermarkParams();
            watermarkParams.Opacity = 0.5;
            watermarkParams.Rotation = 45.0;
            watermarkParams.VerticalAlignment = WatermarkVerticalAlignment.Center;
            watermarkParams.HorizontalAlignment = WatermarkHorizontalAlignment.Center;

            WatermarkTextParams textParams = new WatermarkTextParams();
            textParams.Text = "CONFIDENTIAL";

            Watermark watermark = new Watermark(doc, textParams, watermarkParams);

            doc.Save(SaveFlags.Full, "watermarked.pdf");
            doc.Dispose();
        }
    }
}
// Adobe PDF Library SDK
using Datalogics.PDFL;
using System;

class AdobeAddWatermark
{
    static void Main()
    {
        using (Library lib = new Library())
        {
            Document doc = new Document("input.pdf");

            // Create watermark with complex API
            WatermarkParams watermarkParams = new WatermarkParams();
            watermarkParams.Opacity = 0.5;
            watermarkParams.Rotation = 45.0;
            watermarkParams.VerticalAlignment = WatermarkVerticalAlignment.Center;
            watermarkParams.HorizontalAlignment = WatermarkHorizontalAlignment.Center;

            WatermarkTextParams textParams = new WatermarkTextParams();
            textParams.Text = "CONFIDENTIAL";

            Watermark watermark = new Watermark(doc, textParams, watermarkParams);

            doc.Save(SaveFlags.Full, "watermarked.pdf");
            doc.Dispose();
        }
    }
}
$vbLabelText   $csharpLabel

IronPDF實現:

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

class IronPdfAddWatermark
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        // Apply text watermark with simple API
        pdf.ApplyWatermark("<h1 style='color:red; opacity:0.5;'>CONFIDENTIAL</h1>",
            rotation: 45,
            verticalAlignment: VerticalAlignment.Middle,
            horizontalAlignment: HorizontalAlignment.Center);

        pdf.SaveAs("watermarked.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
using System;

class IronPdfAddWatermark
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        // Apply text watermark with simple API
        pdf.ApplyWatermark("<h1 style='color:red; opacity:0.5;'>CONFIDENTIAL</h1>",
            rotation: 45,
            verticalAlignment: VerticalAlignment.Middle,
            horizontalAlignment: HorizontalAlignment.Center);

        pdf.SaveAs("watermarked.pdf");
    }
}
$vbLabelText   $csharpLabel

IronPDF 基於 HTML 的浮水印功能透過 CSS 樣式提供完全的設計控制,無需單獨的參數物件。

密碼保護和加密

Adobe PDF 函式庫 SDK 實作:

using Datalogics.PDFL;

public void ProtectPdf(string inputPath, string outputPath, string password)
{
    Library.Initialize();
    try
    {
        using (Document doc = new Document(inputPath))
        {
            PermissionFlags permissions =
                PermissionFlags.PrintDoc |
                PermissionFlags.PrintFidelity;

            EncryptionHandler encHandler = new EncryptionHandler(
                password,      // User password
                password,      // Owner password
                permissions,
                EncryptionMethod.AES256);

            doc.SetEncryptionHandler(encHandler);
            doc.Save(SaveFlags.Full | SaveFlags.Encrypted, outputPath);
        }
    }
    finally
    {
        Library.Terminate();
    }
}
using Datalogics.PDFL;

public void ProtectPdf(string inputPath, string outputPath, string password)
{
    Library.Initialize();
    try
    {
        using (Document doc = new Document(inputPath))
        {
            PermissionFlags permissions =
                PermissionFlags.PrintDoc |
                PermissionFlags.PrintFidelity;

            EncryptionHandler encHandler = new EncryptionHandler(
                password,      // User password
                password,      // Owner password
                permissions,
                EncryptionMethod.AES256);

            doc.SetEncryptionHandler(encHandler);
            doc.Save(SaveFlags.Full | SaveFlags.Encrypted, outputPath);
        }
    }
    finally
    {
        Library.Terminate();
    }
}
$vbLabelText   $csharpLabel

IronPDF實現:

using IronPdf;

public void ProtectPdf(string inputPath, string outputPath, string password)
{
    using var pdf = PdfDocument.FromFile(inputPath);

    pdf.SecuritySettings.UserPassword = password;
    pdf.SecuritySettings.OwnerPassword = 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.UserPassword = password;
    pdf.SecuritySettings.OwnerPassword = password;
    pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
    pdf.SecuritySettings.AllowUserCopyPasteContent = false;
    pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;

    pdf.SaveAs(outputPath);
}
$vbLabelText   $csharpLabel

IronPDF 使用強類型屬性而不是按位權限標誌和加密處理程序物件。

文字擷取

Adobe PDF 函式庫 SDK 實作:

using Datalogics.PDFL;

public string ExtractText(string pdfPath)
{
    string extractedText = "";

    Library.Initialize();
    try
    {
        using (Document doc = new Document(pdfPath))
        {
            WordFinderConfig config = new WordFinderConfig();
            config.IgnoreCharGaps = true;

            for (int i = 0; i < doc.NumPages; i++)
            {
                using (WordFinder wordFinder = new WordFinder(doc, i, config))
                {
                    IList<Word> words = wordFinder.GetWordList();
                    foreach (Word word in words)
                    {
                        extractedText += word.Text + " ";
                    }
                    extractedText += "\n";
                }
            }
        }
    }
    finally
    {
        Library.Terminate();
    }

    return extractedText;
}
using Datalogics.PDFL;

public string ExtractText(string pdfPath)
{
    string extractedText = "";

    Library.Initialize();
    try
    {
        using (Document doc = new Document(pdfPath))
        {
            WordFinderConfig config = new WordFinderConfig();
            config.IgnoreCharGaps = true;

            for (int i = 0; i < doc.NumPages; i++)
            {
                using (WordFinder wordFinder = new WordFinder(doc, i, config))
                {
                    IList<Word> words = wordFinder.GetWordList();
                    foreach (Word word in words)
                    {
                        extractedText += word.Text + " ";
                    }
                    extractedText += "\n";
                }
            }
        }
    }
    finally
    {
        Library.Terminate();
    }

    return extractedText;
}
$vbLabelText   $csharpLabel

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();
}
$vbLabelText   $csharpLabel

Adobe 的逐字迭代方式,透過 IronPDF 變成了單一方法呼叫。

頁首和頁尾

Adobe PDF 函式庫 SDK 實作:

using Datalogics.PDFL;

public void AddHeaderFooter(string inputPath, string outputPath)
{
    Library.Initialize();
    try
    {
        using (Document doc = new Document(inputPath))
        {
            Font font = new Font("Helvetica", FontCreateFlags.None);

            for (int i = 0; i < doc.NumPages; i++)
            {
                using (Page page = doc.GetPage(i))
                {
                    Content content = page.Content;

                    // Add header
                    Text header = new Text();
                    header.AddRun(new TextRun("Document Header",
                        font, 10, new Point(72, page.MediaBox.Top - 36)));
                    content.AddElement(header);

                    // Add footer with page number
                    Text footer = new Text();
                    footer.AddRun(new TextRun($"Page {i + 1} of {doc.NumPages}",
                        font, 10, new Point(72, 36)));
                    content.AddElement(footer);

                    page.UpdateContent();
                }
            }
            doc.Save(SaveFlags.Full, outputPath);
        }
    }
    finally
    {
        Library.Terminate();
    }
}
using Datalogics.PDFL;

public void AddHeaderFooter(string inputPath, string outputPath)
{
    Library.Initialize();
    try
    {
        using (Document doc = new Document(inputPath))
        {
            Font font = new Font("Helvetica", FontCreateFlags.None);

            for (int i = 0; i < doc.NumPages; i++)
            {
                using (Page page = doc.GetPage(i))
                {
                    Content content = page.Content;

                    // Add header
                    Text header = new Text();
                    header.AddRun(new TextRun("Document Header",
                        font, 10, new Point(72, page.MediaBox.Top - 36)));
                    content.AddElement(header);

                    // Add footer with page number
                    Text footer = new Text();
                    footer.AddRun(new TextRun($"Page {i + 1} of {doc.NumPages}",
                        font, 10, new Point(72, 36)));
                    content.AddElement(footer);

                    page.UpdateContent();
                }
            }
            doc.Save(SaveFlags.Full, outputPath);
        }
    }
    finally
    {
        Library.Terminate();
    }
}
$vbLabelText   $csharpLabel

IronPDF實現:

using IronPdf;

public void CreatePdfWithHeaderFooter(string html, string outputPath)
{
    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "Document Header",
        FontSize = 10,
        FontFamily = "Helvetica"
    };

    renderer.RenderingOptions.TextFooter = new TextHeaderFooter
    {
        CenterText = "Page {page} of {total-pages}",
        FontSize = 10,
        FontFamily = "Helvetica"
    };

    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 = "Document Header",
        FontSize = 10,
        FontFamily = "Helvetica"
    };

    renderer.RenderingOptions.TextFooter = new TextHeaderFooter
    {
        CenterText = "Page {page} of {total-pages}",
        FontSize = 10,
        FontFamily = "Helvetica"
    };

    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs(outputPath);
}
$vbLabelText   $csharpLabel

IronPDF 可自動處理頁面迭代,並支援{page}{total-pages}等佔位符標記。 有關更進階的佈局,請參閱頁首和頁尾文件

URL 轉 PDF

Adobe PDF Library SDK 缺少內建的 URL 渲染功能。 IronPDF 提供原生支援:

using IronPdf;

public void ConvertUrlToPdf(string url, string outputPath)
{
    var renderer = new ChromePdfRenderer();
    using var pdf = renderer.RenderUrlAsPdf(url);
    pdf.SaveAs(outputPath);
}
using IronPdf;

public void ConvertUrlToPdf(string url, string outputPath)
{
    var renderer = new ChromePdfRenderer();
    using var pdf = renderer.RenderUrlAsPdf(url);
    pdf.SaveAs(outputPath);
}
$vbLabelText   $csharpLabel

有關完整的 URL 轉換選項,請參閱URL 轉 PDF 文件

ASP.NET Core 集成

Adobe PDF Library SDK 的靜態初始化模式與依賴注入之間存在摩擦。 IronPDF 可以與現代 .NET 架構自然整合。

Adobe Pattern(DI 有問題):

public class AdobePdfService
{
    public byte[] Generate(string content)
    {
        Library.Initialize();
        try
        {
            // 複雜文件 construction...
            return bytes;
        }
        finally
        {
            Library.Terminate();
        }
    }
}
public class AdobePdfService
{
    public byte[] Generate(string content)
    {
        Library.Initialize();
        try
        {
            // 複雜文件 construction...
            return bytes;
        }
        finally
        {
            Library.Terminate();
        }
    }
}
$vbLabelText   $csharpLabel

IronPDF 圖案(DI 友善):

public interface IPdfService
{
    Task<byte[]> GeneratePdfAsync(string html);
}

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;
    }
}

// Register in Program.cs (.NET 6+):
builder.Services.AddSingleton<IPdfService, IronPdfService>();
public interface IPdfService
{
    Task<byte[]> GeneratePdfAsync(string html);
}

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;
    }
}

// Register in Program.cs (.NET 6+):
builder.Services.AddSingleton<IPdfService, IronPdfService>();
$vbLabelText   $csharpLabel

非同步支援

Adobe PDF Library SDK 不支援非同步操作。 IronPDF 提供完整的非同步/等待功能,這對於可擴展的 Web 應用程式至關重要:

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");
}
$vbLabelText   $csharpLabel

效能最佳化

記憶體使用比較

設想 Adobe PDF 函式庫 SDK IronPDF 筆記
簡易PDF 約100 MB 約 50 MB Adobe 載入完整引擎
複雜文件 約200 MB 約 80 MB IronPDF 更有效率
批量(100 個 PDF 文件) 高(原生記憶) 約100 MB IronPDF 管理得更好

優化技巧

重用渲染器實例:

// Good: Reuse renderer for batch operations
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs($"output_{i}.pdf");
}
// Good: Reuse renderer for batch operations
var renderer = new ChromePdfRenderer();
foreach (var html in htmlList)
{
    using var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs($"output_{i}.pdf");
}
$vbLabelText   $csharpLabel

在 Web 應用程式中使用非同步:

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");
}
$vbLabelText   $csharpLabel

解決常見遷移問題

問題:基於座標的定位不起作用

Adobe 使用 PostScript 點座標。 IronPDF 使用 CSS 定位:

// Adobe: Point-based
new TextRun("Hello", font, 12, new Point(100, 700));

// IronPDF: CSS-based
string html = "<p style='position:absolute; left:100px; top:92px;'>Hello</p>";
// Adobe: Point-based
new TextRun("Hello", font, 12, new Point(100, 700));

// IronPDF: CSS-based
string html = "<p style='position:absolute; left:100px; top:92px;'>Hello</p>";
$vbLabelText   $csharpLabel

問題:頁面尺寸差異

Adobe 使用 PostScript 點。 IronPDF 使用枚舉或自訂維度:

// Adobe: Points
Rect(0, 0, 612, 792) // Letter

// IronPDF: Enum or custom
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
// Or custom:
renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11);
// Adobe: Points
Rect(0, 0, 612, 792) // Letter

// IronPDF: Enum or custom
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
// Or custom:
renderer.RenderingOptions.SetCustomPaperSizeInInches(8.5, 11);
$vbLabelText   $csharpLabel

問題:找不到字體

Adobe 要求手動嵌入字體。 IronPDF 可自動處理字型:

// IronPDF: Use web fonts if needed
string html = @"
<style>
    @import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
    body { font-family: 'Roboto', sans-serif; }
</style>";
// IronPDF: Use web fonts if needed
string html = @"
<style>
    @import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
    body { font-family: 'Roboto', sans-serif; }
</style>";
$vbLabelText   $csharpLabel

問題:SaveFlags 不可用

Adobe 使用儲存標誌組合。 IronPDF 使用直接儲存:

// Adobe
doc.Save(SaveFlags.Full | SaveFlags.Incremental, path);

// IronPDF - full save is default
pdf.SaveAs(path);
// Adobe
doc.Save(SaveFlags.Full | SaveFlags.Incremental, path);

// IronPDF - full save is default
pdf.SaveAs(path);
$vbLabelText   $csharpLabel

遷移後檢查清單

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

  • 運行所有現有的單元測試和整合測試
  • 將 PDF 輸出結果與先前的版本進行直觀比較
  • 在測試環境中測試所有 PDF 工作流程
  • 驗證許可證是否正常運作( IronPdf.License.IsLicensed
  • 與先前實現的性能基準測試
  • 移除 Adobe 許可配置
  • 更新 CI/CD 管線依賴項
  • 從專案中移除所有 Adobe PDF 庫 DLL 文件
  • 為您的開發團隊記錄新的模式

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

隨著 .NET 10 的臨近和 C# 14 引入新的語言特性,選擇一個正在積極開發的 .NET PDF 庫可以確保與不斷發展的運行時功能相容。 IronPDF 致力於支援最新的 .NET 版本,這意味著隨著專案擴展到 2025 年和 2026 年,您的遷移投資將獲得回報。

其他資源

IronPDF 文件


從 Adobe PDF 函式庫 SDK 遷移到 IronPDF 可以顯著簡化您的 PDF 產生程式碼庫,同時大幅降低授權成本。 從底層頁面建置到 HTML/CSS 渲染的轉變,省去了數百行座標計算、字體管理和生命週期處理程式碼。 對於建立現代 .NET 應用程式的團隊而言,IronPDF 提供同等的功能,並具有專為現代開發工作流程設計的對開發人員友好的 API。

Curtis Chau
技術撰稿人

Curtis Chau 擁有電腦科學學士學位(卡爾頓大學),專長於前端開發,精通 Node.js、TypeScript、JavaScript 和 React。Curtis 對製作直覺且美觀的使用者介面充滿熱情,他喜歡使用現代化的架構,並製作結構良好且視覺上吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 也有濃厚的興趣,他喜歡探索整合硬體與軟體的創新方式。在空閒時間,他喜歡玩遊戲和建立 Discord bots,將他對技術的熱愛與創意結合。