IRONSOFTWAREHOME
MIGRATION GUIDES

How to Migrate from pdforge to IronPDF in C#

Curtis Chau
Curtis Chau
Updated: July 19, 2026

Why Migrate from pdforge to IronPDF

Understanding pdforge

pdforge (rebranded to "pdf noodle" in 2026 - pdfnoodle.com; the api.pdforge.com hostname continues to work via 301 redirects through end of 2026) is a cloud-based, template-driven PDF generation API, offering a straightforward way to produce PDF files by integrating with your application through HTTP calls. There is no official .NET SDK on NuGet - integration is done with HttpClient against the documented REST endpoints. By offloading the task of PDF creation to an external API, developers can simplify the development process. However, pdforge presents drawbacks such as external dependencies, limited customization options, and ongoing subscription costs that developers should be aware of.

The Cloud API Dependency Problem

pdforge processes all documents on external cloud servers. This architecture creates significant concerns for production applications:

  1. External Server Processing: Every PDF you generate requires sending your HTML/data to pdforge's servers - your documents leave your infrastructure.
  2. Privacy & Compliance Risks: Sensitive data travels over the internet to third-party servers. When using pdforge, developers need to accommodate security concerns related to data being sent to an external API. If the PDF content includes sensitive information, this could be a critical consideration.
  3. Ongoing Subscription Costs: Monthly fees accumulate indefinitely with no asset ownership. pdforge's SaaS model introduces continuous operational expenditure which can accumulate over time.
  4. Internet Dependency: No PDF generation when network is unavailable.
  5. Rate Limits: API usage caps can throttle high-volume applications.
  6. Network Latency: Round-trip time adds seconds to every PDF generation.

pdforge vs IronPDF Comparison

FeaturepdforgeIronPDF
Deployment TypeCloud-based APILocal library
DependenciesRequires internet and API authenticationNo external dependencies
CustomizationLimited control over PDF generationFull control over customization
Cost StructureOngoing subscriptionOne-time purchase option
SecurityPotential concerns with data sent over the webKeeps data processing entirely within the local environment
Setup ComplexityEasier initial setup due to external handlingRequires more initial setup and configuration

IronPDF differentiates itself by providing a fully local library, granting developers complete control over the PDF creation process. This is particularly advantageous for applications where internal handling of files is preferred, or where external API calls introduce security concerns. IronPDF processes everything locally, minimizing such risks.

For teams planning .NET 10 and C# 14 adoption on current .NET versions, IronPDF provides a local processing foundation that eliminates cloud dependency while adding comprehensive PDF manipulation capabilities.


Before You Start

Prerequisites

  1. .NET Environment: .NET Framework 4.6.2+ or .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet Access: Ability to install NuGet packages
  3. IronPDF License: Obtain your license key from ironpdf.com

NuGet Package Changes

# 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

License Configuration

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Identify pdforge Usage

# 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

Complete API Reference

Namespace Changes

// 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;

Core Concept Mappings

pdforge (REST)IronPDF
HttpClient + Authorization: Bearer pdfnoodle_api_...new ChromePdfRenderer()
POST https://api.pdfnoodle.com/v1/html-to-pdf/syncrenderer.RenderHtmlAsPdf(html)
JSON body { html, pdfParams }ChromePdfRenderer + RenderingOptions
Response: JSON envelope with signedUrlPdfDocument
Return: byte[] (after fetching signedUrl)pdf.BinaryData

Operation Mappings

pdforgeIronPDF
POST /v1/html-to-pdf/sync with { html }renderer.RenderHtmlAsPdf(html)
Fetch URL, then POST its HTML (no dedicated URL endpoint)renderer.RenderUrlAsPdf(url)
Download signedUrl then File.WriteAllBytes(path, bytes)pdf.SaveAs(path)
await http.GetByteArrayAsync(signedUrl)pdf.BinaryData

Configuration Mappings

pdforge pdfParamsIronPDF (RenderingOptions)
format: "A4"renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
landscape: truerenderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
margin: { top: "20px" }renderer.RenderingOptions.MarginTop = 20
footerTemplate with <span class="pageNumber"> / <span class="totalPages">TextFooter = new TextHeaderFooter { CenterText = "Page {page} of {total-pages}" }

New Features Not Available in pdforge

IronPDF FeatureDescription
PdfDocument.Merge()Combine multiple PDFs
pdf.ExtractAllText()Extract text from PDFs
pdf.ApplyWatermark()Add watermarks
pdf.SecuritySettingsPassword protection
pdf.FormForm filling
pdf.SignWithDigitalSignature()Digital signatures

Code Migration Examples

Example 1: HTML String to PDF Conversion

Before (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);
    }
}

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

The fundamental difference here is the processing model and return type. pdforge requires an authenticated HttpClient POST to https://api.pdfnoodle.com/v1/html-to-pdf/sync, which returns a JSON envelope containing a signed S3 URL - you then fetch the PDF bytes from that URL and write them with File.WriteAllBytes().

IronPDF uses ChromePdfRenderer with RenderHtmlAsPdf() which returns a PdfDocument object. This object can be saved directly with SaveAs(), or you can access pdf.BinaryData if you need the raw bytes. The PdfDocument also allows manipulation (add watermarks, merge with other PDFs, add security) before saving. See the HTML to PDF documentation for comprehensive examples.

Example 2: URL to PDF Conversion

Before (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);
    }
}

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

pdforge has no dedicated URL-to-PDF endpoint - you fetch the page yourself, then post its HTML to the sync endpoint and download the result from the returned signed URL. IronPDF uses RenderUrlAsPdf() on ChromePdfRenderer, returning a PdfDocument with the built-in SaveAs() method.

The key advantage with IronPDF is that the URL is fetched and rendered locally using a Chromium engine - no data is sent to external servers. IronPDF, being a local library, may offer better performance as there is no round-trip time involved in web requests. Learn more about URL to PDF conversion.

Example 3: HTML File to PDF with Custom Settings

Before (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);
    }
}

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

This example shows the configuration pattern difference. pdforge passes options as JSON fields inside a pdfParams object on the POST body (format = "A4", landscape = true), following Chromium/Puppeteer naming conventions.

IronPDF uses the RenderingOptions property with strongly-typed enums: renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 and renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape. This provides IntelliSense support and compile-time type safety. Note that IronPDF requires importing IronPdf.Rendering namespace for the paper size and orientation enums. See the tutorials for more configuration examples.


Critical Migration Notes

Return Type Change

pdforge returns a JSON envelope with a signed URL; IronPDF returns 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

Generator Change

// 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();

Operation Changes

// 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)

Save Method Change

// 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");

Configuration Location Change

pdforge passes options as JSON fields on pdfParams; IronPDF uses 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;

Header/Footer Placeholder Syntax

pdforge inherits Chromium's header/footer template format - HTML fragments containing <span class="..."></span> elements that the engine substitutes at render time. IronPDF uses bracketed placeholders inside a 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

New Capabilities After Migration

After migrating to IronPDF, you gain capabilities that pdforge cannot provide:

PDF Merging

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

Text Extraction

var pdf = PdfDocument.FromFile("document.pdf");
string allText = pdf.ExtractAllText();

Watermarks

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

Password Protection

pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";

Feature Comparison Summary

FeaturepdforgeIronPDF
HTML to PDF
URL to PDF
Page Settings
Offline Capable
Local Processing
Merge PDFs
Split PDFs
Extract Text
Watermarks
Form Filling
Digital Signatures
Password Protection
No Rate Limits
One-Time License

Migration Checklist

Pre-Migration

  • Inventory all pdforge / pdf noodle endpoint calls in codebase (api.pdforge.com, api.pdfnoodle.com)
  • Document current pdfParams JSON configuration used (page size, orientation, margins)
  • Identify Chromium-style header/footer templates (<span class="pageNumber">, <span class="totalPages">) to convert to IronPDF placeholders ({page}, {total-pages})
  • Plan IronPDF license key storage (environment variables recommended)
  • Test with IronPDF trial license first

Package Changes

  • pdforge has no .NET SDK on NuGet - there is no competitor package to remove
  • Install IronPdf NuGet package: dotnet add package IronPdf

Code Changes

  • Remove System.Net.Http / System.Text.Json imports used only for pdforge calls
  • Add using IronPdf; and using IronPdf.Rendering; for paper size and orientation enums
  • Replace authenticated HttpClient with ChromePdfRenderer
  • Replace POST /v1/html-to-pdf/sync with RenderHtmlAsPdf()
  • Replace fetch-URL-then-POST pattern with RenderUrlAsPdf()
  • Replace the two-step GetByteArrayAsync(signedUrl) + File.WriteAllBytes() with pdf.SaveAs()
  • Move pdfParams.format to RenderingOptions.PaperSize
  • Move pdfParams.landscape to RenderingOptions.PaperOrientation
  • Use PdfPaperSize.A4 / PdfPaperOrientation.Landscape enums
  • Convert Chromium templates to IronPDF placeholders inside TextHeaderFooter / HtmlHeaderFooter
  • Replace per-request Bearer token with one-time IronPdf.License.LicenseKey at startup

Post-Migration

  • Test PDF output quality matches expectations
  • Verify offline operation works
  • Remove API credentials from configuration
  • Add new capabilities (merging, watermarks, security) as needed

Please note: pdforge and pdf noodle are trademarks of their respective owner. This site is not affiliated with, endorsed by, or sponsored by the owner of pdforge / pdf noodle. All product names, logos, and brands are property of their respective owners. Comparisons are for informational purposes only and reflect publicly available information at the time of writing.
Curtis Chau
Technical Writer

Curtis Chau holds a Bachelor’s degree in Computer Science (Carleton University) and specializes in front-end development with expertise in Node.js, TypeScript, JavaScript, and React. Passionate about crafting intuitive and aesthetically pleasing user interfaces, Curtis enjoys working with modern frameworks and creating well-structured, visually appealing manuals.

...
Read More

Related Articles

Key in blue circle

Get your free 30-day Trial Key instantly.

Your trial license will be sent to your email address

No limitations. 100% unlocked. No credit card.

bullet_checkedNo credit card or account creation requiredNo limitations. 100% unlocked. No credit card.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Book your free Live Demo
Booking Badge

Trusted by Millions of Engineers Worldwide

Iron Software's customer logos
Get Your No-Obligation Consult
Complete the form below or email sales@ironsoftware.com
Your details will always be kept confidential.
Trusted by Millions of Engineers Worldwide
Iron Software's customer logos
Get your free 30-day Trial Key instantly.
No credit card or account creation required