
如何使用IronPDF在C#中签署PDF文件
从Nutrient (以前的PSPDFKit) 迁移到IronPDF 简化了您的.NET PDF工作流,将广泛的成像和PDF工具包转为专注的PDF库。 Nutrient 的服务器端 .NET 产品是 GdPicture.NET——从 ORPALIS 收购并重新定位为"Nutrient .NET SDK"的工具包——以GdPicture NuGet 包的形式发售,位于GdPicture14 命名空间下。 本指南介绍了一条逐步迁移路径,将程序化的多功能工具包交换为一个具有更小表面区域的仅限PDF的库。
为什么从Nutrient迁移到IronPDF
工具包表面问题
Nutrient (以前称为PSPDFKit,2024年10月23日更名) 销售一个多产品系列 - 文档引擎 (Docker微服务),Web SDK,移动SDKs,和一个服务器端 .NET SDK,这实际上是GdPicture。 对于不需要工具包其他部分的团队,这种表面区域在几个具体方面表现出来:
-
广泛的工具包范围: .NET SDK 涵盖PDF、OCR、条码、TWAIN扫描、图像处理以及跨100多种文件格式的转换。 如果您需要这种广度是有用的 - 否则对仅需要PDF项目表面区域更大。
-
销售主导定价:
nutrient.io/sdk/pricing页面链接至联系表单,而非公布每位开发者的费率,这使得小型团队难以进行成本对比。 -
品牌和包翻动: PSPDFKit → Nutrient (2024年10月23日),加上GdPicture的收购,意味着旧代码中要跟踪三个名字。 .NET SDK 仍然以
GdPictureNuGet 包的形式发售,命名空间GdPictureDocumentConverter不符合"Nutrient"或"PSPDFKit"品牌。 -
依赖外部浏览器的 HTML 转 PDF: .NET SDK 的 HTML 渲染需依赖系统安装的 Chrome 或 Edge(或通过
SetWebBrowserPath指定的便携路径)。IronPDF内嵌了自己的Chromium。 -
过程式 PDF API: 水印包括
DrawTextBox和 OCG 层标记; 页眉和页脚是在循环中逐页绘制的。从基本元素构成的常见PDF操作意味着每个任务需要更多代码。
Nutrient .NET SDK 与IronPDF的比较
| 方面 | Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|---|
| 范围 | PDF + OCR + 条码 + 扫描 + 成像 | PDF 库 |
| 定价 | 销售导向(联系获取报价) | 透明、公开 |
| NuGet 软件包 | GdPicture | IronPdf |
| 根命名空间 | GdPicture14 | IronPdf |
| API 风格 | 大多为同步, 过程调用 | 同步并异步选项,流畅 |
| HTML 渲染 | 需要系统 Chrome / Edge | 嵌入式 Chromium |
| 页码索引 | 1 基于 | 基于 0 |
| 目标用户 | 需要成像 + 扫描 + PDF 一体化工具包的团队 | 只需要PDF的团队 |
对于只需要PDF的现代.NET团队来讲,IronPDF 提供较小的、专注于PDF的基础,能够干净地集成而没有额外的成像/扫描/OCR层。
开始之前
前提条件
- .NET 环境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 访问权限:能够安装 NuGet 包
- IronPDF 许可证:请从ironpdf.com获取您的许可证密钥。
NuGet 软件包变更
# Remove theNutrient .NET SDK (GdPicture)and any legacy PSPDFKit-branded packages
dotnet remove package GdPicture
dotnet remove package GdPicture.WPF
dotnet remove package GdPicture.WinForms
dotnet remove package PSPDFKit.NET
# Install IronPDF
dotnet add package IronPdf
当前的 Nutrient .NET SDK 发售于GdPicture NuGet ID 下(最新为14.x,所有者为 ORPALIS——Nutrient 的子公司)。 旧的 PSPDFKit 品牌 PSPDFKit.NET 包已终止; 如果存在请移除。
许可配置
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"识别Nutrient .NET SDK的使用
# Find GdPicture / Nutrient / PSPDFKit usage
grep -rE "GdPicture14|GdPicturePDF|GdPictureDocumentConverter|PSPDFKit|Nutrient" --include="*.cs" .
完整的 API 参考
初始化映射
| Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|
new GdPicturePDF() | new PdfDocument(...) / PdfDocument.FromFile(...) |
new GdPictureDocumentConverter() | new ChromePdfRenderer() |
pdf.Dispose() (IDisposable) | pdf.Dispose() (IDisposable) |
文档加载映射
| Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|
pdf.LoadFromFile(path) | PdfDocument.FromFile(path) |
pdf.LoadFromStream(stream) | PdfDocument.FromStream(stream) |
pdf.LoadFromByteArray(bytes) | new PdfDocument(bytes) / PdfDocument.FromBinaryData(bytes) |
PDF 生成映射
| Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|
HTML 字符串:写入临时文件,然后converter.LoadFromFile(path, DocumentFormat.DocumentFormatHTML) + SaveAsPDF(out) | renderer.RenderHtmlAsPdf(html) |
converter.LoadFromHttp(url) + SaveAsPDF(out) | renderer.RenderUrlAsPdf(url) |
converter.LoadFromFile(htmlPath, DocumentFormat.DocumentFormatHTML) + SaveAsPDF(out) | renderer.RenderHtmlFileAsPdf(path) |
文档操作映射
| Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|
converter.CombineToPDF(paths, out, PdfConformance.PDF) | PdfDocument.Merge(pdfs) |
pdf.GetPageCount() | pdf.PageCount |
pdf.SaveToFile(path) | pdf.SaveAs(path) |
pdf.SaveToByteArray(out bytes) | pdf.BinaryData |
水印映射
| Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|
pdf.SetFillAlpha(...) + pdf.DrawTextBox(...) per page | pdf.ApplyWatermark(html, rotation, vAlign, hAlign) |
pdf.AddStandardFont(...) + draw calls | 水印字符串中的 HTML/CSS |
SetFillAlpha(128) (0–255 byte scale) | Watermark Opacity 0–100 (int) or CSS opacity |
pdf.SetTextSize(48) | CSS font-size: 48px |
代码迁移示例
示例 1:HTML 到 PDF 的转换
以前(Nutrient .NET SDK / GdPicture):
// NuGet: Install-Package GdPicture
using GdPicture14;
using System.IO;
class Program
{
static void Main()
{
var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
// GdPicture's HTML loader is file-based, so stage the string to disk first.
File.WriteAllText("input.html", htmlContent);
using var converter = new GdPictureDocumentConverter();
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML);
converter.SaveAsPDF("output.pdf");
}
}// NuGet: Install-Package GdPicture
using GdPicture14;
using System.IO;
class Program
{
static void Main()
{
var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
// GdPicture's HTML loader is file-based, so stage the string to disk first.
File.WriteAllText("input.html", htmlContent);
using var converter = new GdPictureDocumentConverter();
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML);
converter.SaveAsPDF("output.pdf");
}
}Imports GdPicture14
Imports System.IO
Class Program
Shared Sub Main()
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
' GdPicture's HTML loader is file-based, so stage the string to disk first.
File.WriteAllText("input.html", htmlContent)
Using converter As New GdPictureDocumentConverter()
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML)
converter.SaveAsPDF("output.pdf")
End Using
End Sub
End ClassImports GdPicture14
Imports System.IO
Class Program
Shared Sub Main()
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
' GdPicture's HTML loader is file-based, so stage the string to disk first.
File.WriteAllText("input.html", htmlContent)
Using converter As New GdPictureDocumentConverter()
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML)
converter.SaveAsPDF("output.pdf")
End Using
End Sub
End ClassAfter (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");
}
}Imports IronPdf
Class Program
Shared Sub Main()
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
End Sub
End ClassImports IronPdf
Class Program
Shared Sub Main()
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
End Sub
End ClassGdPicture 方法需要一些额外步骤:HTML 加载器是基于文件/URL 的,因此内存中 HTML 字符串必须首先写入磁盘,然后调用converter.LoadFromFile(...) 和SaveAsPDF。 HTML 渲染依赖于系统安装的 Chrome 或 Edge(或通过 SetWebBrowserPath 指定的便携路径)。
IronPDF直接接受HTML字符串。 创建一个SaveAs()保存。 无需临时文件, 无需托管浏览器依赖 - IronPDF 内嵌了自己的Chromium。 有关其他渲染选项,请参阅 HTML to PDF 文档。
示例 2:合并多个 PDF 文件
以前(Nutrient .NET SDK / GdPicture):
// NuGet: Install-Package GdPicture
using GdPicture14;
using System.Collections.Generic;
class Program
{
static void Main()
{
IEnumerable<string> sourceFiles = new List<string>
{
"document1.pdf",
"document2.pdf"
};
using var converter = new GdPictureDocumentConverter();
converter.CombineToPDF(sourceFiles, "merged.pdf", PdfConformance.PDF);
}
}// NuGet: Install-Package GdPicture
using GdPicture14;
using System.Collections.Generic;
class Program
{
static void Main()
{
IEnumerable<string> sourceFiles = new List<string>
{
"document1.pdf",
"document2.pdf"
};
using var converter = new GdPictureDocumentConverter();
converter.CombineToPDF(sourceFiles, "merged.pdf", PdfConformance.PDF);
}
}Imports GdPicture14
Imports System.Collections.Generic
Class Program
Shared Sub Main()
Dim sourceFiles As IEnumerable(Of String) = New List(Of String) From {
"document1.pdf",
"document2.pdf"
}
Using converter As New GdPictureDocumentConverter()
converter.CombineToPDF(sourceFiles, "merged.pdf", PdfConformance.PDF)
End Using
End Sub
End ClassImports GdPicture14
Imports System.Collections.Generic
Class Program
Shared Sub Main()
Dim sourceFiles As IEnumerable(Of String) = New List(Of String) From {
"document1.pdf",
"document2.pdf"
}
Using converter As New GdPictureDocumentConverter()
converter.CombineToPDF(sourceFiles, "merged.pdf", PdfConformance.PDF)
End Using
End Sub
End ClassAfter (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
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;
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");
}
}Imports IronPdf
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End ClassImports IronPdf
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End ClassGdPicture 合并采取路径为基础的IEnumerable<string> 方式,通过PdfConformance值选择输出的合规级别。
IronPDF 在文档层级工作:每个 PDF 使用PdfDocument.Merge()合并,然后保存。 文档可以直接传递也可以作为可枚举项传递。 了解有关 合并和拆分 PDF 的更多信息。
示例 3:添加水印
以前(Nutrient .NET SDK / GdPicture):
// NuGet: Install-Package GdPicture
using GdPicture14;
class Program
{
static void Main()
{
using var pdf = new GdPicturePDF();
pdf.LoadFromFile("document.pdf");
pdf.SetMeasurementUnit(PdfMeasurementUnit.PdfMeasurementUnitPoint);
var font = pdf.AddStandardFont(PdfStandardFont.PdfStandardFontHelveticaBold);
int pageCount = pdf.GetPageCount();
for (int i = 1; i <= pageCount; i++)
{
pdf.SelectPage(i);
pdf.SetFillAlpha(128); // ~50% (0..255)
pdf.SetTextSize(48);
pdf.SetOriginRotationInDegrees(45);
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL",
PdfHorizontalAlignment.PdfHorizontalAlignmentCenter,
PdfVerticalAlignment.PdfVerticalAlignmentMiddle);
}
pdf.SaveToFile("watermarked.pdf");
}
}// NuGet: Install-Package GdPicture
using GdPicture14;
class Program
{
static void Main()
{
using var pdf = new GdPicturePDF();
pdf.LoadFromFile("document.pdf");
pdf.SetMeasurementUnit(PdfMeasurementUnit.PdfMeasurementUnitPoint);
var font = pdf.AddStandardFont(PdfStandardFont.PdfStandardFontHelveticaBold);
int pageCount = pdf.GetPageCount();
for (int i = 1; i <= pageCount; i++)
{
pdf.SelectPage(i);
pdf.SetFillAlpha(128); // ~50% (0..255)
pdf.SetTextSize(48);
pdf.SetOriginRotationInDegrees(45);
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL",
PdfHorizontalAlignment.PdfHorizontalAlignmentCenter,
PdfVerticalAlignment.PdfVerticalAlignmentMiddle);
}
pdf.SaveToFile("watermarked.pdf");
}
}Imports GdPicture14
Class Program
Shared Sub Main()
Using pdf As New GdPicturePDF()
pdf.LoadFromFile("document.pdf")
pdf.SetMeasurementUnit(PdfMeasurementUnit.PdfMeasurementUnitPoint)
Dim font = pdf.AddStandardFont(PdfStandardFont.PdfStandardFontHelveticaBold)
Dim pageCount As Integer = pdf.GetPageCount()
For i As Integer = 1 To pageCount
pdf.SelectPage(i)
pdf.SetFillAlpha(128) ' ~50% (0..255)
pdf.SetTextSize(48)
pdf.SetOriginRotationInDegrees(45)
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL", PdfHorizontalAlignment.PdfHorizontalAlignmentCenter, PdfVerticalAlignment.PdfVerticalAlignmentMiddle)
Next
pdf.SaveToFile("watermarked.pdf")
End Using
End Sub
End ClassImports GdPicture14
Class Program
Shared Sub Main()
Using pdf As New GdPicturePDF()
pdf.LoadFromFile("document.pdf")
pdf.SetMeasurementUnit(PdfMeasurementUnit.PdfMeasurementUnitPoint)
Dim font = pdf.AddStandardFont(PdfStandardFont.PdfStandardFontHelveticaBold)
Dim pageCount As Integer = pdf.GetPageCount()
For i As Integer = 1 To pageCount
pdf.SelectPage(i)
pdf.SetFillAlpha(128) ' ~50% (0..255)
pdf.SetTextSize(48)
pdf.SetOriginRotationInDegrees(45)
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL", PdfHorizontalAlignment.PdfHorizontalAlignmentCenter, PdfVerticalAlignment.PdfVerticalAlignmentMiddle)
Next
pdf.SaveToFile("watermarked.pdf")
End Using
End Sub
End ClassAfter (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>",
45,
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>",
45,
VerticalAlignment.Middle,
HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
}
}Imports IronPdf
Imports IronPdf.Editing
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("document.pdf")
pdf.ApplyWatermark("<h1 style='color:gray;opacity:0.5;'>CONFIDENTIAL</h1>",
45,
VerticalAlignment.Middle,
HorizontalAlignment.Center)
pdf.SaveAs("watermarked.pdf")
End Sub
End ClassImports IronPdf
Imports IronPdf.Editing
Class Program
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("document.pdf")
pdf.ApplyWatermark("<h1 style='color:gray;opacity:0.5;'>CONFIDENTIAL</h1>",
45,
VerticalAlignment.Middle,
HorizontalAlignment.Center)
pdf.SaveAs("watermarked.pdf")
End Sub
End Class这个例子突出了一个基本的架构差异。 GdPicture 使用一个过程式绘图调用方法:添加标准字体,然后逐页(1为起始数)调用DrawTextBox。 Alpha使用0–255字节刻度,旋转是作为图形状态属性设置的,定位通过显式坐标处理。
IronPDF 使用一个基于 HTML 的方法: ApplyWatermark()方法接受一个带有 CSS 样式的 HTML 字符串,并在一个调用中应用到所有页面。 您可以通过熟悉的 CSS 属性(font-size)而不是原始图形调用来控制外观。 这种方法也支持更丰富的内容——渐变、图片、更复杂的布局——在同一个字符串中。 请参阅水印文档以获取更高级的示例。
关键迁移说明
HTML输入界面
GdPicture 的 HTML 加载器是基于文件/URL 的IronPDF直接接受 HTML 字符串:
// Nutrient .NET SDK (string -> file -> PDF):
File.WriteAllText("input.html", html);
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML);
converter.SaveAsPDF("output.pdf");
//IronPDF(string -> PDF):
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");// Nutrient .NET SDK (string -> file -> PDF):
File.WriteAllText("input.html", html);
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML);
converter.SaveAsPDF("output.pdf");
//IronPDF(string -> PDF):
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");' Nutrient .NET SDK (string -> file -> PDF):
File.WriteAllText("input.html", html)
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML)
converter.SaveAsPDF("output.pdf")
' IronPDF(string -> PDF):
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")' Nutrient .NET SDK (string -> file -> PDF):
File.WriteAllText("input.html", html)
converter.LoadFromFile("input.html", DocumentFormat.DocumentFormatHTML)
converter.SaveAsPDF("output.pdf")
' IronPDF(string -> PDF):
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")如果您确实需要异步操作,IronPDF 提供异步变体,如RenderHtmlAsPdfAsync()。
外部浏览器依赖
GdPicture 的 HTML 渲染器依赖于系统安装的 Chrome 或 Edge(或通过 SetWebBrowserPath 指定的便携路径)。IronPDF内嵌了自己的 Chromium:
// Nutrient .NET SDK: optionally point to a portable Chrome
converter.SetWebBrowserPath(@"C:\Tools\chrome\chrome.exe");
// IronPDF: nothing to configure
var pdf = renderer.RenderHtmlAsPdf(html);// Nutrient .NET SDK: optionally point to a portable Chrome
converter.SetWebBrowserPath(@"C:\Tools\chrome\chrome.exe");
// IronPDF: nothing to configure
var pdf = renderer.RenderHtmlAsPdf(html);' Nutrient .NET SDK: optionally point to a portable Chrome
converter.SetWebBrowserPath("C:\Tools\chrome\chrome.exe")
' IronPDF: nothing to configure
Dim pdf = renderer.RenderHtmlAsPdf(html)' Nutrient .NET SDK: optionally point to a portable Chrome
converter.SetWebBrowserPath("C:\Tools\chrome\chrome.exe")
' IronPDF: nothing to configure
Dim pdf = renderer.RenderHtmlAsPdf(html)配置模式更改
GdPicture 根据转换器上的每个属性值暴露布局设置(以英寸为单位的 HTML 页面宽度/高度,单个边距)。IronPDF将它们分组到一个RenderingOptions包中,附带命名的纸张尺寸:
// Nutrient .NET SDK: properties on the converter (inches)
using var converter = new GdPictureDocumentConverter();
converter.HtmlPageWidth = 8.27f; // A4 width (inches)
converter.HtmlPageHeight = 11.69f; // A4 height (inches)
converter.HtmlMarginTop = 0.78f;
converter.HtmlMarginBottom = 0.78f;
converter.HtmlMarginLeft = 0.78f;
converter.HtmlMarginRight = 0.78f;
// IronPDF: properties on RenderingOptions (millimetres)
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 .NET SDK: properties on the converter (inches)
using var converter = new GdPictureDocumentConverter();
converter.HtmlPageWidth = 8.27f; // A4 width (inches)
converter.HtmlPageHeight = 11.69f; // A4 height (inches)
converter.HtmlMarginTop = 0.78f;
converter.HtmlMarginBottom = 0.78f;
converter.HtmlMarginLeft = 0.78f;
converter.HtmlMarginRight = 0.78f;
// IronPDF: properties on RenderingOptions (millimetres)
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);Imports GdPicture14
Imports IronPdf
' Nutrient .NET SDK: properties on the converter (inches)
Using converter As New GdPictureDocumentConverter()
converter.HtmlPageWidth = 8.27F ' A4 width (inches)
converter.HtmlPageHeight = 11.69F ' A4 height (inches)
converter.HtmlMarginTop = 0.78F
converter.HtmlMarginBottom = 0.78F
converter.HtmlMarginLeft = 0.78F
converter.HtmlMarginRight = 0.78F
End Using
' IronPDF: properties on RenderingOptions (millimetres)
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
Dim pdf = renderer.RenderHtmlAsPdf(html)Imports GdPicture14
Imports IronPdf
' Nutrient .NET SDK: properties on the converter (inches)
Using converter As New GdPictureDocumentConverter()
converter.HtmlPageWidth = 8.27F ' A4 width (inches)
converter.HtmlPageHeight = 11.69F ' A4 height (inches)
converter.HtmlMarginTop = 0.78F
converter.HtmlMarginBottom = 0.78F
converter.HtmlMarginLeft = 0.78F
converter.HtmlMarginRight = 0.78F
End Using
' IronPDF: properties on RenderingOptions (millimetres)
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
Dim pdf = renderer.RenderHtmlAsPdf(html)从过程水印到HTML水印
将基本绘图调用替换为一个 HTML/CSS 字符串:
// Nutrient .NET SDK: SetFillAlpha + SetTextSize + DrawTextBox in a per-page loop
pdf.SetFillAlpha(128);
pdf.SetTextSize(48);
pdf.SetOriginRotationInDegrees(45);
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL",
PdfHorizontalAlignment.PdfHorizontalAlignmentCenter,
PdfVerticalAlignment.PdfVerticalAlignmentMiddle);
// IronPDF: one HTML/CSS string
pdf.ApplyWatermark("<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>",
45, VerticalAlignment.Middle, HorizontalAlignment.Center);// Nutrient .NET SDK: SetFillAlpha + SetTextSize + DrawTextBox in a per-page loop
pdf.SetFillAlpha(128);
pdf.SetTextSize(48);
pdf.SetOriginRotationInDegrees(45);
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL",
PdfHorizontalAlignment.PdfHorizontalAlignmentCenter,
PdfVerticalAlignment.PdfVerticalAlignmentMiddle);
// IronPDF: one HTML/CSS string
pdf.ApplyWatermark("<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>",
45, VerticalAlignment.Middle, HorizontalAlignment.Center);' Nutrient .NET SDK: SetFillAlpha + SetTextSize + DrawTextBox in a per-page loop
pdf.SetFillAlpha(128)
pdf.SetTextSize(48)
pdf.SetOriginRotationInDegrees(45)
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL", PdfHorizontalAlignment.PdfHorizontalAlignmentCenter, PdfVerticalAlignment.PdfVerticalAlignmentMiddle)
' IronPDF: one HTML/CSS string
pdf.ApplyWatermark("<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>", 45, VerticalAlignment.Middle, HorizontalAlignment.Center)' Nutrient .NET SDK: SetFillAlpha + SetTextSize + DrawTextBox in a per-page loop
pdf.SetFillAlpha(128)
pdf.SetTextSize(48)
pdf.SetOriginRotationInDegrees(45)
pdf.DrawTextBox(font, 100, 300, 500, 400, "CONFIDENTIAL", PdfHorizontalAlignment.PdfHorizontalAlignmentCenter, PdfVerticalAlignment.PdfVerticalAlignmentMiddle)
' IronPDF: one HTML/CSS string
pdf.ApplyWatermark("<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>", 45, VerticalAlignment.Middle, HorizontalAlignment.Center)页码处理
GdPicture 没有一流的页眉/页脚模型——页码在循环中逐页绘制。IronPDF 提供内置的{page} / {total-pages}占位符:
// Nutrient .NET SDK: per-page DrawText loop (1-based)
for (int i = 1; i <= pdf.GetPageCount(); i++)
{
pdf.SelectPage(i);
pdf.DrawText(font, x, y, $"Page {i} of {pdf.GetPageCount()}");
}
// IronPDF: built-in placeholders
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "Page {page} of {total-pages}"
};// Nutrient .NET SDK: per-page DrawText loop (1-based)
for (int i = 1; i <= pdf.GetPageCount(); i++)
{
pdf.SelectPage(i);
pdf.DrawText(font, x, y, $"Page {i} of {pdf.GetPageCount()}");
}
// IronPDF: built-in placeholders
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "Page {page} of {total-pages}"
};' Nutrient .NET SDK: per-page DrawText loop (1-based)
For i As Integer = 1 To pdf.GetPageCount()
pdf.SelectPage(i)
pdf.DrawText(font, x, y, $"Page {i} of {pdf.GetPageCount()}")
Next
' IronPDF: built-in placeholders
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "Page {page} of {total-pages}"
}' Nutrient .NET SDK: per-page DrawText loop (1-based)
For i As Integer = 1 To pdf.GetPageCount()
pdf.SelectPage(i)
pdf.DrawText(font, x, y, $"Page {i} of {pdf.GetPageCount()}")
Next
' IronPDF: built-in placeholders
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "Page {page} of {total-pages}"
}页面索引
GdPicture 是1为基数(SelectPage(1) 是第一页)。IronPDF的pdf.RemovePages(int)是0为基数。 偏差1是最常见的移植错误:
// Nutrient .NET SDK (1-based):
pdf.SelectPage(1);
pdf.DeletePage();
//IronPDF(0-based):
pdf.RemovePages(0);// Nutrient .NET SDK (1-based):
pdf.SelectPage(1);
pdf.DeletePage();
//IronPDF(0-based):
pdf.RemovePages(0);' Nutrient .NET SDK (1-based):
pdf.SelectPage(1)
pdf.DeletePage()
' IronPDF(0-based):
pdf.RemovePages(0)' Nutrient .NET SDK (1-based):
pdf.SelectPage(1)
pdf.DeletePage()
' IronPDF(0-based):
pdf.RemovePages(0)故障排除
问题1:找不到 GdPictureDocumentConverter
问题:IronPDF中不存在GdPictureDocumentConverter类。
解决方案:使用ChromePdfRenderer将HTML/URL → PDF:
// Nutrient .NET SDK
using var converter = new GdPictureDocumentConverter();
// IronPDF
var renderer = new ChromePdfRenderer();// Nutrient .NET SDK
using var converter = new GdPictureDocumentConverter();
// IronPDF
var renderer = new ChromePdfRenderer();Imports GdPicture14
Imports IronPdf
' Nutrient .NET SDK
Using converter As New GdPictureDocumentConverter()
' Your code here
End Using
' IronPDF
Dim renderer As New ChromePdfRenderer()Imports GdPicture14
Imports IronPdf
' Nutrient .NET SDK
Using converter As New GdPictureDocumentConverter()
' Your code here
End Using
' IronPDF
Dim renderer As New ChromePdfRenderer()问题2:GdPicturePDF 未找到
问题:IronPDF中不存在GdPicturePDF类。
解决方案: 使用PdfDocument:
// Nutrient .NET SDK
using var pdf = new GdPicturePDF();
pdf.LoadFromFile("input.pdf");
// IronPDF
var pdf = PdfDocument.FromFile("input.pdf");// Nutrient .NET SDK
using var pdf = new GdPicturePDF();
pdf.LoadFromFile("input.pdf");
// IronPDF
var pdf = PdfDocument.FromFile("input.pdf");Imports GdPicture14
Imports IronPdf
' Nutrient .NET SDK
Using pdf As New GdPicturePDF()
pdf.LoadFromFile("input.pdf")
End Using
' IronPDF
Dim pdfDocument = PdfDocument.FromFile("input.pdf")Imports GdPicture14
Imports IronPdf
' Nutrient .NET SDK
Using pdf As New GdPicturePDF()
pdf.LoadFromFile("input.pdf")
End Using
' IronPDF
Dim pdfDocument = PdfDocument.FromFile("input.pdf")问题3:找不到 DrawTextBox / SetFillAlpha
问题: 在IronPDF中不存在基本绘图调用。
解决方案:使用基于 HTML 的水印:
// Nutrient .NET SDK
pdf.SetFillAlpha(128);
pdf.DrawTextBox(font, 100, 300, 500, 400, "DRAFT",
PdfHorizontalAlignment.PdfHorizontalAlignmentCenter,
PdfVerticalAlignment.PdfVerticalAlignmentMiddle);
// IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>",
45, VerticalAlignment.Middle, HorizontalAlignment.Center);// Nutrient .NET SDK
pdf.SetFillAlpha(128);
pdf.DrawTextBox(font, 100, 300, 500, 400, "DRAFT",
PdfHorizontalAlignment.PdfHorizontalAlignmentCenter,
PdfVerticalAlignment.PdfVerticalAlignmentMiddle);
// IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>",
45, VerticalAlignment.Middle, HorizontalAlignment.Center);' Nutrient .NET SDK
pdf.SetFillAlpha(128)
pdf.DrawTextBox(font, 100, 300, 500, 400, "DRAFT", PdfHorizontalAlignment.PdfHorizontalAlignmentCenter, PdfVerticalAlignment.PdfVerticalAlignmentMiddle)
' IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>", 45, VerticalAlignment.Middle, HorizontalAlignment.Center)' Nutrient .NET SDK
pdf.SetFillAlpha(128)
pdf.DrawTextBox(font, 100, 300, 500, 400, "DRAFT", PdfHorizontalAlignment.PdfHorizontalAlignmentCenter, PdfVerticalAlignment.PdfVerticalAlignmentMiddle)
' IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>", 45, VerticalAlignment.Middle, HorizontalAlignment.Center)问题4:找不到 CombineToPDF
问题: 基于路径的组合方法不存在。
解决方案: 将每个 PDF 作为PdfDocument.Merge():
// Nutrient .NET SDK
converter.CombineToPDF(paths, "merged.pdf", PdfConformance.PDF);
// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");// Nutrient .NET SDK
converter.CombineToPDF(paths, "merged.pdf", PdfConformance.PDF);
// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");' Nutrient .NET SDK
converter.CombineToPDF(paths, "merged.pdf", PdfConformance.PDF)
' IronPDF
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")' Nutrient .NET SDK
converter.CombineToPDF(paths, "merged.pdf", PdfConformance.PDF)
' IronPDF
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")问题5:页面索引偏差
问题: GdPicture 使用1基页面索引;IronPDF使用0基。 直接传输pdf.Pages[1]会跳过第一页。
解决方案: 在移植页面索引时减去1:
// Nutrient .NET SDK (first page)
pdf.SelectPage(1);
//IronPDF(first page)
var firstPage = pdf.Pages[0];// Nutrient .NET SDK (first page)
pdf.SelectPage(1);
//IronPDF(first page)
var firstPage = pdf.Pages[0];' Nutrient .NET SDK (first page)
pdf.SelectPage(1)
' IronPDF (first page)
Dim firstPage = pdf.Pages(0)' Nutrient .NET SDK (first page)
pdf.SelectPage(1)
' IronPDF (first page)
Dim firstPage = pdf.Pages(0)迁移清单
迁移前
- 清点代码库中的所有GdPicture / PSPDFKit / Nutrient使用情况
- 注意现有GdPicture代码中1基和0基页面索引
- 在
GdPictureDocumentConverter上设置列表配置(HTML页面尺寸,边距) - 确定用于水印和页眉的过程式绘图(
DrawTextBox) - 审查使用基于索引访问的表单字段代码(
GetFormFieldName(i)) - 获取IronPDF许可证密钥
软件包变更
- 移除
GdPictureNuGet 包(如果存在,同时移除GdPicture.WPF/GdPicture.WinForms) - 如果存在,移除旧版
PSPDFKit.NET包 - 安装
IronPdfNuGet 包:dotnet add package IronPdf - 更新命名空间导入(
using GdPicture14;→using IronPdf;)
代码更改
- 在启动时添加许可证密钥配置
- 用
new GdPictureDocumentConverter()以转换HTML/URL → PDF - 用
new GdPicturePDF()+LoadFromFile - 用
converter.CombineToPDF(paths, ...) - 将过程式水印绘制调用转换为
pdf.ApplyWatermark(html, ...) - 用
RenderingOptions替换转换器属性(命名纸张尺寸,毫米边距) - 用
{page}/HtmlHeaderFooter - 将基于1的页面索引转换为整个过程中基于0
后迁移
- 如果部署镜像中只有因GdPicture依赖的系统Chrome / Edge依赖项,则将其移除
- 运行回归测试,比较 PDF 输出
- 核对页眉/页脚的页码
- 测试水印渲染
- 更新 CI/CD 流水线
Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。
相关文章


