IRONSOFTWAREHOME
FILMY

Jak przekonwertować XAML na PDF w NET MAUI

Curtis Chau
Curtis Chau
Updated: 19 lipca 2026

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:

  1. Przetwarzanie na serwerach zewnętrznych: Każdy generowany PDF wymaga wysłania twojego HTML/danych na serwery pdforge — twoje dokumenty opuszczają twoją infrastrukturę.

  2. 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.

  3. 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.

  4. Zależność od internetu: Brak generowania PDF, gdy sieć nie jest dostępna.

  5. Limity transferu: Limity użytkowania API mogą ograniczać aplikacje o dużym wolumenie.

  6. Opóźnienia sieciowe: Czas podróży w obie strony dodaje sekundy do każdego generowania PDF.

Porównanie pdforge vs IronPDF

FunkcjapdforgeIronPDF
Typ wdrożeniaAPI oparte na chmurzeBiblioteka lokalna
ZależnościWymaga internetu i uwierzytelnienia APIBrak zależności zewnętrznych
DostosowanieOgraniczona kontrola nad generowaniem PDFPełna kontrola nad dostosowywaniem
Struktura kosztówAktywna subskrypcjaOpcja jednorazowego zakupu
BezpieczeństwoPotencjalne obawy z przesyłaniem danych przez internetPrzechowuje przetwarzanie danych całkowicie w środowisku lokalnym
Złożoność konfiguracjiŁatwiejsze wstępne ustawienie dzięki zewnętrznemu przetwarzaniuWymaga 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

  1. Środowisko .NET: .NET Framework 4.6.2+ lub .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Dostęp do NuGet: Możliwość instalowania pakietów NuGet
  3. 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
SHELL

Konfiguracja licencji

// Add at application startup (Program.cs or Startup.cs)
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" .
SHELL

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;

Mapowanie głównych koncepcji

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: koperta JSON z signedUrlPdfDocument
Return: byte[] (po pobraniu signedUrl)pdf.BinaryData

Mapowanie operacji

pdforgeIronPDF
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 pdfParamsIronPDF (RenderingOptions)
format: "A4"renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
landscape: truerenderer.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 IronPDFOpis
PdfDocument.Merge()Łączenie wielu plików PDF
pdf.ExtractAllText()Wyodrębniaj tekst z PDF
pdf.ApplyWatermark()Dodaj znaki wodne
pdf.SecuritySettingsOchrona hasłem
pdf.FormWypeł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);
    }
}

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

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

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

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

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

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

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

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)
C#

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

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;

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
C#

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

Wyodrębnianie tekstu

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

Znaki wodne

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

Ochrona hasłem

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

Podsumowanie porównania funkcji

FunkcjapdforgeIronPDF
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.Json używane tylko do wywołań pdforge
  • Dodaj using IronPdf; i using IronPdf.Rendering; dla enumów rozmiaru papieru i orientacji
  • Zastąp uwierzytelniony HttpClient z ChromePdfRenderer
  • Zastąp POST /v1/html-to-pdf/sync z RenderHtmlAsPdf()
  • Zamień schemat pobierania URL-a a potem POST na RenderUrlAsPdf()
  • Zastąp dwustopniowy GetByteArrayAsync(signedUrl) + File.WriteAllBytes() na pdf.SaveAs()
  • Przenieś pdfParams.format do RenderingOptions.PaperSize
  • Przenieś pdfParams.landscape do RenderingOptions.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 Bearer na jednorazowy IronPdf.License.LicenseKey przy 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)

Zwróć uwagę: pdforge i pdf noodle są znakami towarowymi odpowiedniego właściciela. Ta strona nie jest powiązana, popierana ani sponsorowana przez właściciela pdforge / pdf noodle. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.
Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Your trial license will be sent to your email address

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta