如何在 C# 中从 GdPicture.NET SDK 迁移到 IronPDF
从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 模式。 与当代 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 SDK | IronPDF |
|---|---|---|
| 翻译重点 | 文档成像套件(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 | low |
| URL 至 PDF | low |
| 合并 PDF | low |
| 拆分 PDF | low |
| 水印 | low |
| 文本提取 | low |
| 密码保护 | 语言 |
| 表格字段 | 语言 |
| 数字签名 | 中高级 |
| OCR | 高的 |
| 条形码识别 | 不适用 |
迁移决策矩阵
| 您的情况 | 建议 |
|---|---|
| 纯 PDF 操作 | 迁移--显著简化并节约成本 |
| 大量使用 OCR | 考虑将 IronOCR 作为配套产品 |
| 条形码/扫描需求 | 这些功能请保留 GdPicture.NET SDK,PDF 请使用 IronPDF |
| 完整的文档成像 | 评估您是否实际使用了所有功能 |
开始之前
前提条件
- .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" .
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
快速启动迁移
步骤 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");
' Must be called before any GdPicture.NET SDK operations
LicenseManager.RegisterKEY("YOUR-GDPICTURE-LICENSE-KEY")
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" }
' Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-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;
// Before (GdPicture.NET SDK)
using GdPicture14;
// After (IronPDF)
using IronPdf;
using IronPdf.Editing;
Imports IronPdf
Imports IronPdf.Editing
步骤 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}");
}
}
Imports GdPicture14
LicenseManager.RegisterKEY("LICENSE-KEY")
Using converter As New GdPictureDocumentConverter()
Dim status As GdPictureStatus = converter.LoadFromHTMLString("<h1>Hello World</h1>")
If status = GdPictureStatus.OK Then
status = converter.SaveAsPDF("output.pdf")
If status <> GdPictureStatus.OK Then
Console.WriteLine($"Error: {status}")
End If
Else
Console.WriteLine($"Load error: {status}")
End If
End Using
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");
Imports IronPdf
IronPdf.License.LicenseKey = "LICENSE-KEY"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>")
pdf.SaveAs("output.pdf")
关键差异:
- 无状态检查-错误时出现例外情况
- 无需对呈现器进行明确处理
- 现代流畅的 API
- 基于 Chromium 的渲染,更好地支持 HTML/CSS
完整的 API 参考
命名空间映射
| GdPicture.NET SDK | IronPDF |
|---|---|
GdPicture14 |
IronPdf |
GdPicture14.PDF |
IronPdf |
GdPicture14.Imaging |
不适用(不需要) |
核心类映射
| GdPicture.NET SDK | IronPDF | 说明 |
|---|---|---|
GdPicturePDF |
PdfDocument |
主要 PDF 文档类别 |
GdPictureDocumentConverter |
ChromePdfRenderer |
HTML/URL 到 PDF 的转换 |
LicenseManager |
IronPdf.License |
许可证管理 |
GdPictureStatus |
例外情况 | 错误处理 |
文档加载方法
| GdPicture.NET SDK | IronPDF |
|---|---|
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 SDK | IronPDF |
|---|---|
pdf.GetPageCount() |
pdf.PageCount |
pdf.SelectPage(pageNo) |
pdf.Pages[index] |
pdf.GetPageWidth() |
pdf.Pages[i].Width |
pdf.GetPageHeight() |
pdf.Pages[i].Height |
合并和拆分操作
| GdPicture.NET SDK | IronPDF |
|---|---|
pdf1.MergePages(pdf2) |
PdfDocument.Merge(pdf1, pdf2) |
pdf.ExtractPages(start, end) |
pdf.CopyPages(indices) |
水印操作
| GdPicture.NET SDK | IronPDF |
|---|---|
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");
}
}
}
}
Imports GdPicture14
Imports System
Class Program
Shared Sub Main()
Using converter As New GdPictureDocumentConverter()
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
Dim status As GdPictureStatus = converter.LoadFromHTMLString(htmlContent)
If status = GdPictureStatus.OK Then
converter.SaveAsPDF("output.pdf")
End If
End Using
End Sub
End Class
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");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
End Sub
End Class
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");
}
}
}
Imports GdPicture14
Imports System
Class Program
Shared Sub Main()
Using pdf1 As New GdPicturePDF(), pdf2 As New GdPicturePDF()
pdf1.LoadFromFile("document1.pdf", False)
pdf2.LoadFromFile("document2.pdf", False)
pdf1.MergePages(pdf2)
pdf1.SaveToFile("merged.pdf")
End Using
End Sub
End Class
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");
}
}
Imports IronPdf
Imports System.Collections.Generic
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(New List(Of PdfDocument) From {pdf1, pdf2})
merged.SaveAs("merged.pdf")
End Sub
End Class
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");
}
}
}
Imports GdPicture14
Imports System
Imports System.Drawing
Module Program
Sub Main()
Using pdf As New GdPicturePDF()
pdf.LoadFromFile("input.pdf", False)
For i As Integer = 1 To pdf.GetPageCount()
pdf.SelectPage(i)
pdf.SetTextColor(Color.Red)
pdf.SetTextSize(48)
pdf.DrawText("CONFIDENTIAL", 200, 400)
Next
pdf.SaveToFile("watermarked.pdf")
End Using
End Sub
End Module
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");
}
}
Imports IronPdf
Imports IronPdf.Editing
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("input.pdf")
pdf.ApplyWatermark("<h1 style='color:red;'>CONFIDENTIAL</h1>", 50, VerticalAlignment.Middle, HorizontalAlignment.Center)
pdf.SaveAs("watermarked.pdf")
End Sub
End Class
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
);
}
}
}
Imports GdPicture14
Class Program
Shared Sub Main()
LicenseManager.RegisterKEY("LICENSE-KEY")
Using pdf As New GdPicturePDF()
Dim status As GdPictureStatus = pdf.LoadFromFile("document.pdf", False)
If status <> GdPictureStatus.OK Then 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
)
End Using
End Sub
End Class
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");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim 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")
End Sub
End Class
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
}
' GdPicture.NET SDK:1-索引pages
For i As Integer = 1 To pdf.GetPageCount()
pdf.SelectPage(i)
' process page
Next
' IronPDF: 0-indexed pages (standard .NET)
For i As Integer = 0 To pdf.PageCount - 1
Dim page = pdf.Pages(i)
' process page
Next
状态代码到异常
用标准的 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}");
}
' GdPicture.NET SDK
Dim status As GdPictureStatus = converter.LoadFromHTMLString(html)
If status <> GdPictureStatus.OK Then
Console.WriteLine($"Error: {status}")
Return
End If
' IronPDF
Try
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
Catch ex As Exception
Console.WriteLine($"Error: {ex.Message}")
End Try
单位转换
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;
' 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;
}
// 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;
}
Imports System
Public Class PdfService
Private Shared ReadOnly _renderer As New ChromePdfRenderer()
Public Function Generate(html As String) As Byte()
Return _renderer.RenderHtmlAsPdf(html).BinaryData
End Function
' BAD - Creates new instance each time
Public Function GenerateBad(html As String) As Byte()
Dim renderer As New ChromePdfRenderer() ' Wasteful
Return renderer.RenderHtmlAsPdf(html).BinaryData
End Function
End Class
正确的资源处置
// 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
Imports PdfDocument
' Use Using blocks for automatic cleanup
Using pdf = PdfDocument.FromFile("large.pdf")
Dim text As String = pdf.ExtractAllText()
End Using ' pdf is disposed automatically
迁移清单
迁移前
- 清点代码库中所有GdPicture.NET SDK的使用情况
- 确定实际使用的功能(PDF、OCR、条形码)
- 确定是否需要 OCR/条形码功能(考虑使用 IronOCR/IronBarcode)
- 查看您当前的许可协议,并与IronPDF的定价进行比较。
- 获取IronPDF许可证密钥
- 在版本控制系统中创建迁移分支
代码迁移
- 移除GdPicture.NET SDKNuGet 包:
dotnet remove package GdPicture.NET - 安装 IronPdf NuGet 包:
dotnet add package IronPdf - 更新命名空间导入(
GdPicture14→IronPdf) - 将
LicenseManager.RegisterKEY()替换为IronPdf.License.LicenseKey将状态码检查转换为 try-catch 块 - 更新页面索引(索引为 1 → 索引为 0)
- 将
GdPicturePDF替换为PdfDocument - 将
GdPictureDocumentConverter替换为ChromePdfRenderer - 将基于坐标的文本转换为 HTML 戳记
- 更新单位换算(英寸→毫米)
测试
- 对所有 PDF 生成路径进行单元测试
- 验证 HTML 渲染质量是否达到或超过预期
- 测试所有安全/加密场景
- 验证表单填写功能
- 测试合并/拆分操作
- 验证水印外观
- 性能基准关键路径
后迁移
- 删除GdPicture.NET SDK许可证文件/密钥
- 更新文档
- 培训团队掌握IronPDFAPI 模式
- 监控生产过程,发现任何问题

