跳至页脚内容
迁移指南

如何从 Adobe PDF Library SDK 迁移到 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 库 SDKIronPDF
定价年薪 1 万至 5 万美元以上的企业为每位开发人员提供经济实惠的许可
安装本地 DLL、特定平台简单的 NuGet 软件包</a
文档创建低级页面/内容构建HTML/CSS 渲染
初始化<代码>Library.Initialize()</代码>/<代码>Terminate()</代码>必需自动翻译
坐标系PostScript 点,左下方原点基于 CSS 的布局
字体处理需要手动嵌入自动翻译
内存管理手动处理 COM 对象标准 IDisposable 模式
支持同步不可用完全支持异步/等待

迁移前准备

前提条件

在开始迁移之前,请确保您的环境符合这些要求:

  • .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 库 SDKIronPDF迁移行动
初始化<代码>Library.Initialize()</代码> / <代码>Terminate()</代码自动翻译删除生命周期代码
文件创建new Document() 页面构建<代码>ChromePdfRenderer</代码使用 HTML 渲染
坐标系PostScript 点,左下方原点基于 CSS 的布局使用 HTML/CSS
字体处理手动 Font 创建和嵌入自动翻译删除字体代码
内存管理手动处理 COM 对象标准 IDisposable使用 using 语句
页面构建<代码>创建页面()</代码>, <代码>添加内容()</代码从 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:配置许可证密钥

用IronPDF基于代码的许可密钥取代 Adobe 的许可方式:

// Replace Adobe's Library.LicenseKey withIronPDFlicense
// Add at application startup, before anyIronPDFoperations
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

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

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

步骤 3:更新命名空间引用

在解决方案中执行全局查找和替换:

查找替换为
<代码>使用 Datalogics.PDFL;</代码<代码>使用 IronPdf;</ 代码
<代码>使用 Datalogics.PDFL.Document;</ 代码<代码>使用 IronPdf;</ 代码
<代码>使用 Datalogics.PDFL.Page;</ 代码<代码>使用 IronPdf;</ 代码
<代码>使用 Datalogics.PDFL.Content;</代码<代码>使用 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"</ 代码启动时设置一次
<代码>使用(库 lib = 新库())</代码不需要无需包装

文档创建方法

Adobe 方法IronPdf 方法备注
<代码>new Document()</ 代码<代码>new ChromePdfRenderer()</ 代码HTML 渲染器
<代码>新文档(路径)</代码<代码>PdfDocument.FromFile(路径)</代码加载现有 PDF
<代码>doc.CreatePage(index,rect)</代码从 HTML 自动生成自动创建的页面
<代码>doc.Save(SaveFlags.Full,路径)</代码<代码>pdf.SaveAs(路径)</代码保存到文件
<代码>doc.NumPages</代码<代码>pdf.PageCount</代码页数属性
<代码>doc.GetPage(index)</代码<代码>pdf.Pages[index]</代码访问页面
<代码>doc.InsertPages(...)</代码<代码>PdfDocument.Merge()</代码合并文档

内容创建(重大范式转变)

Adobe PDF Library SDK 需要构建底层内容。 IronPdf 使用 HTML/CSS:

Adobe 方法IronPdf 方法备注
<代码>新文本()</代码使用 HTML <p>, <h1> 等。HTML 标记
<代码>text.AddRun(textRun)</代码使用 HTMLHTML 文本
<代码>new TextRun(文本、字体、大小、点)</代码CSS 定型通过 CSS 创建风格
<代码>new Font(name, flags)</代码CSS font-family通过 CSS 转换字体
<代码>新图像(路径)</代码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(用户、所有者、许可条款)</代码<代码>pdf.SecuritySettings</代码安全配置
<代码>PermissionFlags.PrintDoc</代码<代码>允许用户打印</代码打印许可

文本提取

Adobe 方法IronPdf 方法备注
<代码>新 WordFinder(doc, 配置)</代码<代码>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 模式(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提供可扩展网络应用程序所必需的全部异步/等待功能:

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 库 SDKIronPDF备注
简单 PDF~100 MB~50 MBAdobe 加载全引擎
复杂文档~200 MB~80 MBIronPdf 更高效
批量(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 应用程序中使用 Async:

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 库可以确保与不断发展的运行时功能兼容。IronPDFfor .NET 承诺支持最新的 .NET 版本,这意味着当项目扩展到 2025 年和 2026 年时,您的迁移投资将获得回报。

其他资源


从Adobe PDF 库 SDK迁移到IronPDF可以显著简化您的 PDF 生成代码库,同时大幅降低许可成本。 从底层页面构建到 HTML/CSS 渲染的转变消除了数百行的坐标计算、字体管理和生命周期处理代码。 对于构建现代 .NET 应用程序的团队而言,IronPDF 可提供同等功能,其开发人员友好型 API 专为当代开发工作流程而设计。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。