跳至页脚内容
迁移指南

如何在 C# 中从 GdPicture.NET SDK 迁移到 IronPDF

从GdPicture.NET SDK迁移到 IronPDF:完整的 C# 迁移指南

从GdPicture.NET SDK迁移到IronPDF可为 .NET 开发人员提供一种专注、精简的 PDF 生成方法。 本指南提供了一个全面、循序渐进的迁移路径,用专为当代 .NET 开发设计的现代 PDF 专用 API 取代了复杂的文档成像 SDK 模式。

为什么要从GdPicture.NET SDK迁移到 IronPDF.

GdPicture.NET SDK面临的挑战

GdPicture.NET SDK(现已更名为 Nutrient)是一个全面的文档成像 SDK,在 PDF 开发中面临着一些挑战:

1.Overkill for PDF-Only Projects:GdPicture.NET SDK 是一个完整的文档成像套件,包括 OCR、条形码识别、扫描和图像处理。 如果您只需要 PDF 功能,那么您就需要为您永远用不上的功能付费。

2.复杂许可:多个产品层级(GdPicture.NET 14、GdPicture.API、Ultimate、Professional),具有混乱的 SKU 组合和年度订阅要求。

3.企业定价:仅 PDF 插件的许可费用就从 2,999 美元起,终极版的许可费用则高达 10,000 美元以上。 按开发人员发放 License 会给不断壮大的团队增加大量开销。

4.学习曲线陡峭:API 是围绕文档成像概念而非现代 .NET 模式设计的。 与当代 C# 惯例相比,LicenseManager.RegisterKEY()GdPictureStatus 枚举检查和1-索引页面等方法感觉过时了。

5.状态代码模式:每个操作都会返回一个<代码>GdPictureStatus</代码枚举,必须对该枚举进行检查--错误时不会抛出异常,这使得错误处理变得冗长而重复。

6.手动资源管理:需要显式调用 Dispose()Release() 。 SDK 并不完全遵循标准的 .NET 处置模式。

7.版本锁定:命名空间<代码>GdPicture14</代码包含版本号,因此重大版本升级需要在整个代码库中更改命名空间。

8.品牌重塑混淆:最近重塑为 "Nutrient "后,gdpicture.com 和 nutrient.io 之间的文档变得支离破碎,使支持和学习变得复杂。

GdPicture.NET SDK与IronPDFfor .NET 对比。

方面GdPicture.NET SDKIronPDF
翻译重点文档成像套件(PDF 过犹不及)PDF 专用库
定价2,999 美元-10,000 美元以上企业级具有竞争力,与业务相匹配
API 风格状态代码、人工管理异常、IDisposable、现代 .NET
学习曲线Steep(图像 SDK 概念)简单(熟悉 HTML/CSS)
HTML 渲染基本的内部引擎带有 CSS3/JS 的最新 Chromium
页面索引1-索引0 索引(标准 .NET Standard)
线程安全需要手动同步线程安全设计
名称空间特定版本 (GdPicture14)稳定 (IronPdf)

对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队来说,IronPDF 提供了一个面向未来的基础,与现代 .NET 模式和惯例保持一致。


迁移复杂性评估

按功能估算的工作量

特征迁移复杂性备注
HTML 至 PDF直接方法映射
URL 至 PDF直接方法映射
合并 PDF类似的 API 模式
拆分 PDF类似的 API 模式
水印不同的方法(基于 HTML)
文本提取属性与方法
密码保护语言不同的参数结构
表格字段语言API 差异
数字签名中高级不同的证书处理
OCR高的IronOCR 是独立的产品
条形码识别不适用不支持 IronPDF

迁移决策矩阵

您的情况建议
纯 PDF 操作迁移--显著简化并节约成本
大量使用 OCR考虑将 IronOCR 作为配套产品
条形码/扫描需求这些功能请保留 GdPicture.NET SDK,PDF 请使用 IronPDF
完整的文档成像评估您是否实际使用了所有功能

开始之前

前提条件

1..NET版本:IronPDF 支持 .NET Framework 4.6.2+ 和 .NET Core 2.0+ / .NET 5/6/7/8/9+ 。 2.许可证密钥:从 ironpdf.com 获取IronPDF许可证密钥。 3.备份:为迁移工作创建分支

明确GdPicture.NET SDK的所有用法

# Find allGdPicture.NET SDKreferences in your codebase
grep -r "GdPicture14\|GdPicturePDF\|GdPictureDocumentConverter\|GdPictureStatus\|LicenseManager\.RegisterKEY" --include="*.cs" .

# Find all GdPicture package references
grep -r "GdPicture" --include="*.csproj" .
# Find allGdPicture.NET SDKreferences in your codebase
grep -r "GdPicture14\|GdPicturePDF\|GdPictureDocumentConverter\|GdPictureStatus\|LicenseManager\.RegisterKEY" --include="*.cs" .

# Find all GdPicture package references
grep -r "GdPicture" --include="*.csproj" .
SHELL

NuGet 软件包变更

# RemoveGdPicture.NET SDKpackages
dotnet remove package GdPicture.NET.14
dotnet remove package GdPicture.NET.14.API
dotnet remove package GdPicture
dotnet remove package GdPicture.API

# Install IronPDF
dotnet add package IronPdf
# RemoveGdPicture.NET SDKpackages
dotnet remove package GdPicture.NET.14
dotnet remove package GdPicture.NET.14.API
dotnet remove package GdPicture
dotnet remove package GdPicture.API

# Install IronPDF
dotnet add package IronPdf
SHELL

快速启动迁移

步骤 1:更新许可配置

之前(GdPicture.NET SDK):

// Must be called before anyGdPicture.NET SDKoperations
LicenseManager.RegisterKEY("YOUR-GDPICTURE-LICENSE-KEY");
// Must be called before anyGdPicture.NET SDKoperations
LicenseManager.RegisterKEY("YOUR-GDPICTURE-LICENSE-KEY");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";

// Or in appsettings.json:
// { "IronPdf.License.LicenseKey": "YOUR-LICENSE-KEY" }
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";

// Or in appsettings.json:
// { "IronPdf.License.LicenseKey": "YOUR-LICENSE-KEY" }
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

步骤 2:更新名称空间导入

// Before (GdPicture.NET SDK)
using GdPicture14;

// After (IronPDF)
using IronPdf;
using IronPdf.Editing;
// Before (GdPicture.NET SDK)
using GdPicture14;

// After (IronPDF)
using IronPdf;
using IronPdf.Editing;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

步骤 3:基本转换模式

GdPicture.NET SDK 移植中最重要的变化是取消了冗长的状态检查模式:

之前(GdPicture.NET SDK):

using GdPicture14;

LicenseManager.RegisterKEY("LICENSE-KEY");

using (GdPictureDocumentConverter converter = new GdPictureDocumentConverter())
{
    GdPictureStatus status = converter.LoadFromHTMLString("<h1>Hello World</h1>");

    if (status == GdPictureStatus.OK)
    {
        status = converter.SaveAsPDF("output.pdf");

        if (status != GdPictureStatus.OK)
        {
            Console.WriteLine($"Error: {status}");
        }
    }
    else
    {
        Console.WriteLine($"Load error: {status}");
    }
}
using GdPicture14;

LicenseManager.RegisterKEY("LICENSE-KEY");

using (GdPictureDocumentConverter converter = new GdPictureDocumentConverter())
{
    GdPictureStatus status = converter.LoadFromHTMLString("<h1>Hello World</h1>");

    if (status == GdPictureStatus.OK)
    {
        status = converter.SaveAsPDF("output.pdf");

        if (status != GdPictureStatus.OK)
        {
            Console.WriteLine($"Error: {status}");
        }
    }
    else
    {
        Console.WriteLine($"Load error: {status}");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

using IronPdf;

IronPdf.License.LicenseKey = "LICENSE-KEY";

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");
using IronPdf;

IronPdf.License.LicenseKey = "LICENSE-KEY";

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

关键差异:

  • 无状态检查-错误时出现例外情况
  • 无需对呈现器进行明确处理
  • 现代流畅的 API
  • 基于 Chromium 的渲染,更好地支持 HTML/CSS

完整的 API 参考

命名空间映射

GdPicture.NET SDKIronPDF
<代码>GdPicture14</代码<代码>IronPdf</代码
<代码>GdPicture14.PDF</代码<代码>IronPdf</代码
<代码>GdPicture14.Imaging</代码不适用(不需要)

核心类映射

GdPicture.NET SDKIronPDF说明
<代码>GdPicturePDF</代码<代码>PDF 文档</代码主要 PDF 文档类别
<代码>GdPictureDocumentConverter</代码<代码>ChromePdfRenderer</代码HTML/URL 到 PDF 的转换
<代码>LicenseManager</代码<代码>IronPdf.License</代码许可证管理
<代码>GdPictureStatus</代码例外情况错误处理

文档加载方法

GdPicture.NET SDKIronPDF备注
<代码>pdf.LoadFromFile(path,loadInMemory)</代码<代码>PdfDocument.FromFile(路径)</代码从文件加载
<代码>pdf.LoadFromFile(路径,密码,loadInMemory)</代码<代码>PdfDocument.FromFile(路径, 密码)</代码密码保护
<代码>converter.LoadFromHTMLString(html)</代码<代码>renderer.RenderHtmlAsPdf(html)</代码HTML 字符串
<代码>converter.LoadFromURL(url)</代码<代码>renderer.RenderUrlAsPdf(url)</代码网址

页面操作

GdPicture.NET SDKIronPDF备注
<代码>pdf.GetPageCount()</代码<代码>pdf.PageCount</代码获取页数
<代码>pdf.SelectPage(pageNo)</代码<代码>pdf.Pages[index]</代码选择页面(1-索引对比 0-索引)
<代码>pdf.GetPageWidth()</代码<代码>pdf.Pages[i].Width</代码页面宽度
<代码>pdf.GetPageHeight()</代码<代码>pdf.Pages[i].Height</代码页面高度

合并和拆分操作

GdPicture.NET SDKIronPDF备注
<代码>pdf1.MergePages(pdf2)</代码<代码>PdfDocument.Merge(pdf1, pdf2)</ 代码Merge PDFs
<代码>pdf.ExtractPages(start, end)</ 代码<代码>pdf.CopyPages(indices)</代码提取页面

水印操作

GdPicture.NET SDKIronPDF备注
<代码>pdf.DrawText(...)</代码>循环<代码>pdf.ApplyWatermark(html)</代码文本水印
<代码>pdf.SetTextColor(color)</代码CSS 定型设置文本颜色
<代码>pdf.SetTextSize(size)</代码CSS 定型设置文字大小

代码迁移示例

示例 1:HTML 到 PDF 的转换

之前(GdPicture.NET SDK):

// NuGet: Install-Package GdPicture.NET
using GdPicture14;
using System;

class Program
{
    static void Main()
    {
        using (GdPictureDocumentConverter converter = new GdPictureDocumentConverter())
        {
            string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
            GdPictureStatus status = converter.LoadFromHTMLString(htmlContent);

            if (status == GdPictureStatus.OK)
            {
                converter.SaveAsPDF("output.pdf");
            }
        }
    }
}
// NuGet: Install-Package GdPicture.NET
using GdPicture14;
using System;

class Program
{
    static void Main()
    {
        using (GdPictureDocumentConverter converter = new GdPictureDocumentConverter())
        {
            string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
            GdPictureStatus status = converter.LoadFromHTMLString(htmlContent);

            if (status == GdPictureStatus.OK)
            {
                converter.SaveAsPDF("output.pdf");
            }
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (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");
    }
}
// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPdf 的<代码>ChromePdfRenderer</代码使用现代 Chromium 引擎进行精确的 HTML/CSS 渲染,无需状态代码检查。 有关更多 HTML 渲染选项,请参阅 HTML to PDF 文档

示例 2:合并多个 PDF 文件

之前(GdPicture.NET SDK):

// NuGet: Install-Package GdPicture.NET
using GdPicture14;
using System;

class Program
{
    static void Main()
    {
        using (GdPicturePDF pdf1 = new GdPicturePDF())
        using (GdPicturePDF pdf2 = new GdPicturePDF())
        {
            pdf1.LoadFromFile("document1.pdf", false);
            pdf2.LoadFromFile("document2.pdf", false);

            pdf1.MergePages(pdf2);
            pdf1.SaveToFile("merged.pdf");
        }
    }
}
// NuGet: Install-Package GdPicture.NET
using GdPicture14;
using System;

class Program
{
    static void Main()
    {
        using (GdPicturePDF pdf1 = new GdPicturePDF())
        using (GdPicturePDF pdf2 = new GdPicturePDF())
        {
            pdf1.LoadFromFile("document1.pdf", false);
            pdf2.LoadFromFile("document2.pdf", false);

            pdf1.MergePages(pdf2);
            pdf1.SaveToFile("merged.pdf");
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
        merged.SaveAs("merged.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
        merged.SaveAs("merged.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPdf 的静态 Merge 方法可接受文档列表,从而可在一次操作中轻松合并多个 PDF。 了解有关 合并和拆分 PDF 的更多信息。

示例 3:为所有页面添加水印

之前(GdPicture.NET SDK):

// NuGet: Install-Package GdPicture.NET
using GdPicture14;
using System;
using System.Drawing;

class Program
{
    static void Main()
    {
        using (GdPicturePDF pdf = new GdPicturePDF())
        {
            pdf.LoadFromFile("input.pdf", false);

            for (int i = 1; i <= pdf.GetPageCount(); i++)
            {
                pdf.SelectPage(i);
                pdf.SetTextColor(Color.Red);
                pdf.SetTextSize(48);
                pdf.DrawText("CONFIDENTIAL", 200, 400);
            }

            pdf.SaveToFile("watermarked.pdf");
        }
    }
}
// NuGet: Install-Package GdPicture.NET
using GdPicture14;
using System;
using System.Drawing;

class Program
{
    static void Main()
    {
        using (GdPicturePDF pdf = new GdPicturePDF())
        {
            pdf.LoadFromFile("input.pdf", false);

            for (int i = 1; i <= pdf.GetPageCount(); i++)
            {
                pdf.SelectPage(i);
                pdf.SetTextColor(Color.Red);
                pdf.SetTextSize(48);
                pdf.DrawText("CONFIDENTIAL", 200, 400);
            }

            pdf.SaveToFile("watermarked.pdf");
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

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

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

        pdf.ApplyWatermark("<h1 style='color:red;'>CONFIDENTIAL</h1>", 50, VerticalAlignment.Middle, HorizontalAlignment.Center);

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

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

        pdf.ApplyWatermark("<h1 style='color:red;'>CONFIDENTIAL</h1>", 50, VerticalAlignment.Middle, HorizontalAlignment.Center);

        pdf.SaveAs("watermarked.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

GdPicture.NET SDK 从基于坐标的文本绘制迁移到基于 HTML 的水印,大大简化了代码。 IronPdf 的 ApplyWatermark 方法使用 HTML/CSS 风格,无需手动进行页面迭代和坐标计算。 有关其他选项,请参阅完整的 watermarking 文档

示例 4:密码保护和安全性

之前(GdPicture.NET SDK):

using GdPicture14;

class Program
{
    static void Main()
    {
        LicenseManager.RegisterKEY("LICENSE-KEY");

        using (GdPicturePDF pdf = new GdPicturePDF())
        {
            GdPictureStatus status = pdf.LoadFromFile("document.pdf", false);

            if (status != GdPictureStatus.OK) return;

            // Save with encryption - many boolean parameters
            status = pdf.SaveToFile(
                "protected.pdf",
                PdfEncryption.PdfEncryption256BitAES,
                "user123",      // User password
                "owner456",     // Owner password
                true,           // Can print
                false,          // Cannot copy
                false,          // Cannot modify
                false,          // Cannot add notes
                true,           // Can fill forms
                false,          // Cannot extract
                false,          // Cannot assemble
                true            // Can print high quality
            );
        }
    }
}
using GdPicture14;

class Program
{
    static void Main()
    {
        LicenseManager.RegisterKEY("LICENSE-KEY");

        using (GdPicturePDF pdf = new GdPicturePDF())
        {
            GdPictureStatus status = pdf.LoadFromFile("document.pdf", false);

            if (status != GdPictureStatus.OK) return;

            // Save with encryption - many boolean parameters
            status = pdf.SaveToFile(
                "protected.pdf",
                PdfEncryption.PdfEncryption256BitAES,
                "user123",      // User password
                "owner456",     // Owner password
                true,           // Can print
                false,          // Cannot copy
                false,          // Cannot modify
                false,          // Cannot add notes
                true,           // Can fill forms
                false,          // Cannot extract
                false,          // Cannot assemble
                true            // Can print high quality
            );
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

using IronPdf;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("document.pdf");

        // Configure security settings with clear property names
        pdf.SecuritySettings.OwnerPassword = "owner456";
        pdf.SecuritySettings.UserPassword = "user123";

        // Set permissions
        pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
        pdf.SecuritySettings.AllowUserCopyPasteContent = false;
        pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
        pdf.SecuritySettings.AllowUserAnnotations = false;
        pdf.SecuritySettings.AllowUserFormData = true;

        pdf.SaveAs("protected.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("document.pdf");

        // Configure security settings with clear property names
        pdf.SecuritySettings.OwnerPassword = "owner456";
        pdf.SecuritySettings.UserPassword = "user123";

        // Set permissions
        pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
        pdf.SecuritySettings.AllowUserCopyPasteContent = false;
        pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;
        pdf.SecuritySettings.AllowUserAnnotations = false;
        pdf.SecuritySettings.AllowUserFormData = true;

        pdf.SaveAs("protected.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

IronPdf 的 SecuritySettings 属性提供了命名的、自文档化的属性,而不是位置布尔参数。


关键迁移说明

页面索引转换

此次GdPicture.NET SDK迁移中最重要的变化之一是页面索引的不同:

// GdPicture.NET SDK:1-索引pages
for (int i = 1; i <= pdf.GetPageCount(); i++)
{
    pdf.SelectPage(i);
    // process page
}

// IronPDF: 0-indexed pages (standard .NET)
for (int i = 0; i < pdf.PageCount; i++)
{
    var page = pdf.Pages[i];
    // process page
}
// GdPicture.NET SDK:1-索引pages
for (int i = 1; i <= pdf.GetPageCount(); i++)
{
    pdf.SelectPage(i);
    // process page
}

// IronPDF: 0-indexed pages (standard .NET)
for (int i = 0; i < pdf.PageCount; i++)
{
    var page = pdf.Pages[i];
    // process page
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

状态代码到异常

用标准的 try-catch 代替冗长的状态检查:

// GdPicture.NET SDK
GdPictureStatus status = converter.LoadFromHTMLString(html);
if (status != GdPictureStatus.OK)
{
    Console.WriteLine($"Error: {status}");
    return;
}

// IronPDF
try
{
    var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs("output.pdf");
}
catch (Exception ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}
// GdPicture.NET SDK
GdPictureStatus status = converter.LoadFromHTMLString(html);
if (status != GdPictureStatus.OK)
{
    Console.WriteLine($"Error: {status}");
    return;
}

// IronPDF
try
{
    var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs("output.pdf");
}
catch (Exception ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

单位转换

GdPicture.NET SDK 使用英寸表示页边距; IronPdf 使用毫米:

// GdPicture.NET SDK: 0.5 inches margin
converter.HtmlSetMargins(0.5f, 0.5f, 0.5f, 0.5f);

// IronPDF: 0.5 inches = 12.7 mm
renderer.RenderingOptions.MarginTop = 12.7;
renderer.RenderingOptions.MarginBottom = 12.7;
renderer.RenderingOptions.MarginLeft = 12.7;
renderer.RenderingOptions.MarginRight = 12.7;
// GdPicture.NET SDK: 0.5 inches margin
converter.HtmlSetMargins(0.5f, 0.5f, 0.5f, 0.5f);

// IronPDF: 0.5 inches = 12.7 mm
renderer.RenderingOptions.MarginTop = 12.7;
renderer.RenderingOptions.MarginBottom = 12.7;
renderer.RenderingOptions.MarginLeft = 12.7;
renderer.RenderingOptions.MarginRight = 12.7;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

换算公式:<代码>毫米 = 英寸 × 25.4</ 代码

线程安全

GdPicture.NET SDK 需要对并发操作进行手动同步。IronPDF的<代码>ChromePdfRenderer</代码是线程安全设计,可简化多线程 PDF 生成。


性能考虑

重用 ChromePdfRenderer。

为获得最佳性能,请重复使用呈现器实例:

// GOOD - Reuse renderer (thread-safe)
public class PdfService
{
    private static readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();

    public byte[] Generate(string html) => _renderer.RenderHtmlAsPdf(html).BinaryData;
}

// BAD - Creates new instance each time
public byte[] GenerateBad(string html)
{
    var renderer = new ChromePdfRenderer();  // Wasteful
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}
// GOOD - Reuse renderer (thread-safe)
public class PdfService
{
    private static readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();

    public byte[] Generate(string html) => _renderer.RenderHtmlAsPdf(html).BinaryData;
}

// BAD - Creates new instance each time
public byte[] GenerateBad(string html)
{
    var renderer = new ChromePdfRenderer();  // Wasteful
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

正确的资源处置

// Use using statements for automatic cleanup
using (var pdf = PdfDocument.FromFile("large.pdf"))
{
    string text = pdf.ExtractAllText();
}  // pdf is disposed automatically
// Use using statements for automatic cleanup
using (var pdf = PdfDocument.FromFile("large.pdf"))
{
    string text = pdf.ExtractAllText();
}  // pdf is disposed automatically
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

迁移清单

迁移前

  • [ ] 清点代码库中所有GdPicture.NET SDK的使用情况
  • [ ] 确定实际使用了哪些功能(PDF vsOCRvs BarCode)
  • [ ] 确定是否需要 OCR/条形码功能(考虑 IronOCR/IronBarcode)
  • [ ] 审查当前许可并与 IronPdf 定价进行比较
  • [ ] 获取 IronPdf 许可证密钥
  • [ ] 在版本控制中创建迁移分支

代码迁移

  • [ ] 删除GdPicture.NET SDKNuGet 软件包:<代码>dotnet 移除 GdPicture.NET 包</代码
  • [ ] 安装 IronPdf NuGet 软件包:<代码>dotnet 添加软件包 IronPdf</ 代码
  • [ ] 更新命名空间导入(<代码>GdPicture14</代码> → <代码>IronPdf</代码)
  • [ ] 将LicenseManager.RegisterKEY()替换为IronPdf.License.LicenseKey
  • [ ] 将状态代码检查转换为 try-catch 块
  • [ ] 更新页面索引(1-索引 → 0-索引)
  • [ ] 将<代码>GdPicturePDF</代码替换为 PdfDocument
  • [ ] 将<代码>GdPictureDocumentConverter</代码替换为 ChromePdfRenderer
  • [ ] 将基于坐标的文本转换为 HTML 标记
  • [ ] 更新单位换算(英寸 → 毫米)

测试

  • [ ] 对所有 PDF 生成路径进行单元测试
  • [ ] 验证 HTML 的渲染质量达到或超过
  • [ ] 测试所有安全/加密场景
  • [ ] 验证表格填写功能
  • [ ] 测试合并/拆分操作
  • [ ] 验证水印外观
  • [ ] 性能基准关键路径

后迁移

  • [ ] 删除GdPicture.NET SDK许可证文件/密钥
  • [ ] 更新文档
  • [ ] 对团队进行 IronPdf API 模式培训
  • [ ] 监控生产过程中的任何问题

结论

当您的重点是生成 PDF 时,从GdPicture.NET SDK迁移到IronPDF可以消除完整文档成像 SDK 的复杂性。 迁移将以简洁的基于异常的错误处理取代冗长的状态检查模式,以标准的 0 索引集合取代 1 索引页面,以直观的 HTML/CSS 风格取代基于坐标的文本绘制。

IronPDF 的专注方法降低了许可成本,同时提供了基于 Chromium 的现代 HTML 渲染、线程安全操作以及不会随版本升级而改变的稳定命名空间。 对于有OCR或条形码需求的团队,配套产品 IronOCR 和 IronBarcode 可提供这些功能,而无需单片式 SDK 的开销。

探索完整的 IronPDF 文档教程API 参考,加快您的GdPicture.NET SDK迁移。

Curtis Chau
技术作家

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

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