跳至頁尾內容
影片

如何在 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的開發而言有若干挑戰:

  1. 對於僅限PDF專案是大材小用:GdPicture.NET SDK是一個完整的文件影像套件,包括OCR、條碼識別、掃描和影像處理。 如果您只需PDF功能,您會支付未使用功能的費用。

  2. 複雜的授權:多個產品等級(GdPicture.NET 14、GdPicture.API、Ultimate、Professional)及混淆的SKU組合和年度訂閱要求。

  3. 企業定價:僅PDF插件的授權費用從2,999美元起,最高可達10,000美元以上的Ultimate版。 每名開發者的授權增加了成長團隊的顯著負擔。

  4. 學習曲線陡峭:該API圍繞文件影像概念設計,不符合現代.NET模式。 像GdPictureStatus枚舉檢查以及1索引頁面的用法,與現代C#慣例相比顯得過時。

  5. 狀態程式碼模式:每次操作都返回一個GdPictureStatus枚舉,必須檢查——在錯誤時不會拋出異常,使得錯誤處理冗長而繁瑣。

  6. 手動資源管理:需要明確的Release()調用。 該SDK未能清晰地遵循標準.NET釋放模式。

  7. 版本鎖定:名稱空間GdPicture14包含版本號,使得主要版本升級時需對整個程式碼庫進行變更。

  8. 品牌混淆:最近更名為"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
全面文件影像 評估您是否真的使用了所有功能

開始之前

前提條件

  1. .NET版本:IronPDF支持.NET Framework 4.6.2+和.NET Core 2.0+/ .NET 5+
  2. 授權金鑰:ironpdf.com取得您的IronPDF授權金鑰
  3. 備份:建立一個遷移工作的分支

識別所有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" .
SHELL

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
SHELL

快速開始遷移

步驟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");
$vbLabelText   $csharpLabel

之後(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" }
$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;
Imports IronPdf
Imports IronPdf.Editing
$vbLabelText   $csharpLabel

步驟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
$vbLabelText   $csharpLabel

之後(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")
$vbLabelText   $csharpLabel

主要區別:

  • 不再進行狀態檢查——錯誤時拋出異常
  • 渲染器無需明確的釋放
  • 現代流暢的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
$vbLabelText   $csharpLabel

之後(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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

之後(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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

之後(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
$vbLabelText   $csharpLabel

從基於坐標的文字繪製到基於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
$vbLabelText   $csharpLabel

之後(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
$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
}
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
$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}");
}
' 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
$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;
' 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
$vbLabelText   $csharpLabel

轉換公式: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
$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
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
$vbLabelText   $csharpLabel

遷移檢查表

遷移前

  • 清點程式碼庫中所有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
  • 更新名稱空間引入(GdPicture14IronPdf)
  • LicenseManager.RegisterKEY()
  • 將狀態程式碼檢查轉換為try-catch塊
  • 更新頁面索引(1索引 → 0索引)
  • GdPicturePDF
  • GdPictureDocumentConverter
  • 將基於坐標的文字轉換為HTML標記
  • 更新單位轉換(英吋 → 毫米)

測試

  • 單元測試所有PDF生成路徑
  • 驗證HTML渲染質量是否符合或超過標準
  • 測試所有安全/加密方案
  • 驗證表單填寫功能
  • 測試合併/拆分操作
  • 驗證浮水印外觀
  • 進行性能基準測試關鍵路徑

遷移後

  • 移除GdPicture.NET SDK授權文件/密鑰
  • 更新文件
  • 對團隊進行IronPDF API模式的培訓
  • 監控生產環境中的任何問題

請注意GdPicture.NET和Nutrient是其各自所有者的註冊商標。 本網站不與Nutrient、ORPALIS或PSPDFKit建立關聯、認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供參考,反映撰寫時公開可用的資訊。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話