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美元以上的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 SDKIronPDF
重點文件影像套件(對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" .
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
SHELL

快速開始遷移

步驟1:更新授權配置

之前(GdPicture.NET SDK):

// Must be called before any GdPicture.NET SDK operations
LicenseManager.RegisterKEY("YOUR-GDPICTURE-LICENSE-KEY");
C#

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

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

之後(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轉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");
        }
    }
}

之後(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的資訊。

範例三:為所有頁面新增浮水印

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

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

從基於坐標的文字繪製到基於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
            );
        }
    }
}

之後(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
}
C#

狀態程式碼到異常

用標準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 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熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

...
閱讀更多

相關文章

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天試用金鑰
無需信用卡或帳戶建立