IRONSOFTWAREHOME
FILMY

Jak chronić pliki PDF za pomocą haseł i uprawnień w języku C#

Curtis Chau
Curtis Chau
Updated: 19 lipca 2026

Przejście zGotenbergna IronPDF przekształca przepływ pracy z plikami PDF w środowisku .NET z architektury mikrousług opartej na Dockerze z wywołaniami API HTTP w natywną bibliotekę C# działającą w ramach procesu. Niniejszy przewodnik zawiera kompleksową, szczegółową ścieżkę migracji, która eliminuje obciążenia infrastruktury, opóźnienia sieciowe oraz złożoność zarządzania kontenerami dla profesjonalnych programistów .NET.

Dlaczego warto przejść zGotenbergna IronPDF

Problem architektury Gotenberg

Gotenberg to oparta na Dockerze architektura mikrousług do generowania plików PDF. Chociaż jest to rozwiązanie potężne i elastyczne, wprowadza ono znaczną złożoność do aplikacji C#:

  1. Obciążenie infrastruktury: Wymaga Docker, orkiestracji kontenerów (Kubernetes/Docker Compose), wykrywania usług i równoważenia obciążenia. Każde wdrożenie staje się coraz bardziej złożone.

  2. Opóźnienia sieciowe: Każda operacja na pliku PDF wymaga wywołania HTTP do oddzielnej usługi — co wydłuża czas odpowiedzi o 10–100 ms lub więcej na żądanie. Opóźnienia te szybko się kumulują w scenariuszach o dużej objętości.

  3. Problemy z zimnym startem: Uruchomienie kontenera może wydłużyć czas realizacji pierwszych żądań o 2–5 sekund. Każde ponowne uruchomienie podu, każde skalowanie w górę i każde wdrożenie powoduje uruchomienie od zera.

  4. Złożoność operacyjna: Musisz zarządzać stanem kontenerów, skalowaniem, logowaniem i monitorowaniem jako kwestiami odrębnymi od głównej aplikacji.

  5. Dane formularza wieloczęściowego: Każde żądanie wymaga tworzenia ładunków typu multipart/form-data — są one rozbudowane, podatne na błędy i uciążliwe w utrzymaniu.

  6. Punkty awarii: Przekroczenie limitów czasu sieci, niedostępność usług i awarie kontenerów stają się Twoją odpowiedzialnością.

  7. Zarządzanie wersjami: ObrazyGotenbergsą aktualizowane niezależnie od aplikacji; Zmiany w API mogą nieoczekiwanie zakłócić integrację.

PorównanieGotenbergvs IronPDF

AspektGotenbergIronPDF
WdrożenieKontener Docker + orkiestracjaPojedynczy pakiet NuGet
ArchitekturaMikroserwis (REST API)Biblioteka w procesie
Opóźnienie na żądanie10-100ms+ (cykl sieciowy)< 1ms narzutu
Zimny start2-5 sekund (inicjacja kontenera)1-2 sekund (tylko pierwsze renderowanie)
InfrastrukturaDocker, Kubernetes, balansowanie obciazenNie wymagana
Tryby awariiAwaria sieci, kontenera, usługiStandardowe wyjątki .NET Standard
Styl APIREST multipart/form-dataOryginalne wywolania metody C#
SkalowaniePoziome (więcej kontenerow)Pionowe (w procesie)
DebugowanieKonieczne jest śledzenie rozproszoneStandardowy debugger
Kontrola wersjiTagi obrazów kontenerowWersje pakietow NuGet

Dla zespołów celujących w aktualne wersje .NET,IronPDF zapewnia fundament z zerowymi zależnościami infrastruktury, który integruje się natywnie z nowoczesnymi wzorcami .NET.


Ocena złożoności migracji

Szacowany nakład pracy według funkcji

FunkcjaZłożoność migracji
HTML do PDFBardzo niski
URL do pliku PDFBardzo niski
Niestandardowy rozmiar papieruNiski
MarginesyNiski
Łączenie plików PDFNiski
Nagłówki/stopkiMedium
OpóźnieniaNiski
Konwersja do formatu PDF/ANiski

Zmiana paradygmatu

Podstawową zmianą w tej migracjiGotenbergjest przejście z wywołań API HTTP z wieloczęściowymi danymi formularza na natywne wywołania metod C#:

Gotenberg:  HTTP POST multipart/form-data do kontenera Docker
IronPDF:    Bezpośrednie wywołania metod na obiektach C#
Text

Zanim zaczniesz

Wymagania wstępne

  1. **Wersja .NET:**IronPDF obsługuje .NET Framework 4.6.2+ oraz .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Klucz licencyjny: Uzyskaj klucz licencyjny IronPDF na stronie ironpdf.com
  3. Plan usunięcia infrastruktury: Dokumentacja kontenerówGotenbergw celu wycofania z eksploatacji po migracji

Zidentyfikuj wszystkie wystąpienia Gotenberg

# Find direct HTTP calls to Gotenberg
grep -r "gotenberg\|/forms/chromium\|/forms/libreoffice\|/forms/pdfengines" --include="*.cs" .

# Find GotenbergSharpApiClient usage
grep -r "GotenbergSharpClient\|Gotenberg.Sharp\|ChromiumRequest" --include="*.cs" .

# Find Docker/KubernetesGotenbergconfiguration
grep -r "gotenberg/gotenberg\|gotenberg:" --include="*.yml" --include="*.yaml" .
SHELL

Zmiany w pakiecie NuGet

# RemoveGotenbergclient (if using)
dotnet remove package Gotenberg.Sharp.API.Client

# Install IronPDF
dotnet add package IronPdf
SHELL

Szybki start – migracja

Krok 1: Zaktualizuj konfigurację licencji

Przed (Gotenberg):

Gotenberg nie wymaga licencji, ale wymaga infrastruktury Docker z adresami URL kontenerów.

private readonly string _gotenbergUrl = "http://localhost:3000";

Po (IronPDF):

// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Krok 2: Zaktualizuj importy przestrzeni nazw

// Before (Gotenberg)
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;

// After (IronPDF)
using IronPdf;
using IronPdf.Rendering;

Kompletna dokumentacija API

MapowanieGotenbergEndpoint do IronPDF

Trasa GotenbergOdpowiednik IronPDF
POST /forms/chromium/convert/htmlChromePdfRenderer.RenderHtmlAsPdf()
POST /forms/chromium/convert/urlChromePdfRenderer.RenderUrlAsPdf()
POST /forms/pdfengines/mergePdfDocument.Merge()
POST /forms/pdfengines/convertpdf.SaveAs() z ustawieniami
GET /healthNie dotyczy

Mapowanie parametru formularza do RenderingOptions

Parametr GotenbergWłaściwości IronPDFUwagi do konwersji
paperWidth (cale)RenderingOptions.PaperSizeUżyj enum lub rozmiaru niestandardowego
paperHeight (cale)RenderingOptions.PaperSizeUżyj enum lub rozmiaru niestandardowego
marginTop (cale)RenderingOptions.MarginTopPomnoz przez 25,4 dla mm
marginBottom (cale)RenderingOptions.MarginBottomPomnoz przez 25,4 dla mm
printBackgroundRenderingOptions.PrintHtmlBackgroundsBoolean
landscapeRenderingOptions.PaperOrientationLandscape enum
waitDelay (np. "3s")RenderingOptions.WaitFor.RenderDelay(ms)Przekształć string do milisekund

Przykłady migracji kodu

Przykład 1: Podstawowy HTML do PDF

Przed (Gotenberg):

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;

class GotenbergExample
{
    static async Task Main()
    {
        var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";
        
        using var client = new HttpClient();
        using var content = new MultipartFormDataContent();
        
        var html = "<html><body><h1>Hello from Gotenberg</h1></body></html>";
        content.Add(new StringContent(html), "files", "index.html");
        
        var response = await client.PostAsync(gotenbergUrl, content);
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        
        await File.WriteAllBytesAsync("output.pdf", pdfBytes);
        Console.WriteLine("PDF generated successfully");
    }
}

Po (IronPDF):

// NuGet: Install-Package IronPdf
using System;
using IronPdf;

class IronPdfExample
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        
        var html = "<html><body><h1>Hello from IronPDF</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF generated successfully");
    }
}

Różnica jest znaczna:Gotenbergwymaga skonstruowania HttpClient, zbudowania MultipartFormDataContent, wykonania asynchronicznego żądania HTTP POST do działającego kontenera Docker oraz obsługi odpowiedzi w postaci tablicy bajtów.IronPDF redukuje to do trzech linii z wywołaniem metody ChromePdfRenderer — bez obciążenia sieci, bez zależności od kontenera, bez skomplikowania asynchronicznego. Dodatkowe opcje renderowania można znaleźć w dokumentacji dotyczącej konwersji HTML do PDF.

Przykład 2: Konwersja adresów URL do formatu PDF

Przed (Gotenberg):

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;

class GotenbergUrlToPdf
{
    static async Task Main()
    {
        var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/url";
        
        using var client = new HttpClient();
        using var content = new MultipartFormDataContent();
        
        content.Add(new StringContent("https://example.com"), "url");
        
        var response = await client.PostAsync(gotenbergUrl, content);
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        
        await File.WriteAllBytesAsync("webpage.pdf", pdfBytes);
        Console.WriteLine("PDF from URL generated successfully");
    }
}

Po (IronPDF):

// NuGet: Install-Package IronPdf
using System;
using IronPdf;

class IronPdfUrlToPdf
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("PDF from URL generated successfully");
    }
}

PodejścieGotenbergwymaga innego punktu końcowego (/forms/chromium/convert/url), zbudowania zawartości multipart z URL-em jako polem formularza, i obsługi asynchronicznych odpowiedzi HTTP. Metoda RenderUrlAsPdf()IronPDF przyjmuje URL bezpośrednio i zwraca obiekt PdfDocument synchronicznie. Dowiedz się więcej o konwersji adresów URL do formatu PDF.

Przykład 3: Niestandardowy rozmiar papieru i marginesy

Przed (Gotenberg):

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;

class GotenbergCustomSize
{
    static async Task Main()
    {
        var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";
        
        using var client = new HttpClient();
        using var content = new MultipartFormDataContent();
        
        var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
        content.Add(new StringContent(html), "files", "index.html");
        content.Add(new StringContent("8.5"), "paperWidth");
        content.Add(new StringContent("11"), "paperHeight");
        content.Add(new StringContent("0.5"), "marginTop");
        content.Add(new StringContent("0.5"), "marginBottom");
        
        var response = await client.PostAsync(gotenbergUrl, content);
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        
        await File.WriteAllBytesAsync("custom-size.pdf", pdfBytes);
        Console.WriteLine("Custom size PDF generated successfully");
    }
}

Po (IronPDF):

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

class IronPdfCustomSize
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        
        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
        renderer.RenderingOptions.MarginTop = 50;
        renderer.RenderingOptions.MarginBottom = 50;
        
        var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        
        pdf.SaveAs("custom-size.pdf");
        Console.WriteLine("Custom size PDF generated successfully");
    }
}

Gotenberg wymaga parametrów opartych na ciągach ("8.5", "11", "0.5") dodanych do danych formularza multipart — brak bezpieczeństwa typów, brak IntelliSense, łatwe do błędnego wpisania.IronPDF zapewnia właściwości ze ścisłym typowaniem z enumami PdfPaperSize i wartościami marginesów liczbowych. Należy pamiętać, że marginesy w IronPDFsą podawane w milimetrach (50 mm ≈ 2 całe), podczas gdyGotenbergużywa cali.


Ważne uwagi dotyczące migracji

Przeliczanie jednostek miar

Najważniejszą zmianą w tej migracjiGotenbergsą jednostki marginesów:

// Gotenberg: margins in inches
content.Add(new StringContent("0.5"), "marginTop");    // 0.5 inches
content.Add(new StringContent("1"), "marginBottom");   // 1 inch

// IronPDF: margins in millimeters
renderer.RenderingOptions.MarginTop = 12.7;    // 0.5 inches × 25.4 = 12.7mm
renderer.RenderingOptions.MarginBottom = 25.4; // 1 inch × 25.4 = 25.4mm

Wzór przeliczeniowy: millimeters = inches × 25.4

Synchroniczne a asynchroniczne

Gotenberg wymaga operacji asynchronicznych ze względu na komunikację HTTP:

// Gotenberg: Forced async due to network calls
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();

// IronPDF: Synchronous in-process execution
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");

// IronPDF: Async wrapper if needed
var pdf = await Task.Run(() => renderer.RenderHtmlAsPdf(html));

Obsługa błędów

// Gotenberg: HTTP error handling
try
{
    var response = await client.PostAsync(gotenbergUrl, content);
    response.EnsureSuccessStatusCode();  // What if 500? 503? Timeout?
}
catch (HttpRequestException ex) { /* Network error */ }
catch (TaskCanceledException ex) { /* Timeout */ }

// IronPDF: Standard .NET exceptions
try
{
    var pdf = renderer.RenderHtmlAsPdf(html);
}
catch (Exception ex)
{
    Console.WriteLine($"PDF generation failed: {ex.Message}");
}

Usunięcie infrastruktury

Po migracji usuńGotenbergze swojej infrastruktury:

# REMOVE from docker-compose.yml:
# services:
#   gotenberg:
#     image: gotenberg/gotenberg:8
#     ports:
#       - "3000:3000"
#     deploy:
#       resources:
#         limits:
#           memory: 2G
Text

Kwestie związane z wydajnością

Porównanie opóźnień

DziałanieGotenberg(Ciepły)Gotenberg (Zimny start)IronPDF(pierwsze renderowanie)IronPDF(kontynuacja)
Prosty HTML150–300 ms2–5 sekund1–2 sekundy50–150 ms
Złożony kod HTML500–1500 ms3–7 sekund1,5–3 sekundy200–800 ms
Renderowanie adresów URL1–5 sekund3–10 sekund1–5 sekund500 ms–3 s

Eliminacja kosztów infrastruktury

ZasobyGotenbergIronPDF
Wymagane kontenery1-N (skalowanie)0
Pamięć na kontener512 MB–2 GBNie dotyczy
Obciążenie sieciowe na żądanie10–100 ms0 ms
Punkty końcowe kontroli stanuWymaganeNie jest potrzebne
Moduł równoważenia obciążeniaCzęsto potrzebneNie jest potrzebne

Rozwiązywanie problemów

Problem 1: Wzory HttpClient nie są potrzebne

Problem: Kod wciąż używa HttpClient i MultipartFormDataContent.

Rozwiązanie: Zastąp całkowicie za pomocą ChromePdfRenderer:

// Remove all of this:
// using var client = new HttpClient();
// using var content = new MultipartFormDataContent();
// content.Add(new StringContent(html), "files", "index.html");
// var response = await client.PostAsync(url, content);

// Replace with:
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);

Problem 2: Błędne jednostki marginesów

Problem: Pliki PDF mają nieprawidłowe marginesy po migracji.

Rozwiązanie: Przeliczanie cali na milimetry:

//Gotenbergused inches: "0.5"
//IronPDF uses millimeters: 0.5 × 25.4 = 12.7
renderer.RenderingOptions.MarginTop = 12.7;
C#

Problem 3: Odwołania do adresów URL kontenerów

Problem: Kod zawiera http://gotenberg:3000 lub podobne adresy URL.

Rozwiązanie: Usuń wszystkie odniesienia do adresów URL kontenerów —IronPDF działa w ramach procesu:

// Remove:
// private readonly string _gotenbergUrl = "http://gotenberg:3000";

//IronPDF needs no URL - it's in-process
var renderer = new ChromePdfRenderer();

Lista kontrolna migracji

Przed migracją

  • Sporządź spis wszystkich wywołań HTTPGotenbergw kodzie źródłowym
  • Udokumentuj aktualną konfigurację Gotenberga (limity czasu, marginesy, rozmiary papieru)
  • Zidentyfikuj wszystkie konfiguracje Docker/Kubernetes Gotenberg
  • Uzyskaj klucz licencyjny IronPDF
  • Plan wycofania infrastruktury z eksploatacji

Migracja kodu

  • Zainstaluj pakiet NuGet IronPDF: dotnet add package IronPdf
  • Usuń pakiety klienta Gotenberg
  • Zastąp wszystkie wywołania HTTP doGotenbergwywołaniami metod IronPDF
  • Przelicz jednostki marginesu z cali na milimetry
  • Zaktualizuj obsługę błędów (błędy HTTP → wyjątki .NET)
  • Dodaj inicjalizację klucza licencyjnego podczas uruchamiania

Migracja infrastruktury

  • UsuńGotenbergz Docker Compose / Kubernetes
  • Zaktualizuj potoki CI/CD (usuń pobieranie obrazów z Gotenberga)
  • Usuń testy sprawności Gotenberg
  • Usuń adres URLGotenbergz konfiguracji

Testowanie

  • Przetestuj konwersję HTML do PDF
  • Przetestuj konwersję adresu URL do formatu PDF
  • Sprawdź dokładność marginesów i rozmiarów
  • Test wydajności pod obciążeniem
  • Test czasu rozgrzewania pierwszego renderowania

Po migracji

  • Usuń wdrożenia kontenerów Gotenberg
  • Archiwum plików konfiguracyjnych Gotenberg
  • Aktualizacja dokumentacji
  • Monitorowanie wykorzystania pamięci przez aplikację
  • Sprawdź, czy nie ma osieroconych połączeń sieciowych

Zwróć uwagę: Gotenberg jest zarejestrowanym znakiem towarowym jego właściciela. Ta strona nie jest powiązana, wspierana, ani sponsorowana przez Gotenberg. Wszystkie nazwy produktów, loga 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