Como migrar do Nutrient.io para o IronPDF em C#
Migrar do Nutrient (anteriormente PSPDFKit) para IronPDF simplifica seu fluxo de trabalho PDF .NET movendo-se de um amplo conjunto de ferramentas de imagem e PDF para uma biblioteca focada em PDF. A oferta .NET do lado do servidor da Nutrient é o GdPicture.NET — o kit de ferramentas adquirido da ORPALIS e reposicionado como "Nutrient .NET SDK" — que é distribuído como o pacote NuGet GdPicture sob o namespace GdPicture14. Este guia percorre um caminho de migração passo a passo que troca o conjunto de ferramentas procedural e multiuso por uma biblioteca exclusivamente de PDF, com uma menor área de superfície.
Por que Migrar do Nutrient para IronPDF
O Problema de Área de Superfície do Conjunto de Ferramentas
O Nutrient (anteriormente PSPDFKit, rebatizado em 23-10-2024) vende uma família de múltiplos produtos — Document Engine (microserviço Docker), Web SDK, SDKs móveis, e um SDK .NET lado do servidor que é o GdPicture por trás. Para equipes que precisam de operações PDF diretas sem o restante do conjunto de ferramentas, a área de superfície aparece de algumas maneiras concretas:
-
Amplo escopo do conjunto de ferramentas: O SDK .NET cobre PDF, OCR, códigos de barras, digitalização TWAIN, processamento e conversão de imagens em mais de 100 formatos de arquivo. Útil se você precisar dessa abrangência — mais área de superfície do que um projeto exclusivamente de PDF precisa se você não precisar.
-
Preços liderados por vendas: A página
nutrient.io/sdk/pricingdireciona para um formulário de contato em vez de publicar taxas por desenvolvedor, o que dificulta a comparação de custos lado a lado para pequenas equipes. -
Rotatividade de marca e pacote: PSPDFKit → Nutrient (2024-10-23), além da aquisição GdPicture, significa três nomes para rastrear em código mais antigo. O SDK .NET ainda é distribuído como o pacote NuGet
GdPicture, namespaceGdPicture14, com nomes de classes comoGdPicturePDFeGdPictureDocumentConverterque não correspondem à marca "Nutrient" ou "PSPDFKit". -
Dependência de navegador externo para HTML-to-PDF: O renderizador HTML do SDK .NET depende de um Chrome ou Edge instalado no sistema (ou um caminho portátil que você define via
SetWebBrowserPath). O IronPDF envia seu próprio Chromium incorporado. - API procedural de PDF: As marcas d'água compõem
SetFillAlpha,DrawTextBoxe marcadores de camada OCG; cabeçalhos e rodapés são desenhados por página em um loop. Compor operações comuns de PDF a partir de primitivas significa mais código por tarefa.
Comparação Nutrient .NET SDK vs IronPDF
| Aspecto | Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|---|
| Escopo | PDF + OCR + código de barras + digitalização + imagem | Biblioteca de PDFs |
| Preços | Liderado por vendas (contatar para cotação) | Transparente, publicado |
| Pacote NuGet | GdPicture |
IronPdf |
| Namespace raiz | GdPicture14 |
IronPdf |
| Estilo API | Principalmente chamadas de desenho procedimental síncronas | Sincronização com opção assíncrona, fluente |
| Renderização HTML | Requer Chrome / Edge do sistema | Chromium incorporado |
| Indexação de página | 1-baseado | Baseado em 0 |
| Usuários-alvo | Equipes que necessitam de imagem + digitalização + PDF em um único kit de ferramentas | Equipes que necessitam apenas de PDF |
Para equipes no .NET moderno que só precisam de PDF,IronPDF fornece uma fundação menor e focada em PDF que integra-se perfeitamente sem as camadas adicionais de imagem / digitalização / OCR.
Antes de começar
Pré-requisitos
- Ambiente .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
- Acesso ao NuGet : Capacidade de instalar pacotes NuGet.
- Licença do IronPDF: Obtenha sua chave de licença em IronPDF
Alterações no pacote 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
# 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
O atual SDK Nutrient .NET é distribuído sob o ID NuGet GdPicture (mais recente 14.x, proprietário ORPALIS — uma subsidiária da Nutrient). O pacote PSPDFKit.NET com a marca PSPDFKit está em fase de descontinuação; remova, se presente.
Configuração de licença
// 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";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Identificar Uso do Nutrient .NET SDK
# Find GdPicture / Nutrient / PSPDFKit usage
grep -rE "GdPicture14|GdPicturePDF|GdPictureDocumentConverter|PSPDFKit|Nutrient" --include="*.cs" .
# Find GdPicture / Nutrient / PSPDFKit usage
grep -rE "GdPicture14|GdPicturePDF|GdPictureDocumentConverter|PSPDFKit|Nutrient" --include="*.cs" .
Referência completa da API
Mapeamentos de inicialização
| Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|
new GdPicturePDF() |
new PdfDocument(...) / PdfDocument.FromFile(...) |
new GdPictureDocumentConverter() |
new ChromePdfRenderer() |
pdf.Dispose() (IDisposable) |
pdf.Dispose() (IDisposable) |
Mapeamentos de carregamento de documentos
| 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) |
Mapeamentos de geração de PDF
| Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|
String HTML: escrever para arquivo temporário, então 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) |
Mapeamentos de operações de documentos
| 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 |
Mapeamentos de Marca d'água
| Nutrient .NET SDK (GdPicture) | IronPDF |
|---|---|
pdf.SetFillAlpha(...) + pdf.DrawTextBox(...) por página |
pdf.ApplyWatermark(html, rotation, vAlign, hAlign) |
pdf.AddStandardFont(...) + chamadas de desenho |
HTML/CSS na string de marca d'água |
SetFillAlpha(128) (escala de bytes de 0 a 255) |
Marca d'água Opacity 0–100 (int) ou CSS opacity |
pdf.SetTextSize(48) |
CSS font-size: 48px |
Exemplos de migração de código
Exemplo 1: Conversão de HTML para PDF
Before (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 Class
Após (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 Class
A abordagem do GdPicture requer alguns passos extras: o carregador HTML é baseado em arquivo/URL, então uma string HTML na memória precisa ser armazenada em disco primeiro, então converter.LoadFromFile(...) é chamado com DocumentFormat.DocumentFormatHTML, seguido por SaveAsPDF. A renderização HTML depende de um Chrome ou Edge instalado no sistema (ou um caminho portátil fornecido via SetWebBrowserPath).
O IronPDF aceita a string HTML diretamente. Criar um ChromePdfRenderer, chamar RenderHtmlAsPdf(), e salvar com SaveAs(). Nenhum arquivo temporário, nenhuma dependência de navegador hospedeiro —IronPDF envia seu próprio Chromium incorporado. Consulte a documentação de conversão de HTML para PDF para obter opções de renderização adicionais.
Exemplo 2: Mesclar vários PDFs
Before (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 Class
Após (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 Class
A fusão do GdPicture requer um IEnumerable<string> baseado em caminho através de converter.CombineToPDF, com um valor PdfConformance selecionando o nível de conformidade de saída.
O IronPDF trabalha no nível de documento: carrega cada PDF com PdfDocument.FromFile(), faz a fusão com o método estático PdfDocument.Merge() e salva. Os documentos podem ser passados diretamente ou como um enumerável. Saiba mais sobre como mesclar e dividir PDFs .
Exemplo 3: Adicionando marcas d'água
Before (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 Class
Após (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 Class
Este exemplo destaca uma diferença arquitetônica fundamental. O GdPicture usa uma abordagem de chamada de desenho procedural: adicione uma fonte padrão, depois itere (baseado em 1) por cada página chamando SelectPage, SetFillAlpha, SetTextSize, SetOriginRotationInDegrees e DrawTextBox. Alfa está em uma escala de bytes 0–255, rotação é definida como uma propriedade de estado gráfico e posicionamento é tratado através de coordenadas explícitas.
O IronPDF usa uma abordagem baseada em HTML: o método ApplyWatermark() aceita uma string HTML com estilização CSS e aplica-a a todas as páginas em uma única chamada. Você controla a aparência através de propriedades CSS familiares (color, opacity, font-size) em vez de chamadas gráficas primitivas. Esta abordagem também suporta conteúdo mais rico — gradientes, imagens e layouts mais complexos — na mesma string. Consulte a documentação da marca d'água para exemplos avançados.
Notas críticas sobre migração
Superfície de Entrada HTML
O carregador HTML da GdPicture é baseado em arquivo/URL;IronPDF aceita strings HTML diretamente:
// 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")
Se você precisar de operações assíncronas, o IronPDF fornece variantes assíncronas como RenderHtmlAsPdfAsync().
Dependência de Navegador Externo
O renderizador HTML do GdPicture depende de uma instalação do Chrome ou Edge no sistema (ou um caminho portátil que você define via SetWebBrowserPath). O IronPDF vem com seu próprio Chromium incorporado:
// 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)
Alteração do padrão de configuração
A GdPicture expõe configurações de layout como valores por propriedade no conversor (largura/altura da página HTML em polegadas, margens individuais). O IronPDF os agrupa em um saco RenderingOptions com tamanhos de papel nomeados:
// 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)
De Marcadores de Água Procedurais para Marcadores de Água HTML
Substitua chamadas de desenho primitivas com uma única string 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)
Tratamento de números de página
O GdPicture não possui um modelo de cabeçalho/rodapé de primeira classe — os números de página são desenhados por página em um loop. O IronPDF expõe espaços reservados integrados {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}"
}
Indexação de páginas
O GdPicture é baseado em 1 (SelectPage(1) é a primeira página). O IronPDFpdf.Pages e pdf.RemovePages(int) são baseados em 0. Fora de um por ser o bug de portabilidade mais comum:
// 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)
Solução de problemas
Problema 1: GdPictureDocumentConverter Não Encontrado
Problem: GdPictureDocumentConverter class doesn't exist in IronPDF.
Solution: Use ChromePdfRenderer for 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()
Problema 2: GdPicturePDF Não Encontrado
Problem: GdPicturePDF class doesn't exist in IronPDF.
Solution: Use 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")
Problema 3: DrawTextBox / SetFillAlpha Não Encontrado
Problema: as chamadas de desenho primitivas não existem em IronPDF.
Solução: Utilize marcas d'água baseadas em 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)
Problema 4: CombineToPDF Não Encontrado
Problema: método de combinação baseado em caminho não existe.
Solução: Carregue cada PDF como um PdfDocument e use o estático 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")
Problema 5: Índice de Página Fora de Um
Problema: GdPicture usa índices de página baseados em 1;IronPDF usa baseados em 0. Conversões diretas de SelectPage(1) para pdf.Pages[1] pulam a primeira página.
Solução: Subtrair um ao portar índices de página:
// 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)
Lista de verificação para migração
Pré-migração
- Faça o inventário de todos os usos de GdPicture / PSPDFKit / Nutrient na base de código
- Note a indexação em 1 vs 0 no código GdPicture existente
- Defina o conjunto de configuração em
GdPictureDocumentConverter(dimensões da página HTML, margens) - Identifique o desenho procedural para marcas d'água e cabeçalhos (
SetFillAlpha,DrawTextBox) - Revise o código de campos de formulário que utiliza acesso baseado em índice (
GetFormFieldName(i)) - Obtenha a chave de licença do IronPDF
Alterações no pacote
- Remova o pacote NuGet
GdPicture(eGdPicture.WPF/GdPicture.WinForms, se presente) - Remova o pacote legado
PSPDFKit.NET, se presente - Instale o pacote NuGet
IronPdf:dotnet add package IronPdf - Atualize importações de namespace (
using GdPicture14;→using IronPdf;)
Alterações no código
- Adicionar configuração de chave de licença na inicialização
- Substitua
new GdPictureDocumentConverter()pornew ChromePdfRenderer()para HTML/URL → PDF - Substitua
new GdPicturePDF()+LoadFromFileporPdfDocument.FromFile() - Substitua
converter.CombineToPDF(paths, ...)porPdfDocument.Merge() - Converta chamadas de desenho de marca d'água procedurais para
pdf.ApplyWatermark(html, ...) - Substitua propriedades do conversor por
RenderingOptions(tamanhos de papel nomeados, margens em mm) - Atualize cabeçalhos/rodapés para
HtmlHeaderFootercom os tokens{page}/{total-pages} - Converta índices de página baseados em 1 para baseados em 0 em todo o documento
Pós-migração
- Remova a dependência de Chrome / Edge do sistema das imagens de implantação se estava lá apenas para GdPicture
- Execute testes de regressão comparando a saída em PDF.
- Verificar se os cabeçalhos/rodapés correspondem aos números de página.
- Teste de renderização de marca d'água
- Atualizar o pipeline de CI/CD
- {(i: (Nutrient, PSPDFKit, GdPicture e ORPALIS são marcas registradas de seus respectivos proprietários. Este site não é afiliado, endossado ou patrocinado por Nutrient, PSPDFKit, GdPicture ou ORPALIS. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.

