Ir para o conteúdo do rodapé
GUIAS DE MIGRAçãO

Como migrar do pdforge para o IronPDF em C#

Por que migrar do pdforge para o IronPDF?

Entendendo o pdforge

pdforge (rebatizado para "pdf noodle" em 2026 — pdfnoodle.com; o nome de host api.pdforge.com continua a funcionar via redirecionamentos 301 até o final de 2026) é uma API de geração de PDF baseada na nuvem, orientada por modelos, que oferece uma maneira simples de produzir arquivos PDF integrando-se ao seu aplicativo por meio de chamadas HTTP. Não há um SDK oficial .NET no NuGet — a integração é feita com HttpClient em relação aos endpoints REST documentados. Ao delegar a tarefa de criação de PDFs a uma API externa, os desenvolvedores podem simplificar o processo de desenvolvimento. No entanto, o pdforge apresenta desvantagens como dependências externas, opções de personalização limitadas e custos contínuos de assinatura, que os desenvolvedores devem levar em consideração.

O problema de dependência da API na nuvem

O pdforge processa todos os documentos em servidores externos na nuvem. Essa arquitetura gera preocupações significativas para aplicações em produção:

  1. Processamento em servidor externo: Cada PDF gerado requer o envio do seu HTML/dados para os servidores da pdforge — seus documentos saem da sua infraestrutura.

  2. Riscos de privacidade e conformidade: Dados sensíveis trafegam pela internet para servidores de terceiros. Ao usar o pdforge, os desenvolvedores precisam levar em consideração as preocupações de segurança relacionadas aos dados enviados para uma API externa. Se o conteúdo do PDF incluir informações confidenciais, isso pode ser um fator crítico a ser considerado.

  3. Custos contínuos de assinatura: As taxas mensais acumulam-se indefinidamente sem aquisição de ativos. O modelo SaaS da pdforge introduz despesas operacionais contínuas que podem acumular-se ao longo do tempo.

  4. Dependência da Internet: Não há geração de PDF quando a rede não está disponível.

  5. Limites de taxa: os limites de uso da API podem restringir o desempenho de aplicativos de alto volume.

  6. Latência de rede: O tempo de ida e volta adiciona segundos a cada geração de PDF.

Comparação entre pdforge e IronPDF

Recurso pdforge IronPDF
Tipo de implantação API baseada em nuvem Biblioteca local
Dependências Requer internet e autenticação de API. Sem dependências externas
Personalização Controle limitado sobre a geração de PDFs Controle total sobre a personalização.
Estrutura de custos Assinatura contínua Opção de compra única
Segurança Possíveis problemas com dados enviados pela internet Mantém o processamento de dados inteiramente dentro do ambiente local.
Complexidade de configuração Configuração inicial mais fácil devido ao manuseio externo. Requer mais configuração inicial.

O IronPDF se diferencia por fornecer uma biblioteca totalmente local, concedendo aos desenvolvedores controle completo sobre o processo de criação de PDFs. Isso é particularmente vantajoso para aplicações onde o gerenciamento interno de arquivos é preferido, ou onde chamadas de API externas introduzem preocupações de segurança. O IronPDF processa tudo localmente, minimizando esses riscos.

Para equipes planejando adoção do .NET 10 e C# 14 nas versões atuais do .NET, o IronPDF fornece uma base de processamento local que elimina a dependência de nuvem enquanto adiciona capacidades abrangentes de manipulação de PDF.


Antes de começar

Pré-requisitos

  1. Ambiente .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Acesso ao NuGet : Capacidade de instalar pacotes NuGet.
  3. Licença do IronPDF: Obtenha sua chave de licença em IronPDF

Alterações no pacote NuGet

# pdforge has no official .NET SDK on NuGet — integration is HttpClient + JSON.
# If your project depends only on built-in System.Net.Http, there is no
# competitor package to remove. Just install IronPDF:
dotnet add package IronPdf
# pdforge has no official .NET SDK on NuGet — integration is HttpClient + JSON.
# If your project depends only on built-in System.Net.Http, there is no
# competitor package to remove. Just install IronPDF:
dotnet add package IronPdf
SHELL

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

Identificar o uso do pdforge

# Find pdforge / pdf noodle endpoint usage
grep -r "api\.pdforge\.com\|api\.pdfnoodle\.com" --include="*.cs" .

# Find API key / Bearer token references
grep -r "pdfnoodle_api_\|pdforge_api_" --include="*.cs" --include="*.json" --include="*.config" .

# Find Chromium header/footer templates that need migrating
grep -r "totalPages\|pageNumber\|footerTemplate\|headerTemplate" --include="*.cs" .
# Find pdforge / pdf noodle endpoint usage
grep -r "api\.pdforge\.com\|api\.pdfnoodle\.com" --include="*.cs" .

# Find API key / Bearer token references
grep -r "pdfnoodle_api_\|pdforge_api_" --include="*.cs" --include="*.json" --include="*.config" .

# Find Chromium header/footer templates that need migrating
grep -r "totalPages\|pageNumber\|footerTemplate\|headerTemplate" --include="*.cs" .
SHELL

Referência completa da API

Alterações de namespace

// Before: pdforge — raw HttpClient against api.pdfnoodle.com
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: pdforge — raw HttpClient against api.pdfnoodle.com
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Text
Imports System.Text.Json

Imports IronPdf
Imports IronPdf.Rendering
$vbLabelText   $csharpLabel

Mapeamento de Conceitos Fundamentais

pdforge (REST) IronPDF
HttpClient + Authorization: Bearer pdfnoodle_api_... new ChromePdfRenderer()
POST https://api.pdfnoodle.com/v1/html-to-pdf/sync renderer.RenderHtmlAsPdf(html)
Corpo JSON { html, pdfParams } ChromePdfRenderer + RenderingOptions
Resposta: envelope JSON com signedUrl PdfDocument
Retornar: byte[] (após recuperar signedUrl) pdf.BinaryData

Mapeamentos de Operação

pdforge IronPDF
POST /v1/html-to-pdf/sync com { html } renderer.RenderHtmlAsPdf(html)
Buscar URL, depois POSTar seu HTML (sem endpoint de URL dedicado) renderer.RenderUrlAsPdf(url)
Baixar signedUrl então File.WriteAllBytes(path, bytes) pdf.SaveAs(path)
await http.GetByteArrayAsync(signedUrl) pdf.BinaryData

Mapeamentos de Configuração

pdforge pdfParams IronPDF(Opções de renderização)
format: "A4" renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
landscape: true renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
margin: { top: "20px" } renderer.RenderingOptions.MarginTop = 20
footerTemplate com <span class="pageNumber"> / <span class="totalPages"> TextFooter = new TextHeaderFooter { CenterText = "Page {page} of {total-pages}" }

Novos recursos não disponíveis no pdforge

Recurso IronPDF Descrição
PdfDocument.Merge() Combinar vários PDFs
pdf.ExtractAllText() Extrair texto de PDFs
pdf.ApplyWatermark() Adicionar marcas d'água
pdf.SecuritySettings Proteção por senha
pdf.Form Preenchimento de formulário
pdf.SignWithDigitalSignature() Assinaturas digitais

Exemplos de migração de código

Exemplo 1: Conversão de string HTML para PDF

Antes (pdforge):

// REST API — no .NET SDK on NuGet. Integration is HttpClient + JSON POST.
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        http.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");

        var body = new { html = "<html><body><h1>Hello World</h1></body></html>" };
        var json = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json");

        var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
        resp.EnsureSuccessStatusCode();

        using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
        var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
// REST API — no .NET SDK on NuGet. Integration is HttpClient + JSON POST.
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        http.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");

        var body = new { html = "<html><body><h1>Hello World</h1></body></html>" };
        var json = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json");

        var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
        resp.EnsureSuccessStatusCode();

        using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
        var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
Imports System.IO
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Using http As New HttpClient()
            http.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY")

            Dim body = New With {.html = "<html><body><h1>Hello World</h1></body></html>"}
            Dim json As New StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json")

            Dim resp = Await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json)
            resp.EnsureSuccessStatusCode()

            Using doc = JsonDocument.Parse(Await resp.Content.ReadAsStringAsync())
                Dim pdfBytes = Await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString())
                File.WriteAllBytes("output.pdf", pdfBytes)
            End Using
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Após (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim html = "<html><body><h1>Hello World</h1></body></html>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

A diferença fundamental aqui reside no modelo de processamento e no tipo de retorno. pdforge requer um POST autenticado HttpClient para https://api.pdfnoodle.com/v1/html-to-pdf/sync, que retorna um envelope JSON contendo uma URL S3 assinada — você então busca os bytes do PDF dessa URL e os escreve com File.WriteAllBytes().

IronPDF usa ChromePdfRenderer com RenderHtmlAsPdf() que retorna um objeto PdfDocument. Este objeto pode ser salvo diretamente com SaveAs(), ou você pode acessar pdf.BinaryData se precisar dos bytes brutos. O PdfDocument também permite manipulação (adicionar marcas d'água, mesclar com outros PDFs, adicionar segurança) antes de salvar. Consulte a documentação de conversão de HTML para PDF para obter exemplos completos.

Exemplo 2: Conversão de URL para PDF

Antes (pdforge):

// REST API — no .NET SDK on NuGet. pdforge has no dedicated URL endpoint;
// fetch the page yourself and POST its HTML to /v1/html-to-pdf/sync.
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        http.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");

        var sourceHtml = await http.GetStringAsync("https://example.com");
        var body = new { html = sourceHtml };
        var json = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json");

        var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
        resp.EnsureSuccessStatusCode();

        using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
        var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
        File.WriteAllBytes("webpage.pdf", pdfBytes);
    }
}
// REST API — no .NET SDK on NuGet. pdforge has no dedicated URL endpoint;
// fetch the page yourself and POST its HTML to /v1/html-to-pdf/sync.
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        http.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");

        var sourceHtml = await http.GetStringAsync("https://example.com");
        var body = new { html = sourceHtml };
        var json = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json");

        var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
        resp.EnsureSuccessStatusCode();

        using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
        var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
        File.WriteAllBytes("webpage.pdf", pdfBytes);
    }
}
Imports System.IO
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Using http As New HttpClient()
            http.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY")

            Dim sourceHtml As String = Await http.GetStringAsync("https://example.com")
            Dim body = New With {Key .html = sourceHtml}
            Dim json As New StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json")

            Dim resp As HttpResponseMessage = Await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json)
            resp.EnsureSuccessStatusCode()

            Using doc As JsonDocument = JsonDocument.Parse(Await resp.Content.ReadAsStringAsync())
                Dim pdfBytes As Byte() = Await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString())
                File.WriteAllBytes("webpage.pdf", pdfBytes)
            End Using
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Após (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

pdforge não possui um endpoint de URL-para-PDF dedicado — você busca a página sozinho, depois envia seu HTML para o endpoint de sincronização e baixa o resultado da URL assinada retornada.IronPDF usa RenderUrlAsPdf() em ChromePdfRenderer, retornando um PdfDocument com o método embutido SaveAs().

A principal vantagem do IronPDF é que a URL é obtida e renderizada localmente usando um mecanismo Chromium — nenhum dado é enviado para servidores externos. O IronPDF, por ser uma biblioteca local, pode oferecer melhor desempenho, pois não há tempo de ida e volta envolvido em solicitações da web. Saiba mais sobre a conversão de URL para PDF .

Exemplo 3: Converter arquivo HTML para PDF com configurações personalizadas

Antes (pdforge):

// REST API — no .NET SDK on NuGet. Page size / orientation flow through the
// optional `pdfParams` object using Chromium/Puppeteer-style names.
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        http.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");

        var htmlContent = File.ReadAllText("input.html");
        var body = new { html = htmlContent, pdfParams = new { format = "A4", landscape = true } };
        var json = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json");

        var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
        resp.EnsureSuccessStatusCode();

        using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
        var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
// REST API — no .NET SDK on NuGet. Page size / orientation flow through the
// optional `pdfParams` object using Chromium/Puppeteer-style names.
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var http = new HttpClient();
        http.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");

        var htmlContent = File.ReadAllText("input.html");
        var body = new { html = htmlContent, pdfParams = new { format = "A4", landscape = true } };
        var json = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json");

        var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
        resp.EnsureSuccessStatusCode();

        using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
        var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
        File.WriteAllBytes("output.pdf", pdfBytes);
    }
}
Imports System.IO
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Using http As New HttpClient()
            http.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY")

            Dim htmlContent As String = File.ReadAllText("input.html")
            Dim body = New With {
                .html = htmlContent,
                .pdfParams = New With {
                    .format = "A4",
                    .landscape = True
                }
            }
            Dim json As New StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json")

            Dim resp As HttpResponseMessage = Await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json)
            resp.EnsureSuccessStatusCode()

            Using doc As JsonDocument = JsonDocument.Parse(Await resp.Content.ReadAsStringAsync())
                Dim pdfBytes As Byte() = Await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString())
                File.WriteAllBytes("output.pdf", pdfBytes)
            End Using
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Após (IronPDF):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        var htmlContent = System.IO.File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        var htmlContent = System.IO.File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
        Dim htmlContent = System.IO.File.ReadAllText("input.html")
        Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Este exemplo mostra a diferença no padrão de configuração. pdforge passa opções como campos JSON dentro de um objeto pdfParams no corpo POST (format = "A4", landscape = true), seguindo as convenções de nomenclatura do Chromium/Puppeteer.

IronPDF usa a propriedade RenderingOptions com enums fortemente tipados: renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 e renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape. Isso proporciona suporte ao IntelliSense e segurança de tipos em tempo de compilação. Note que o IronPDF requer a importação do namespace IronPdf.Rendering para os enums de tamanho e orientação de papel. Consulte os tutoriais para obter mais exemplos de configuração.


Notas críticas sobre migração

Alteração do tipo de retorno

pdforge retorna um envelope JSON com um URL assinado;IronPDF retorna PdfDocument:

// pdforge: Two-step — parse signedUrl from JSON, then fetch bytes from it
var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
File.WriteAllBytes("output.pdf", pdfBytes);

// IronPDF: Returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");           // Direct save
byte[] bytes = pdf.BinaryData;      // Get bytes if needed
// pdforge: Two-step — parse signedUrl from JSON, then fetch bytes from it
var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
File.WriteAllBytes("output.pdf", pdfBytes);

// IronPDF: Returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");           // Direct save
byte[] bytes = pdf.BinaryData;      // Get bytes if needed
Imports System.IO
Imports System.Net.Http
Imports System.Text.Json
Imports IronPdf

' pdforge: Two-step — parse signedUrl from JSON, then fetch bytes from it
Dim resp = Await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json)
Using doc As JsonDocument = JsonDocument.Parse(Await resp.Content.ReadAsStringAsync())
    Dim pdfBytes = Await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString())
    File.WriteAllBytes("output.pdf", pdfBytes)
End Using

' IronPDF: Returns PdfDocument
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")           ' Direct save
Dim bytes As Byte() = pdf.BinaryData ' Get bytes if needed
$vbLabelText   $csharpLabel

Mudança de Gerador

// pdforge: HttpClient against the REST endpoint
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");

// IronPDF: ChromePdfRenderer
var renderer = new ChromePdfRenderer();
// pdforge: HttpClient against the REST endpoint
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");

// IronPDF: ChromePdfRenderer
var renderer = new ChromePdfRenderer();
' pdforge: HttpClient against the REST endpoint
Using http As New HttpClient()
    http.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY")
    ' IronPDF: ChromePdfRenderer
    Dim renderer As New ChromePdfRenderer()
End Using
$vbLabelText   $csharpLabel

Mudanças de Operação

// pdforge operations
await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);   // HTML to PDF
// URL to PDF: fetch the page first, then POST its HTML to the same endpoint

//IronPDF methods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
// pdforge operations
await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);   // HTML to PDF
// URL to PDF: fetch the page first, then POST its HTML to the same endpoint

//IronPDF methods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
' pdforge operations
Await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json) ' HTML to PDF
' URL to PDF: fetch the page first, then POST its HTML to the same endpoint

' IronPDF methods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
$vbLabelText   $csharpLabel

Salvar alteração de método

// pdforge: Two-step — fetch bytes from signed URL, then write to disk
var pdfBytes = await http.GetByteArrayAsync(signedUrl);
File.WriteAllBytes("output.pdf", pdfBytes);

// IronPDF: Built-in save method
pdf.SaveAs("output.pdf");
// pdforge: Two-step — fetch bytes from signed URL, then write to disk
var pdfBytes = await http.GetByteArrayAsync(signedUrl);
File.WriteAllBytes("output.pdf", pdfBytes);

// IronPDF: Built-in save method
pdf.SaveAs("output.pdf");
' pdforge: Two-step — fetch bytes from signed URL, then write to disk
Dim pdfBytes = Await http.GetByteArrayAsync(signedUrl)
File.WriteAllBytes("output.pdf", pdfBytes)

' IronPDF: Built-in save method
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

Alteração do local de configuração

pdforge passa opções como campos JSON em pdfParams;IronPDF usa RenderingOptions:

// pdforge: JSON pdfParams object on the POST body
var body = new { html, pdfParams = new { format = "A4", landscape = true } };

// IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
// pdforge: JSON pdfParams object on the POST body
var body = new { html, pdfParams = new { format = "A4", landscape = true } };

// IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
' pdforge: JSON pdfParams object on the POST body
Dim body = New With {Key .html = html, Key .pdfParams = New With {Key .format = "A4", Key .landscape = True}}

' IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
$vbLabelText   $csharpLabel

Sintaxe de espaço reservado para cabeçalho/rodapé

pdforge herda o formato de modelo de cabeçalho/rodapé do Chromium — fragmentos HTML contendo elementos <span class="..."></span> que o mecanismo substitui no momento da renderização.IronPDF usa placeholders entre colchetes dentro de um TextHeaderFooter / HtmlHeaderFooter:

// pdforge: Chromium template HTML inside pdfParams.footerTemplate
// "<div>Page <span class=\"pageNumber\"></span> of <span class=\"totalPages\"></span></div>"

//IronPDF placeholders
"Page {page} of {total-pages}"  // Note: hyphen in total-pages
// pdforge: Chromium template HTML inside pdfParams.footerTemplate
// "<div>Page <span class=\"pageNumber\"></span> of <span class=\"totalPages\"></span></div>"

//IronPDF placeholders
"Page {page} of {total-pages}"  // Note: hyphen in total-pages
' pdforge: Chromium template HTML inside pdfParams.footerTemplate
' "<div>Page <span class=""pageNumber""></span> of <span class=""totalPages""></span></div>"

' IronPDF placeholders
"Page {page} of {total-pages}"  ' Note: hyphen in total-pages
$vbLabelText   $csharpLabel

Novas funcionalidades após a migração

Após migrar para o IronPDF, você obtém recursos que o pdforge não pode oferecer:

Fusão de PDFs

var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
$vbLabelText   $csharpLabel

Extração de texto

var pdf = PdfDocument.FromFile("document.pdf");
string allText = pdf.ExtractAllText();
var pdf = PdfDocument.FromFile("document.pdf");
string allText = pdf.ExtractAllText();
Dim pdf = PdfDocument.FromFile("document.pdf")
Dim allText As String = pdf.ExtractAllText()
$vbLabelText   $csharpLabel

Marcas d'água

pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>")
$vbLabelText   $csharpLabel

Proteção por senha

pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword"
pdf.SecuritySettings.OwnerPassword = "ownerpassword"
$vbLabelText   $csharpLabel

Resumo da comparação de recursos

Recurso pdforge IronPDF
HTML para PDF
URL para PDF
Configurações da página
Compatível com modo offline
Processamento local
Mesclar PDFs
Dividir PDFs
Texto extraído
Marcas d'água
Preenchimento de formulários
Assinaturas digitais
Proteção por senha
Sem limites de taxa
Licença de uso único

Lista de verificação para migração

Pré-migração

  • Inventariar todas as chamadas de endpoint pdforge / pdf noodle no código (api.pdforge.com, api.pdfnoodle.com).
  • Documentar a configuração JSON pdfParams usada atualmente (tamanho da página, orientação, margens).
  • Identificar os modelos de cabeçalho/rodapé do estilo Chromium (<span class="pageNumber">, <span class="totalPages">) para converter em placeholders do IronPDF({page}, {total-pages}).
  • Planeje o armazenamento da chave de licença do IronPDF(variáveis ​​de ambiente recomendadas)
  • Teste primeiro com a licença de avaliação do IronPDF

Alterações no pacote

  • pdforge não tem SDK .NET no NuGet — não há pacote concorrente para remover
  • Instalar o pacote NuGet IronPdf: dotnet add package IronPdf.

Alterações no código

  • Remover importações System.Net.Http / System.Text.Json usadas apenas para chamadas pdforge.
  • Adicionar using IronPdf; e using IronPdf.Rendering; para enums de tamanho de papel e orientação.
  • Substituir HttpClient autenticado por ChromePdfRenderer.
  • Substituir POST /v1/html-to-pdf/sync por RenderHtmlAsPdf().
  • Substituir padrão fetch-URL-then-POST por RenderUrlAsPdf().
  • Substituir o padrão de duas etapas GetByteArrayAsync(signedUrl) + File.WriteAllBytes() por pdf.SaveAs().
  • Mover pdfParams.format para RenderingOptions.PaperSize.
  • Mover pdfParams.landscape para RenderingOptions.PaperOrientation.
  • Usar enums PdfPaperSize.A4 / PdfPaperOrientation.Landscape.
  • Converter modelos Chromium para placeholders de IronPDF dentro de TextHeaderFooter / HtmlHeaderFooter.
  • Substituir o token Bearer por requisição por IronPdf.License.LicenseKey uma vez na inicialização.

Pós-migração

  • A qualidade de saída do PDF de teste corresponde às expectativas.
  • Verificar se a operação offline funciona
  • Remover credenciais da API da configuração
  • Adicionar novas funcionalidades (fusão, marcas d'água, segurança) conforme necessário.

Observepdforge e pdf noodle são marcas registradas de seus respectivos proprietários. Este site não é afiliado, apoiado ou patrocinado pelo proprietário do pdforge / pdf noodle. 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.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de Suporte Iron

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim