跳過到頁腳內容
遷移指南

如何用 C# 從 Nutrient.io 轉移到 IronPDF

從 Nutrient.io 遷移到 IronPDF:完整的 C# 遷移指南。

從 Nutrient.io(前身為 PSPDFKit)遷移至IronPDFfor .NET 可簡化您的 .NET PDF 工作流程,從具有異步先行模式的複雜文檔智慧平台轉換為具有直接同步 API 的專注 PDF 函式庫。本指南提供全面、逐步的遷移路徑,可消除平台開銷,同時維持所有基本的 PDF 功能。

為何要從 Nutrient.io 轉移到 IronPDF?

平台複雜性問題

Nutrient.io(前身為 PSPDFKit)已從 PDF SDK 演變成一個全面的"文件智慧平台"。雖然這種轉型擴大了功能,但對於只需要可靠 PDF 作業的團隊而言,卻帶來了重大的挑戰:

1.平台過度工程:曾經的 PDF SDK 現在已經成為一個完整的文件智慧平台,具有 AI 功能和文件工作流程功能,而這些功能對於簡單的 PDF 任務來說可能是不必要的。

2.Enterprise Pricing:Nutrient.io 定位於大型組織,其定價不透明,需要聯絡銷售人員。 這對中小型團隊造成障礙,也使預算規劃變得困難。

3.Rebrand Confusion:PSPDFKit → Nutrient 的過渡造成了同時引用兩個名稱的文件問題。套件名稱可能仍使用 PSPDFKit,過渡期間的轉移路徑仍不清楚。

4.Async-First Complexity:Nutrient.io 中的一切都需要 async/await 模式。 即使是簡單的操作也需要 PdfProcessor.CreateAsync() 來進行初始化,基本任務也需要 async 方法,增加了同步工作流程的開銷。

5.Heavy Dependencies:完整的平台需要更多的資源,需要更多的套件佔用空間、更多的初始化時間,以及額外的設定。

Nutrient.io 與IronPDF的比較

範疇Nutrient.io (PSPDFKit)IronPDF
重點文件智慧平台PDF 圖書館
定價企業(聯絡銷售)透明、已發表
架構複雜的平台簡單的圖書館
API 風格同步第一同步與同步選項
依賴重型輕量級
配置複雜的組態物件直接的屬性
學習曲線Steep (平台)溫和
目標使用者企業所有團隊規模

對於計劃在 2025 年和 2026 年之前採用 .NET 10 和 C# 14 的團隊而言,IronPDF 提供了一個更簡單的基礎,可以乾淨地整合,而不需要完整文件智慧平台的開銷。


開始之前

先決條件

1..NET 環境:.NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+ 2.NuGet存取:安裝 NuGet 套件的能力 3.IronPDF 授權:從IronPdf.com取得您的授權金鑰。

NuGet 套件變更

# Remove Nutrient/PSPDFKit packages
dotnet remove package PSPDFKit.NET
dotnet remove package PSPDFKit.PDF
dotnet remove package Nutrient
dotnet remove package Nutrient.PDF

# Install IronPDF
dotnet add package IronPdf
# Remove Nutrient/PSPDFKit packages
dotnet remove package PSPDFKit.NET
dotnet remove package PSPDFKit.PDF
dotnet remove package Nutrient
dotnet remove package Nutrient.PDF

# Install IronPDF
dotnet add package IronPdf
SHELL

授權組態

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

識別 Nutrient.io 使用方式

# Find all Nutrient/PSPDFKit references
grep -r "PSPDFKit\|Nutrient\|PdfProcessor\|PdfConfiguration" --include="*.cs" .
# Find all Nutrient/PSPDFKit references
grep -r "PSPDFKit\|Nutrient\|PdfProcessor\|PdfConfiguration" --include="*.cs" .
SHELL

完整的 API 參考資料

初始化映射

Nutrient.io (PSPDFKit)IronPDF筆記
等待 PdfProcessor.CreateAsync()新的 ChromePdfRenderer()不需要 async
<程式碼>processor.Dispose()</程式碼(自動或手動)簡化生命週期
new PdfConfiguration { ... }<編碼>renderer.RenderingOptions</編碼基於屬性

文件載入映射

Nutrient.io (PSPDFKit)IronPDF筆記
等待處理器.OpenAsync(路徑)PdfDocument.FromFile(path)預設同步
Document.LoadFromStream(stream)PdfDocument.FromStream(stream)串流支援
Document.LoadFromBytes(bytes)new PdfDocument(bytes)位元組

PDF 生成映射

Nutrient.io (PSPDFKit)IronPDF筆記
await processor.GeneratePdfFromHtmlStringAsync(html)renderer.RenderHtmlAsPdf(html)同步方法
await processor.GeneratePdfFromUrlAsync(url)renderer.RenderUrlAsPdf(url)直接 URL
await processor.GeneratePdfFromFileAsync(path)<brrenderer.RenderHtmlFileAsPdf(path)HTML 檔案

文件操作映射

Nutrient.io (PSPDFKit)IronPDF筆記
await processor.MergeAsync(docs)<代碼>PdfDocument.Merge(pdfs)</代碼同步
<編碼>document.PageCount</編碼<編碼>pdf.PageCount</編碼相同模式
await document.SaveAsync(path)<代碼>pdf.SaveAs(路徑)</代碼同步
<編碼>document.ToBytes()</編碼<編碼>pdf.BinaryData</編碼位元組

註解與水印對應

Nutrient.io (PSPDFKit)IronPDF筆記
await document.AddAnnotationAsync(index, annotation)pdf.ApplyWatermark(html)基於 HTML
new TextAnnotation("text")水印中的 HTML更靈活
annotation.Opacity = 0.5CSS 不透明度:0.5CSS 造型
annotation.FontSize = 48CSS font-size: 48pxCSS 造型

程式碼遷移範例

範例 1:HTML 到 PDF 的轉換

之前 (Nutrient.io):

// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        using var processor = await PdfProcessor.CreateAsync();
        var document = await processor.GeneratePdfFromHtmlStringAsync(htmlContent);
        await document.SaveAsync("output.pdf");
    }
}
// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        using var processor = await PdfProcessor.CreateAsync();
        var document = await processor.GeneratePdfFromHtmlStringAsync(htmlContent);
        await document.SaveAsync("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Nutrient.io 方法需要幾個 async 步驟:使用等待 PdfProcessor.CreateAsync()。創建一個 PdfProcessor ,然後呼叫 await processor.GeneratePdfFromHtmlStringAsync() ,最後再呼叫 await document.SaveAsync() 。 整個方法必須標示 async 任務,處理器需要有 using 語句才能正確處理。

IronPdf 大幅簡化了這項工作。 建立一個 ChromePdfRenderer, 呼叫 RenderHtmlAsPdf(), 並使用 SaveAs() 儲存。 不需要 async/await,不需要管理處理器生命週期,簡單的操作也不需要 using 區塊。 對於 PDF 工作流程不需要 async 模式的開發人員而言,此模式較為直覺。 請參閱 HTML to PDF 文件,以瞭解其他渲染選項。

範例 2:合併多個 PDF 檔案

之前 (Nutrient.io):

// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using System.Threading.Tasks;
using System.Collections.Generic;

class Program
{
    static async Task Main()
    {
        using var processor = await PdfProcessor.CreateAsync();

        var document1 = await processor.OpenAsync("document1.pdf");
        var document2 = await processor.OpenAsync("document2.pdf");

        var mergedDocument = await processor.MergeAsync(new List<PdfDocument> { document1, document2 });
        await mergedDocument.SaveAsync("merged.pdf");
    }
}
// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using System.Threading.Tasks;
using System.Collections.Generic;

class Program
{
    static async Task Main()
    {
        using var processor = await PdfProcessor.CreateAsync();

        var document1 = await processor.OpenAsync("document1.pdf");
        var document2 = await processor.OpenAsync("document2.pdf");

        var mergedDocument = await processor.MergeAsync(new List<PdfDocument> { document1, document2 });
        await mergedDocument.SaveAsync("merged.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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(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(pdf1, pdf2);
        merged.SaveAs("merged.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Nutrient.io 的合併作業需要使用等待 PdfProcessor.CreateAsync()。建立一個處理器,使用獨立的 await processor.OpenAsync() 呼叫開啟每個文件,建立一個 List<PdfDocument> ,使用該清單呼叫 await processor.MergeAsync() ,最後再使用 await mergedDocument.SaveAsync() 。 這就是基本合併的五個同步操作。

IronPDF 將這個過程縮小為四個同步行:使用 PdfDocument.FromFile() 載入每個 PDF,使用靜態 PdfDocument.Merge() 方法合併,然後儲存。 無處理器生命週期、無需建立清單 (您可以直接傳遞文件)、無 async 開銷。 進一步瞭解 合併與分割 PDF 的相關資訊。

範例 3:新增水印

之前 (Nutrient.io):

// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using PSPDFKit.Pdf.Annotation;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var processor = await PdfProcessor.CreateAsync();
        var document = await processor.OpenAsync("document.pdf");

        for (int i = 0; i < document.PageCount; i++)
        {
            var watermark = new TextAnnotation("CONFIDENTIAL")
            {
                Opacity = 0.5,
                FontSize = 48
            };
            await document.AddAnnotationAsync(i, watermark);
        }

        await document.SaveAsync("watermarked.pdf");
    }
}
// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using PSPDFKit.Pdf.Annotation;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var processor = await PdfProcessor.CreateAsync();
        var document = await processor.OpenAsync("document.pdf");

        for (int i = 0; i < document.PageCount; i++)
        {
            var watermark = new TextAnnotation("CONFIDENTIAL")
            {
                Opacity = 0.5,
                FontSize = 48
            };
            await document.AddAnnotationAsync(i, watermark);
        }

        await document.SaveAsync("watermarked.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("document.pdf");

        pdf.ApplyWatermark("<h1 style='color:gray;opacity:0.5;'>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("document.pdf");

        pdf.ApplyWatermark("<h1 style='color:gray;opacity:0.5;'>CONFIDENTIAL</h1>",
            50,
            VerticalAlignment.Middle,
            HorizontalAlignment.Center);

        pdf.SaveAs("watermarked.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

本範例強調一個基本的架構差異。 Nutrient.io 使用 基於注解的方法:您建立一個 TextAnnotation 物件,並賦予 OpacityFontSize 等屬性,然後在每個頁面中迴圈呼叫 await document.AddAnnotationAsync(i, watermark) 。 這需要瞭解註解系統並自行管理迴圈。

IronPdf 使用 基於 HTML 的方法ApplyWatermark() 方法接受具有 CSS 定義的 HTML 字串。 水印會在一次呼叫中自動套用至所有頁面。 您可以透過熟悉的 CSS 屬性 (coloropacityfont-size) 來控制外觀,而非特定於註解的物件屬性。 這種方法提供了更多的造型彈性-您可以使用任何 HTML/CSS,包括漸層、圖片和複雜的佈局。 有關進階範例,請參閱 watermark 文件


關鍵遷移注意事項

Async 到同步的轉換

最重要的改變是移除不必要的 async/await 模式:

// Nutrient.io: Async-first
using var processor = await PdfProcessor.CreateAsync();
var document = await processor.GeneratePdfFromHtmlStringAsync(html);
await document.SaveAsync("output.pdf");

// IronPDF:預設同步(async available when needed)
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Nutrient.io: Async-first
using var processor = await PdfProcessor.CreateAsync();
var document = await processor.GeneratePdfFromHtmlStringAsync(html);
await document.SaveAsync("output.pdf");

// IronPDF:預設同步(async available when needed)
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

如果您确实需要异步操作,IronPDF 提供了异步变体,如 RenderHtmlAsPdfAsync()

消除處理器生命週期

Nutrient.io 需要製作處理器並進行處理:

// Nutrient.io: Processor lifecycle management
using var processor = await PdfProcessor.CreateAsync();
// ... use processor ...
// Processor disposed at end of using block

// IronPDF: No processor lifecycle
var renderer = new ChromePdfRenderer();
// Reuse renderer, no complex lifecycle management
// Nutrient.io: Processor lifecycle management
using var processor = await PdfProcessor.CreateAsync();
// ... use processor ...
// Processor disposed at end of using block

// IronPDF: No processor lifecycle
var renderer = new ChromePdfRenderer();
// Reuse renderer, no complex lifecycle management
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

設定模式變更

Nutrient.io 使用組態物件; IronPdf 使用屬性:

// Nutrient.io: Config object
var config = new PdfConfiguration
{
    PageSize = PageSize.A4,
    Margins = new Margins(20, 20, 20, 20)
};
var doc = await processor.GeneratePdfFromHtmlStringAsync(html, config);

// IronPDF: Properties on RenderingOptions
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlAsPdf(html);
// Nutrient.io: Config object
var config = new PdfConfiguration
{
    PageSize = PageSize.A4,
    Margins = new Margins(20, 20, 20, 20)
};
var doc = await processor.GeneratePdfFromHtmlStringAsync(html, config);

// IronPDF: Properties on RenderingOptions
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlAsPdf(html);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

註解為 HTML 水印

以 HTML 字串取代註解物件:

// Nutrient.io: Annotation object with properties
new TextAnnotation("CONFIDENTIAL") { Opacity = 0.5f, FontSize = 48 }

// IronPDF: HTML with CSS
"<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>"
// Nutrient.io: Annotation object with properties
new TextAnnotation("CONFIDENTIAL") { Opacity = 0.5f, FontSize = 48 }

// IronPDF: HTML with CSS
"<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>"
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

頁面編碼處理

Nutrient.io 需要手動計算頁數; IronPdf 已內建占位符:

// Nutrient.io: Manual loop and page counting
for (int i = 0; i < doc.PageCount; i++)
{
    var footer = new TextAnnotation($"Page {i + 1} of {doc.PageCount}");
    await doc.AddAnnotationAsync(i, footer);
}

// IronPDF: Built-in placeholders
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "Page {page} of {total-pages}"
};
// Nutrient.io: Manual loop and page counting
for (int i = 0; i < doc.PageCount; i++)
{
    var footer = new TextAnnotation($"Page {i + 1} of {doc.PageCount}");
    await doc.AddAnnotationAsync(i, footer);
}

// IronPDF: Built-in placeholders
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "Page {page} of {total-pages}"
};
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

疑難排解

問題 1:PdfProcessor 未找到

問題PdfProcessor class 在IronPDF中不存在。

解決方案:使用ChromePdfRenderer

// Nutrient.io
using var processor = await PdfProcessor.CreateAsync();

// IronPDF
var renderer = new ChromePdfRenderer();
// Nutrient.io
using var processor = await PdfProcessor.CreateAsync();

// IronPDF
var renderer = new ChromePdfRenderer();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

問題 2:GeneratePdfFromHtmlStringAsync 未找到

問題:不存在 Async HTML 方法。

解決方案:使用 RenderHtmlAsPdf()

// Nutrient.io
var document = await processor.GeneratePdfFromHtmlStringAsync(html);

// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
// Nutrient.io
var document = await processor.GeneratePdfFromHtmlStringAsync(html);

// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

問題 3:找不到 TextAnnotation

問題:IronPDF 中不存在註解類別。

解決方案:使用基於 HTML 的水印:

// Nutrient.io
var watermark = new TextAnnotation("DRAFT") { Opacity = 0.5 };
await document.AddAnnotationAsync(0, watermark);

// IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>");
// Nutrient.io
var watermark = new TextAnnotation("DRAFT") { Opacity = 0.5 };
await document.AddAnnotationAsync(0, watermark);

// IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

問題 4:找不到 MergeAsync

問題:不存在同步合併方法。

解決方案:使用靜態 PdfDocument.Merge()

// Nutrient.io
var mergedDocument = await processor.MergeAsync(documentList);

// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);
// Nutrient.io
var mergedDocument = await processor.MergeAsync(documentList);

// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

遷移清單

預遷移

  • [清查程式碼庫中所有 PSPDFKit/Nutrient 的使用情況
  • [ ] 記錄可能需要調整的 async 模式
  • [ ] 列出所有組態物件及其屬性
  • [ ] 識別基於注解的功能(水印、標頭)
  • [ ] 檢閱表單處理需求
  • [ ] 獲得 IronPdf 授權金鑰

套件變更

  • [ ] 移除 PSPDFKit.NET NuGet 套件
  • [ ] 移除 Nutrient NuGet 套件
  • [ ] 安裝 IronPDF NuGet 套件:dotnet add package IronPdf
  • [ ] 更新命名空間匯入

程式碼變更

  • [ ] 在啟動時加入授權金鑰組態
  • [ ] 將 PdfProcessor.CreateAsync() 替換為新的 ChromePdfRenderer()
  • [ ] 將 processor.GeneratePdfFromHtmlStringAsync() 替換為 renderer.RenderHtmlAsPdf()
  • [ ] 將 processor.MergeAsync() 替換為 PdfDocument.Merge()
  • [ ] 將 TextAnnotation 水印轉換為 HTML 水印
  • [ ] 使用 RenderingOptions 屬性取代 config 物件
  • [ ] 更新 header/footer 以使用 HtmlHeaderFooter 與占位符
  • [ ] 移除不必要的 async/await 模式

後遷移

  • [ ] 移除不再需要的 async/await
  • [ ] 執行比較 PDF 輸出的回歸測試
  • [ ] 用頁碼驗證標題/頁腳
  • [ ] 測試水印渲染
  • [ ] 更新 CI/CD 管道

結論

從 Nutrient.io 遷移到 IronPDF,以專注的 PDF 函式庫取代複雜的文件智慧平台,簡化您的 PDF 工作流程。 遷移消除了 async-first 複雜性、處理器生命週期管理和基於注解的方法,轉而採用直接的同步 API 和基於 HTML 的樣式。

本次轉換的主要變更如下 1.架構:文件智慧平台 → 聚焦 PDF 函式庫 2.API 風格:同步第一 → 同步與同步選項 3.初始化await PdfProcessor.CreateAsync()new ChromePdfRenderer() 4.HTML 至 PDFGeneratePdfFromHtmlStringAsync()RenderHtmlAsPdf() 5.合併processor.MergeAsync(list)PdfDocument.Merge(pdf1, pdf2) 6.水印TextAnnotation 物件 → 使用 CSS 的 HTML 字串 7.頁碼:手動循環 → {page}{total-pages}占位符

探索完整的IronPDF文件教學API參考,加速您的Nutrient.io遷移。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。