Jak przeprowadzić migrację z pdforge do IronPDF w języku C#
Dlaczego warto przejść z pdforge na IronPDF
Zrozumienie pdforge
pdforge (nazwę zmieniono na 'pdf noodle' w 2026 roku — pdfnoodle.com; hostname api.pdforge.com wciąż działa poprzez przekierowania 301 do końca 2026 roku) to bazujący na chmurze, oparty na szablonach interfejs API do generowania PDF, oferujący prosty sposób tworzenia plików PDF poprzez integrację z Twoją aplikacją za pomocą wywołań HTTP. Nie ma oficjalnego SDK .NET na NuGet — integracja odbywa się przy użyciu HttpClient przeciwko udokumentowanym punktom końcowym REST. Dzięki przekazaniu zadania tworzenia PDF do zewnętrznego API, deweloperzy mogą uprościć proces tworzenia. Jednak pdforge przedstawia wady, takie jak zewnętrzne zależności, ograniczone opcje dostosowywania i ciągłe koszty abonamentowe, o których deweloperzy powinni być świadomi.
Problem zależności od API chmurowego
pdforge przetwarza wszystkie dokumenty na zewnętrznych serwerach chmurowych. Ta architektura stwarza znaczące obawy dla aplikacji produkcyjnych:
-
Przetwarzanie na serwerach zewnętrznych: Każdy generowany PDF wymaga wysłania twojego HTML/danych na serwery pdforge — twoje dokumenty opuszczają twoją infrastrukturę.
-
Zagrożenia prywatności i zgodności: Wrażliwe dane podróżują przez internet na serwery trzeciej strony. Podczas korzystania z pdforge, deweloperzy muszą uwzględniać obawy dotyczące bezpieczeństwa związane z wysyłaniem danych do zewnętrznego API. Jeśli zawartość PDF zawiera poufne informacje, może to być kluczowe rozważenie.
-
Stałe koszty abonamentowe: Miesięczne opłaty gromadzą się w nieskończoność bez posiadania aktywów. Model SaaS pdforge wprowadza ciągłe wydatki operacyjne, które mogą się akumulować w czasie.
-
Zależność od internetu: Brak generowania PDF, gdy sieć nie jest dostępna.
-
Limity transferu: Limity użytkowania API mogą ograniczać aplikacje o dużym wolumenie.
- Opóźnienia sieciowe: Czas podróży w obie strony dodaje sekundy do każdego generowania PDF.
Porównanie pdforge vs IronPDF
| Funkcja | pdforge | IronPDF |
|---|---|---|
| Typ wdrożenia | API oparte na chmurze | Biblioteka lokalna |
| Zależności | Wymaga internetu i uwierzytelnienia API | Brak zależności zewnętrznych |
| Dostosowanie | Ograniczona kontrola nad generowaniem PDF | Pełna kontrola nad dostosowywaniem |
| Struktura kosztów | Aktywna subskrypcja | Opcja jednorazowego zakupu |
| Bezpieczeństwo | Potencjalne obawy z przesyłaniem danych przez internet | Przechowuje przetwarzanie danych całkowicie w środowisku lokalnym |
| Złożoność konfiguracji | Łatwiejsze wstępne ustawienie dzięki zewnętrznemu przetwarzaniu | Wymaga więcej wstępnych ustawień i konfiguracji |
IronPDF wyróżnia się, dostarczając w pełni lokalną bibliotekę, zapewniając deweloperom pełną kontrolę nad procesem tworzenia PDF. Jest to szczególnie korzystne dla aplikacji, gdzie preferowane jest wewnętrzne przetwarzanie plików, lub gdzie wywołania zewnętrzne API wprowadzają problemy z bezpieczeństwem.IronPDF przetwarza wszystko lokalnie, minimalizując takie ryzyka.
Dla zespołów planujących wdrożenie .NET 10 i C# 14 na bieżących wersjach .NET,IronPDF dostarcza lokalną podstawę przetwarzania, która eliminuje zależność od chmury, dodając jednocześnie rozbudowane możliwości manipulacji PDF.
Zanim zaczniesz
Wymagania wstępne
- Środowisko .NET: .NET Framework 4.6.2+ lub .NET Core 3.1+ / .NET 5/6/7/8/9+
- Dostęp do NuGet: Możliwość instalowania pakietów NuGet
- Licencja IronPDF: Uzyskaj klucz licencyjny na stronie ironpdf.com
Zmiany w pakiecie 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
Konfiguracja licencji
// 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"
Identyfikacja użycia 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" .
Kompletna dokumentacija API
Zmiany w przestrzeni nazw
// 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
Mapowanie głównych koncepcji
| pdforge (REST) | IronPDF |
|---|---|
HttpClient + Authorization: Bearer pdfnoodle_api_... |
new ChromePdfRenderer() |
POST https://api.pdfnoodle.com/v1/html-to-pdf/sync |
renderer.RenderHtmlAsPdf(html) |
JSON body { html, pdfParams } |
ChromePdfRenderer + RenderingOptions |
Response: koperta JSON z signedUrl |
PdfDocument |
Return: byte[] (po pobraniu signedUrl) |
pdf.BinaryData |
Mapowanie operacji
| pdforge | IronPDF |
|---|---|
POST /v1/html-to-pdf/sync z { html } |
renderer.RenderHtmlAsPdf(html) |
| Pobierz URL, następnie POST jego HTML (brak dedykowanego punktu końcowego URL) | renderer.RenderUrlAsPdf(url) |
Pobierz signedUrl następnie File.WriteAllBytes(path, bytes) |
pdf.SaveAs(path) |
await http.GetByteArrayAsync(signedUrl) |
pdf.BinaryData |
Mapowania konfiguracji
pdforge pdfParams |
IronPDF (RenderingOptions) |
|---|---|
format: "A4" |
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 |
landscape: true |
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape |
margin: { top: "20px" } |
renderer.RenderingOptions.MarginTop = 20 |
footerTemplate z <span class="pageNumber"> / <span class="totalPages"> |
TextFooter = new TextHeaderFooter { CenterText = "Page {page} of {total-pages}" } |
Nowe funkcje niedostępne w pdforge
| Funkcja IronPDF | Opis |
|---|---|
PdfDocument.Merge() |
Łączenie wielu plików PDF |
pdf.ExtractAllText() |
Wyodrębniaj tekst z PDF |
pdf.ApplyWatermark() |
Dodaj znaki wodne |
pdf.SecuritySettings |
Ochrona hasłem |
pdf.Form |
Wypełnianie formularzy |
pdf.SignWithDigitalSignature() |
Podpisy cyfrowe |
Przykłady migracji kodu
Przykład 1: Konwersja ciągu znaków HTML do formatu PDF
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);
}
}
// 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
Po (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
Podstawowa różnica tutaj to model przetwarzania i typ zwracany. pdforge wymaga uwierzytelnionego HttpClient POST do https://api.pdfnoodle.com/v1/html-to-pdf/sync, który zwraca kopertę JSON zawierającą podpisany URL S3 — następnie pobierasz bajty PDF z tego URL-a i zapisujesz je przy użyciu File.WriteAllBytes().
IronPDF używa ChromePdfRenderer z RenderHtmlAsPdf(), który zwraca obiekt PdfDocument. Ten obiekt można zapisać bezpośrednio przy użyciu SaveAs() albo uzyskać dostęp do pdf.BinaryData, jeśli potrzebne są surowe bajty. PdfDocument pozwala także na manipulację (dodawanie znaków wodnych, łączenie z innymi PDF, dodawanie zabezpieczeń) przed zapisaniem. Kompleksowe przykłady można znaleźć w dokumentacji dotyczącej konwersji HTML do PDF.
Przykład 2: Konwersja adresów URL do formatu PDF
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);
}
}
// 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
Po (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
pdforge nie posiada dedykowanego punktu końcowego URL-to-PDF — pobierasz stronę samodzielnie, następnie publikujesz jej HTML do punktu końcowego synchronizacji i pobierasz wynik z otrzymanego podpisanego URL.IronPDF używa RenderUrlAsPdf() na ChromePdfRenderer, zwracając PdfDocument z wbudowaną metodą SaveAs().
Kluczowa zaleta IronPDF polega na tym, że URL jest pobierany i renderowany lokalnie z użyciem silnika Chromium — żadne dane nie są wysyłane do zewnętrznych serwerów. IronPDF, jako biblioteka lokalna, może oferować lepszą wydajność, jako że nie ma czasu podróży w obie strony w żądaniach sieciowych. Dowiedz się więcej o konwersji adresów URL do formatu PDF.
Przykład 3: Plik HTML do PDF z ustawieniami niestandardowymi
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);
}
}
// 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
Po (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
Ten przykład pokazuje różnicę w wzorcach konfiguracji. pdforge przekazuje opcje jako pola JSON w obiekcie pdfParams w ciele POST (format = "A4", landscape = true), zgodnie z konwencjami nazewnictwa Chromium/Puppeteer.
IronPDF używa właściwości RenderingOptions z silnie typowanymi enumami: renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 i renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape. Zapewnia to obsługę IntelliSense oraz bezpieczeństwo typów w czasie kompilacji. Pamiętaj, że IronPDF wymaga importowania przestrzeni nazw IronPdf.Rendering dla enumów rozmiaru papieru i orientacji. Więcej przykładów konfiguracji można znaleźć w samouczkach.
Ważne uwagi dotyczące migracji
Zmiana typu zwracanej wartości
pdforge zwraca kopertę JSON z podpisanym URL;IronPDF zwraca 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
Zmiana generatora
// 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
Zmiany operacji
// 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)
Zmiana metody zapisywania
// 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")
Zmiana lokalizacji konfiguracji
pdforge przekazuje opcje jako pola JSON na pdfParams;IronPDF wykorzystuje 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
Składnia symboli zastępczych nagłówków/stopek
pdforge wykorzystuje format szablonów nagłówka/stopki Chromium — fragmenty HTML zawierające elementy <span class="..."></span>, które silnik zastępuje w momencie renderowania.IronPDF używa nawiasowanych miejsc na zamienniki wewnątrz 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
Nowe możliwości po migracji
Po migracji do IronPDF zyskujesz możliwości, których pdforge nie jest w stanie zapewnić:
Łączenie plików PDF
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")
Wyodrębnianie tekstu
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()
Znaki wodne
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>")
Ochrona hasłem
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword"
pdf.SecuritySettings.OwnerPassword = "ownerpassword"
Podsumowanie porównania funkcji
| Funkcja | pdforge | IronPDF |
|---|---|---|
| HTML do PDF | ✓ | ✓ |
| URL do pliku PDF | ✓ | ✓ |
| Ustawienia strony | ✓ | ✓ |
| Możliwość pracy w trybie offline | ✗ | ✓ |
| Przetwarzanie lokalne | ✗ | ✓ |
| Łączenie plików PDF | ✗ | ✓ |
| Podział plików PDF | ✗ | ✓ |
| Wyodrębnij tekst | ✗ | ✓ |
| Znaki wodne | ✗ | ✓ |
| Wypełnianie formularzy | ✗ | ✓ |
| Podpisy cyfrowe | ✗ | ✓ |
| Ochrona hasłem | ✗ | ✓ |
| Brak limitów stawek | ✗ | ✓ |
| Licencja jednorazowa | ✗ | ✓ |
Lista kontrolna migracji
Przed migracją
- Inwentaryzuj wszystkie wywołania punktów końcowych pdforge / pdf noodle w kodzie (
api.pdforge.com,api.pdfnoodle.com) - Dokumentuj aktualną konfigurację JSON
pdfParams(rozmiar strony, orientacja, marginesy) - Zidentyfikuj szablony nagłówka/stopki w stylu Chromium (
<span class="pageNumber">,<span class="totalPages">) do konwersji na miejsca na zamienniki IronPDF({page},{total-pages}) - Zaplanuj przechowywanie klucza licencyjnego IronPDF(zalecane są zmienne środowiskowe)
- Najpierw przetestuj z Licencją Trial IronPDF
Zmiany w pakiecie
- pdforge nie posiada SDK .NET na NuGet — nie ma konkurencyjnego pakietu do usunięcia
- Zainstaluj pakiet NuGet
IronPdf:dotnet add package IronPdf
Zmiany w kodzie
- Usuń importy
System.Net.Http/System.Text.Jsonużywane tylko do wywołań pdforge - Dodaj
using IronPdf;iusing IronPdf.Rendering;dla enumów rozmiaru papieru i orientacji - Zastąp uwierzytelniony
HttpClientzChromePdfRenderer - Zastąp
POST /v1/html-to-pdf/synczRenderHtmlAsPdf() - Zamień schemat pobierania URL-a a potem POST na
RenderUrlAsPdf() - Zastąp dwustopniowy
GetByteArrayAsync(signedUrl)+File.WriteAllBytes()napdf.SaveAs() - Przenieś
pdfParams.formatdoRenderingOptions.PaperSize - Przenieś
pdfParams.landscapedoRenderingOptions.PaperOrientation - Użyj enuma
PdfPaperSize.A4/PdfPaperOrientation.Landscape - Przekształć szablony Chromium na miejsca na zamienniki w IronPDF wewnątrz
TextHeaderFooter/HtmlHeaderFooter - Zastąp token per-request
Bearerna jednorazowyIronPdf.License.LicenseKeyprzy uruchamianiu
Po migracji
- Sprawdź, czy jakość pliku PDF odpowiada oczekiwaniom
- Sprawdź, czy działa w trybie offline
- Usuń poświadczenia API z konfiguracji
- W razie potrzeby dodaj nowe funkcje (scałanie, znaki wodne, zabezpieczenia)

