IRONSOFTWAREHOME
视频

如何使用C#设置和编辑PDF元数据

Curtis Chau
Curtis Chau
Updated: 2026年7月19日

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

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

###GdPicture.NET SDK面临的挑战

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

1.**对于仅处理 PDF 的项目来说有点过头了:**GdPicture.NET SDK是一个完整的文档图像处理套件,包括 OCR、条形码识别、扫描和图像处理。 如果您只需要 PDF 功能,那么您就需要为您永远用不上的功能付费。

2.**复杂的许可:**多个产品级别(GdPicture.NET 14、GdPicture.API、Ultimate、Professional),SKU 组合令人困惑,并且有年度订阅要求。

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

4.**学习曲线陡峭:**该 API 是围绕文档图像概念设计的,而不是现代 .NET 模式。 类似于GdPictureStatus枚举检查以及1为基的页数相比当代C#惯例显得过时。

  1. **状态码模式:**每个操作返回一个GdPictureStatus枚举,必须检查—错误时不抛出异常,使得错误处理冗长且重复。

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

  3. **版本锁定:**命名空间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)

IronPDF与现代.NET模式和惯例一致,使其非常适合当前.NET版本的团队使用。


迁移复杂性评估

按功能估算的工作量

特征迁移复杂性
HTML 至 PDFlow
URL 至 PDFlow
合并 PDFlow
拆分 PDFlow
水印low
文本提取low
密码保护语言
表格字段语言
数字签名中高级
OCR高的
条形码识别不适用

迁移决策矩阵

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

开始之前

前提条件

  1. **.NET版本:**IronPDF支持.NET Framework 4.6.2+和.NET Core 2.0+ / .NET 5+ 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" .
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
SHELL

快速启动迁移

步骤 1:更新许可配置

之前(GdPicture.NET SDK):

// Must be called before anyGdPicture.NET SDKoperations
LicenseManager.RegisterKEY("YOUR-GDPICTURE-LICENSE-KEY");

After (IronPDF):

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

// Or in appsettings.json:
// { "IronPdf.License.LicenseKey": "YOUR-LICENSE-KEY" }

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

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

// After (IronPDF)
using IronPdf;
using IronPdf.Editing;

步骤 3:基本转换模式

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

之前(GdPicture.NET SDK):

using GdPicture14;

LicenseManager.RegisterKEY("YOUR-GDPICTURE-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}");
    }
}

After (IronPDF):

using IronPdf;

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

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

关键差异:

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

完整的 API 参考

命名空间映射

GdPicture.NET SDKIronPDF
GdPicture14IronPdf
GdPicture14.PDFIronPdf
GdPicture14.Imaging不适用(不需要)

核心类映射

GdPicture.NET SDKIronPDF说明
GdPicturePDFPdfDocument主要 PDF 文档类别
GdPictureDocumentConverterChromePdfRendererHTML/URL 到 PDF 的转换
LicenseManagerIronPdf.License许可证管理
GdPictureStatus例外情况错误处理

文档加载方法

GdPicture.NET SDKIronPDF
pdf.LoadFromFile(path, loadInMemory)PdfDocument.FromFile(path)
pdf.LoadFromFile(path, password, loadInMemory)PdfDocument.FromFile(path, password)
converter.LoadFromHTMLString(html)renderer.RenderHtmlAsPdf(html)
converter.LoadFromURL(url)renderer.RenderUrlAsPdf(url)

页面操作

GdPicture.NET SDKIronPDF
pdf.GetPageCount()pdf.PageCount
pdf.SelectPage(pageNo)pdf.Pages[index]
pdf.GetPageWidth()pdf.Pages[i].Width
pdf.GetPageHeight()pdf.Pages[i].Height

合并和拆分操作

GdPicture.NET SDKIronPDF
pdf1.MergePages(pdf2)PdfDocument.Merge(pdf1, pdf2)
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");
            }
        }
    }
}

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

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

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

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

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

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

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

之前(GdPicture.NET SDK):

using GdPicture14;

class Program
{
    static void Main()
    {
        LicenseManager.RegisterKEY("YOUR-GDPICTURE-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
            );
        }
    }
}

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

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
}

状态代码到异常

用标准的 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 使用英寸表示页边距;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;

转换公式:millimeters = inches × 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;
}

正确的资源处置

// Use using statements for automatic cleanup
using (var pdf = PdfDocument.FromFile("large.pdf"))
{
    string text = pdf.ExtractAllText();
}  // pdf is disposed automatically

迁移清单

迁移前

  • 清点代码库中所有GdPicture.NET SDK的使用情况
  • 确定实际使用的功能(PDF、OCR、条形码)
  • 确定是否需要 OCR/条形码功能(考虑使用 IronOCR/IronBarcode)
  • 查看您当前的许可协议,并与IronPDF的定价进行比较。
  • 获取IronPDF许可证密钥
  • 在版本控制系统中创建迁移分支

代码迁移

  • 删除GdPicture.NET SDK NuGet包:dotnet remove package GdPicture.NET
  • 安装IronPDF NuGet包:dotnet add package IronPdf
  • 更新命名空间导入 (GdPicture14IronPdf)
  • LicenseManager.RegisterKEY() 将状态码检查转换为 try-catch 块
  • 更新页面索引(索引为 1 → 索引为 0)
  • GdPicturePDF
  • GdPictureDocumentConverter
  • 将基于坐标的文本转换为 HTML 戳记
  • 更新单位换算(英寸→毫米)

测试

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

后迁移

  • 删除GdPicture.NET SDK许可证文件/密钥
  • 更新文档
  • 培训团队掌握IronPDFAPI 模式
  • 监控生产过程,发现任何问题

请注意: GdPicture.NET和Nutrient是其各自所有者的注册商标。 本站与Nutrient、ORPALIS或PSPDFKit无隶属关系,未经其赞助或支持。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。
Curtis Chau
技术作家

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

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户