如何在 C# 中設置和編輯 PDF 元資料
從GdPicture.NET SDK遷移到IronPDF為.NET開發者提供了專注且精簡的PDF生成方式。 本指南提供了一個全面、逐步的遷移路徑,用現代的、專為當前.NET開發設計的PDF API替代複雜的文件影像SDK模式。
為什麼從GdPicture.NET SDK遷移到IronPDF
GdPicture.NET SDK的挑戰
GdPicture.NET SDK(現更名為Nutrient)是一個全面的文件影像SDK,對於專注於PDF的開發而言有若干挑戰:
-
對於僅限PDF專案是大材小用:GdPicture.NET SDK是一個完整的文件影像套件,包括OCR、條碼識別、掃描和影像處理。 如果您只需PDF功能,您會支付未使用功能的費用。
-
複雜的授權:多個產品等級(GdPicture.NET 14、GdPicture.API、Ultimate、Professional)及混淆的SKU組合和年度訂閱要求。
-
企業定價:僅PDF插件的授權費用從2,999美元起,最高可達10,000美元以上的Ultimate版。 每名開發者的授權增加了成長團隊的顯著負擔。
-
學習曲線陡峭:該API圍繞文件影像概念設計,不符合現代.NET模式。 像
GdPictureStatus枚舉檢查以及1索引頁面的用法,與現代C#慣例相比顯得過時。 -
狀態程式碼模式:每次操作都返回一個
GdPictureStatus枚舉,必須檢查——在錯誤時不會拋出異常,使得錯誤處理冗長而繁瑣。 -
手動資源管理:需要明確的
Release()調用。 該SDK未能清晰地遵循標準.NET釋放模式。 -
版本鎖定:名稱空間
GdPicture14包含版本號,使得主要版本升級時需對整個程式碼庫進行變更。 - 品牌混淆:最近更名為"Nutrient"導致gdpicture.com和nutrient.io之間的文件碎片化,增加了支援和學習的複雜性。
GdPicture.NET SDK和IronPDF比較
| 方面 | GdPicture.NET SDK | IronPDF |
|---|---|---|
| 重點 | 文件影像套件(對PDF來說是大材小用) | 專注於PDF的程式庫 |
| 價格 | $2,999-$10,000+企業級 | 具競爭力,隨業務擴展 |
| API風格 | 狀態程式碼,手動管理 | 異常處理,IDisposable,現代.NET |
| 學習曲線 | 陡峭(影像SDK概念) | 簡單(HTML/CSS熟悉) |
| HTML渲染 | 基本,內部引擎 | 最新的Chromium與CSS3/JS |
| 頁面索引 | 1索引 | 0索引(標準.NET) |
| 執行緒安全 | 需要手動同步 | 設計上具現成的執行緒安全性 |
| 名稱空間 | 版本特定(GdPicture14) |
穩定(IronPdf) |
IronPDF符合現代.NET模式和慣例,對於當前.NET版本的團隊是理想的選擇。
遷移複雜性評估
功能的預估努力程度
| 功能 | 遷移複雜性 |
|---|---|
| HTML轉PDF | 低 |
| URL到PDF | 低 |
| 合併PDF | 低 |
| 拆分PDF | 低 |
| 浮水印 | 低 |
| 文字提取 | 低 |
| 密碼保護 | 中 |
| 表單欄位 | 中 |
| 數位簽名 | 中-高 |
| OCR | 高 |
| 條碼識別 | 無 |
遷移決策矩陣
| 您的情況 | 建議 |
|---|---|
| 僅作PDF操作 | 遷移——顯著簡化和成本節省 |
| 大量使用OCR | 考慮將IronOCR作為配套產品 |
| 條碼/掃描需求 | 保留GdPicture.NET SDK以便使用這些功能,使用IronPDF處理PDF |
| 全面文件影像 | 評估您是否真的使用了所有功能 |
開始之前
前提條件
- .NET版本:IronPDF支持.NET Framework 4.6.2+和.NET Core 2.0+/ .NET 5+
- 授權金鑰:從ironpdf.com取得您的IronPDF授權金鑰
- 備份:建立一個遷移工作的分支
識別所有GdPicture.NET SDK使用情況
# Find all GdPicture.NET SDK references in your codebase
grep -r "GdPicture14\|GdPicturePDF\|GdPictureDocumentConverter\|GdPictureStatus\|LicenseManager\.RegisterKEY" --include="*.cs" .
# Find all GdPicture package references
grep -r "GdPicture" --include="*.csproj" .
# Find all GdPicture.NET SDK references in your codebase
grep -r "GdPicture14\|GdPicturePDF\|GdPictureDocumentConverter\|GdPictureStatus\|LicenseManager\.RegisterKEY" --include="*.cs" .
# Find all GdPicture package references
grep -r "GdPicture" --include="*.csproj" .
NuGet包變更
# Remove GdPicture.NET SDK packages
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
# Remove GdPicture.NET SDK packages
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 any GdPicture.NET SDK operations
LicenseManager.RegisterKEY("YOUR-GDPICTURE-LICENSE-KEY");
// Must be called before any GdPicture.NET SDK operations
LicenseManager.RegisterKEY("YOUR-GDPICTURE-LICENSE-KEY");
之後(IronPDF):
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Or in appsettings.json:
// { "IronPdf.License.LicenseKey": "YOUR-LICENSE-KEY" }
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Or in appsettings.json:
// { "IronPdf.License.LicenseKey": "YOUR-LICENSE-KEY" }
Imports 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;
// 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("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}");
}
}
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}");
}
}
Imports GdPicture14
LicenseManager.RegisterKEY("YOUR-GDPICTURE-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
之後(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");
using IronPdf;
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");
Imports IronPdf
IronPdf.License.LicenseKey = "YOUR-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
之後(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轉PDF文件。
範例二:合併多個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
之後(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的資訊。
範例三:為所有頁面新增浮水印
之前(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
之後(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
從基於坐標的文字繪製到基於HTML的浮水印的GdPicture.NET SDK遷移大大簡化了程式碼。 IronPDF的ApplyWatermark方法使用HTML/CSS樣式,消除了手動頁面疊代和坐標計算的必要。 有關其他選項,請參見完整的水印文件。
範例四:密碼保護和安全
之前(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
);
}
}
}
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
);
}
}
}
Imports GdPicture14
Class Program
Shared Sub Main()
LicenseManager.RegisterKEY("YOUR-GDPICTURE-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
之後(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
}
Imports GdPicture
Imports IronPdf
' GdPicture.NET SDK: 1-indexed 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 vs OCR vs 條碼)
- 確定是否需要OCR/條碼功能(考慮IronOCR/IronBarcode)
- 審查當前授權並與IronPDF定價進行比較
- 獲得IronPDF授權金鑰
- 在版本控制中建立遷移分支
程式碼遷移
- 移除GdPicture.NET SDK NuGet包:
dotnet remove package GdPicture.NET - 安裝IronPDF NuGet包:
dotnet add package IronPdf - 更新名稱空間引入(
GdPicture14→IronPdf) - 用
LicenseManager.RegisterKEY() - 將狀態程式碼檢查轉換為try-catch塊
- 更新頁面索引(1索引 → 0索引)
- 用
GdPicturePDF - 用
GdPictureDocumentConverter - 將基於坐標的文字轉換為HTML標記
- 更新單位轉換(英吋 → 毫米)
測試
- 單元測試所有PDF生成路徑
- 驗證HTML渲染質量是否符合或超過標準
- 測試所有安全/加密方案
- 驗證表單填寫功能
- 測試合併/拆分操作
- 驗證浮水印外觀
- 進行性能基準測試關鍵路徑
遷移後
- 移除GdPicture.NET SDK授權文件/密鑰
- 更新文件
- 對團隊進行IronPDF API模式的培訓
- 監控生產環境中的任何問題

