IRONSOFTWAREHOME
FILMY

Jak dodawać stemple i znaki wodne do plików PDF w języku C#

Curtis Chau
Curtis Chau
Updated: 19 lipca 2026

Migracja zPDFBoltdo IronPDF przenosi twój przebieg PDF .NET z usługi SaaS wyłącznie w chmurze na lokalnie hostowaną bibliotekę z lokalnym przetwarzaniem dokumentów i bez limitów na dokument. Ten przewodnik zapewnia szczegółową ścieżkę migracji, która eliminuje zależności sieciowe, ograniczenia miesięcznego użycia i zewnętrzną transmisję danych, jednocześnie dodając funkcje manipulacji PDF-ami, które nie są zapewnione przez PDFBolt.

Dlaczego warto przejść zPDFBoltna IronPDF

Problem związany wyłącznie z chmurą

PDFBolt jest platformą SaaS wyłącznie w chmurze ujawnioną jako REST API; nie istnieje oficjalne SDK .NET ani pakiet NuGet PDFBolt. Integracja jest wykonana ręcznie z HttpClient przeciwko https://api.pdfbolt.com/v1/direct. Chociaż wygodna dla szybkich prototypów, ta architektura stwarza wyzwania dla produkcyjnych aplikacji:

  1. Przetwarzanie wyłącznie w chmurze: Każdy dokument przechodzi przez serweryPDFBolt— brak opcji hostowanej lokalnie, co może stanowić blokadę dla zespołów potrzebujących większej kontroli nad przepływem danych.

  2. Uwagi dotyczące prywatności danych: Wrażliwe dokumenty (umowy, dane medyczne, dane finansowe) są przekazywane zewnętrznie. Firmy zajmujące się regulowanymi danymi będą miały uzasadnione obawy dotyczące przeglądu.

  3. Limity użytkowania: Darmowy limit to 100 dokumentów miesięcznie, 20 żądań/minutę, 1 jednoczesne żądanie, co może nie wystarczać dla obciążeń produkcyjnych. Płatne poziomy (według pdfbolt.com/pricing) wahają się od 19 $/miesiąc do 249 $/miesiąc.

  4. Zależność od sieci: Przestoje internetowe lub czas przestojuPDFBoltoznaczają, że twoje generowanie PDF całkowicie się zatrzymuje.

  5. Opóźnienie: W porównaniu z przetwarzaniem lokalnym, przesył danych w obie strony w sieci wydłuża każdą konwersję o kilka sekund.

  6. Przegląd zgodności: Audyty GDPR, HIPAA i SOC2 zazwyczaj wymagają dodatkowej dokumentacji, gdy przetwarzanie dokumentów odbywa się zewnętrznie.

  7. Bezpieczeństwo kluczy API: Wyciek kluczy API może skutkować nieautoryzowanym wykorzystaniem, za które zostanie naliczona opłata na Twoim koncie.

  8. Blokada dostawcy: Twoja aplikacja przestaje działać, jeśliPDFBoltzmienia warunki lub zamyka się.

PorównaniePDFBolti IronPDF

ZastrzeżeniePDFBoltIronPDF
Lokalizacja danychSerwery zewnętrzneTylko Twoje serwery
Ograniczenia użytkowania100 darmowych na miesiąc, następnie warstwowe subskrypcjeNieograniczona
Wymagane połączenie z InternetemTak, zawszeNie
OpóźnienieRuch sieciowy w obie stronyLokalny
ZgodnośćZłożone (przetwarzanie zewnętrzne)Proste (przetwarzanie lokalne)
Model kosztowyWarstwy subskrypcji miesięcznej (19–249 $/miesiąc)Jednorazowe lub roczne
Praca w trybie offlineNiemożliweW pełni obsługiwane
Kluczowe ryzyka związane z APIWyciek = rozliczenieKlucz licencyjny, brak ryzyka związanego z rozliczeniami

IronPDF zapewnia hostowaną lokalnie bazę we współczesnym .NET, która utrzymuje przetwarzanie dokumentów lokalnie i usuwa zależność od zewnętrznej usługi chmury.


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

PDFBolt nie ma oficjalnego SDK .NET ani pakietu NuGet PDFBolt, więc nie ma nic do odinstalowania. Czyszczenie po stroniePDFBoltpolega na usunięciu ręcznie wykonanego wrappera HttpClient oraz żądań/odpowiedzi DTO. Następnie zainstaluj IronPDF:

# Install IronPDF(replaces the hand-rolled HttpClient wrapper)
dotnet add package IronPdf
SHELL

Konfiguracja licencji

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

Zidentyfikuj zastosowanie PDFBolt

# Find allPDFBoltREST calls
grep -rE "api\.pdfbolt\.com|API-KEY|/v1/direct" --include="*.cs" .

# Find API key references
grep -r "PDFBOLT\|ApiKey" --include="*.cs" --include="*.json" --include="*.config" .
SHELL

Kompletna dokumentacija API

Mapowanie głównych koncepcji

PDFBolt (REST)IronPDF
HttpClient + API-KEY nagłóweknew ChromePdfRenderer()
Ciało żądania JSONrenderer.RenderingOptions
POST https://api.pdfbolt.com/v1/directrenderer.RenderHtmlAsPdf(...) / RenderUrlAsPdf(...)
Odpowiedź byte[]PdfDocument

Mapowanie metod konwersji

PDFBolt (REST)IronPDF
POST /v1/direct z { "html": <base64> }renderer.RenderHtmlAsPdf(html)
POST /v1/direct z { "url": "..." }renderer.RenderUrlAsPdf(url)

Mapowania metod wyjściowych

PDFBolt (REST)IronPDF
await response.Content.ReadAsByteArrayAsync() następnie File.WriteAllBytespdf.SaveAs(path)
await response.Content.ReadAsByteArrayAsync()pdf.BinaryData

Mapowania konfiguracji stron

PDFBolt JSONIronPDF
"format": "A4"renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
"margin": { "top": "20mm" }renderer.RenderingOptions.MarginTop = 20
"margin": { "bottom": "20mm" }renderer.RenderingOptions.MarginBottom = 20
"margin": { "left": "15mm" }renderer.RenderingOptions.MarginLeft = 15
"margin": { "right": "15mm" }renderer.RenderingOptions.MarginRight = 15

Mapowanie symboli zastępczych nagłówków/stopek

PDFBolt (wewnątrz zakodowanej base64 headerTemplate / footerTemplate)IronPDF (HtmlFragment token)
<span class="pageNumber"></span>{page}
<span class="totalPages"></span>{total-pages}
<span class="date"></span>{date}
<span class="title"></span>{html-title}

Przykłady migracji kodu

Przykład 1: Podstawowy HTML do PDF

Przed (PDFBolt — REST poprzez HttpClient):

// REST API — no official .NET SDK; integrate via HttpClient.
// Docs: https://pdfbolt.com/docs/quick-start-guide/csharp
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var payload = JsonSerializer.Serialize(new
        {
            html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html))
        });

        using var http = new HttpClient();
        http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
        using var content = new StringContent(payload, Encoding.UTF8, "application/json");
        using var response = await http.PostAsync("https://api.pdfbolt.com/v1/direct", content);
        response.EnsureSuccessStatusCode();

        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        await File.WriteAllBytesAsync("output.pdf", pdfBytes);
    }
}

Po (IronPDF):

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

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

Różnica strukturalna polega na modelu integracji.PDFBoltwymaga zakodowania HTML w base64, zbudowania ładunku JSON, ustawienia nagłówka API-KEY, POST do https://api.pdfbolt.com/v1/direct, oczekiwania na odpowiedź i samodzielnego zapisu zwróconych bajtów na dysku.

ChromePdfRenderer.RenderHtmlAsPdf()IronPDF zwraca obiekt PdfDocument z wbudowaną metodą SaveAs(). Model obiektowy pozwala manipulować PDF-em (dodawać znaki wodne, łączyć dokumenty, stosować zabezpieczenia) przed zapisaniem. Jeśli potrzebujesz surowych bajtów ze względu na zgodność z istniejącym kodem, użyj pdf.BinaryData. 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 (PDFBolt — REST poprzez HttpClient):

// REST API — no official .NET SDK; integrate via HttpClient.
// Docs: https://pdfbolt.com/docs/quick-start-guide/csharp
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var payload = JsonSerializer.Serialize(new { url = "https://www.example.com" });

        using var http = new HttpClient();
        http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
        using var content = new StringContent(payload, Encoding.UTF8, "application/json");
        using var response = await http.PostAsync("https://api.pdfbolt.com/v1/direct", content);
        response.EnsureSuccessStatusCode();

        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        await File.WriteAllBytesAsync("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://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}

Po stroniePDFBoltkonwersja URL nadal wymaga pełnej podróży REST: zbudowanie ciało JSON, ustawienie nagłówka klucza API, oczekiwanie na POST i zapisanie bajtów odpowiedzi. Chociaż już wskazujesz na publiczny URL, zarówno pobranie, jak i renderowanie odbywa się na serwerach PDFBolt.

RenderUrlAsPdf()IronPDF zwraca PdfDocument z wbudowaną metodą SaveAs(). Kluczową zaletą jest to, że IronPDF wykonuje pobranie URL i renderowanie PDF lokalnie — żadne dane dokumentu nie opuszczają twojej infrastruktury. Dowiedz się więcej o konwersji adresów URL do formatu PDF.

Przykład 3: Plik HTML z niestandardowymi ustawieniami strony

Przed (PDFBolt — REST poprzez HttpClient):

// REST API — no official .NET SDK; integrate via HttpClient.
// Docs: https://pdfbolt.com/docs/parameters
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var html = await File.ReadAllTextAsync("input.html");
        var payload = JsonSerializer.Serialize(new
        {
            html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html)),
            format = "A4",
            margin = new { top = "20mm", bottom = "20mm" },
            printBackground = true
        });

        using var http = new HttpClient();
        http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
        using var content = new StringContent(payload, Encoding.UTF8, "application/json");
        using var response = await http.PostAsync("https://api.pdfbolt.com/v1/direct", content);
        response.EnsureSuccessStatusCode();

        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        await File.WriteAllBytesAsync("output.pdf", pdfBytes);
    }
}

Po (IronPDF):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        var html = File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}

Ten przykład pokazuje mapowanie konfiguracji strony.PDFBoltakceptuje główny obiekt format plus zagnieżdżony obiekt margin, którego wartości są ciągami stylów CSS ("20mm").IronPDF używa obiektu RenderingOptions na rendererze z właściwościami o silnie typowanej strukturze.

Kluczowe powiązania:

  • "format": "A4"PdfPaperSize.A4 (silnie typowany enum)
  • "margin": { "top": "20mm" }RenderingOptions.MarginTop = 20 (numeryczne mm)

Marginesy IronPDFsą zawsze numerycznymi milimetrami, więc ciągi jednostek CSSPDFBoltjak "20mm" mapują się bezpośrednio. Przestrzeń nazw IronPdf.Rendering jest wymagana do dostępu do enum PdfPaperSize. Dla dodatkowej konfiguracji strony zobacz dokumentację opcji renderowania.


Ważne uwagi dotyczące migracji

Zmiana typu zwracanej wartości

Endpoint /v1/directPDFBoltzwraca surowy PDF jako ciało odpowiedzi HTTP;IronPDF zwraca PdfDocument:

//PDFBoltpattern:
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);

//IronPDF pattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");

// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
C#

Zmiana modelu integracji

Kształt integracji zmienia się z klienta REST na bibliotekę wewnątrzprocesową:

// PDFBolt
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
// ... build JSON, POST to https://api.pdfbolt.com/v1/direct

// IronPDF
var renderer = new ChromePdfRenderer();

Zmiana wzorca konfiguracji

KonfiguracjaPDFBoltto pola JSON w ciele żądania;IronPDF używa RenderingOptions:

// PDFBolt: JSON request fields
new { format = "A4", margin = new { top = "20mm" } }

// IronPDF: RenderingOptions properties
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;

Eliminacja klucza API

PDFBolt wymaga nagłówka API-KEY na każdym żądaniu;IronPDF używa jednorazowego klucza licencyjnego:

// PDFBolt: API key per HTTP call (security risk if leaked)
http.DefaultRequestHeaders.Add("API-KEY", config["PDFBolt:ApiKey"]);

// IronPDF: License key once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();

Usuń obsługę błędów sieciowych

Lokalne przetwarzanie oznacza brak błędów sieciowych do obsługi:

// PDFBolt: Network error handling required
catch (HttpRequestException ex)
catch (TaskCanceledException)
catch (TimeoutException)

// IronPDF: Remove network-specific catches entirely

Nowe dostępne funkcje

Po migracji do IronPDF zyskujesz możliwości, których nie zapewnia PDFBolt:

// PDF Merging (not available in PDFBolt)
var merged = PdfDocument.Merge(pdf1, pdf2);

// Watermarks (not available in PDFBolt)
pdf.ApplyWatermark("<h1 style='opacity:0.3;'>DRAFT</h1>");

// Password Protection (not available in PDFBolt)
pdf.SecuritySettings.UserPassword = "secret";

// Text Extraction (not available in PDFBolt)
string text = pdf.ExtractAllText();

// PDF to Images (not available in PDFBolt)
pdf.RasterizeToImageFiles("page_*.png");

Rozwiązywanie problemów

Problem 1: Brak pakietu PDFBolt na NuGet

Problem: Szukam using PDFBolt; / new HtmlToPdfConverter() w IronPDF.

**Rozwiązanie:**PDFBoltnie ma SDK .NET — jego integracja opiera się na HttpClient przeciwko https://api.pdfbolt.com/v1/direct.IronPDF całkowicie zastępuje ten wrapper przez ChromePdfRenderer:

// IronPDF
var renderer = new ChromePdfRenderer();

Problematyczny 2: Gdzie zniknął ConvertHtmlString?

Problem: Migracja wewnętrznego wrappera PDFBolt, który ujawniał metodę ConvertHtmlString(html).

Rozwiązanie: Skorzystaj z RenderHtmlAsPdf():

// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);

Problematyczny 3: Gdzie zniknął ConvertUrl?

Problem: Migracja wewnętrznego wrappera PDFBolt, który ujawniał metodę ConvertUrl(url).

Rozwiązanie: Skorzystaj z RenderUrlAsPdf():

// IronPDF
var pdf = renderer.RenderUrlAsPdf(url);

Problem 4: Pola JSON format → Enum

Problem: Tłumaczenie pola JSON "format": "A4" z PDFBolt.

Rozwiązanie: Skorzystaj z PdfPaperSize z IronPdf.Rendering:

// IronPDF
using IronPdf.Rendering;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;

Problem 5: Powolne generowanie pierwszego pliku PDF

Problem: Wstępne renderowanie trwa dłużej niż oczekiwano.

Rozwiązanie: Silnik Chromium inicjuje się przy pierwszym użyciu. W razie potrzeby przygotuj się wcześniej:

// Warm up during application startup
var renderer = new ChromePdfRenderer();
renderer.RenderHtmlAsPdf("<html><body></body></html>");

Lista kontrolna migracji

Przed migracją

  • Inwentaryzuj wszystkie wywołania RESTPDFBoltw kodowej bazie (api.pdfbolt.com)
  • Udokumentuj bieżące pola żądań JSON (format, margin, printBackground, headerTemplate, itd.)
  • Zidentyfikuj kod zarządzania kluczem API w celu usunięcia
  • Lista obsługi ponownych prób po limitach 429/quota do usunięcia
  • Uzyskaj klucz licencyjny IronPDF

Zmiany w pakiecie

  • Usuń ręcznie wykonany wrapperPDFBoltHttpClient i DTO (brak pakietu NuGet do odinstalowania)
  • Zainstaluj pakiet NuGet IronPdf: dotnet add package IronPdf
  • Dodaj przestrzeń nazw using IronPdf;
  • Dodaj using IronPdf.Rendering; dla enumów rozmiarów papieru

Zmiany w kodzie

  • Dodaj konfigurację klucza licencyjnego podczas uruchamiania
  • Zastąp integrację HttpClient + API-KEY przez ChromePdfRenderer
  • Zastąp POST /v1/direct przez RenderHtmlAsPdf() / RenderUrlAsPdf()
  • Zastąp await response.Content.ReadAsByteArrayAsync() + File.WriteAllBytes() przez pdf.SaveAs() (lub pdf.BinaryData jeśli nadal potrzebne są bajty)
  • Zmapuj pola JSON "format" / "margin" na RenderingOptions.PaperSize / RenderingOptions.MarginTop itd.
  • Usuń kod zarządzania kluczem API
  • Usuń obsługę limitów 429 / wskaźników użycia
  • Usuń obsługę błędów sieciowych

Po migracji

  • Usuń klucz API z plików konfiguracyjnych
  • Usuń klucz API z menedżerów sekretów
  • Uruchom wszystkie testy porównujące wynik w formacie PDF
  • Sprawdź, czy rozmiary stron i marginesy wyświetlają się poprawnie
  • Rozważ dodanie nowych funkcji (znaki wodne, zabezpieczenia, scałanie)

Zwróć uwagę: PDFBolt to zastrzeżony znak towarowy swojego właściciela. Ta strona nie jest powiązana, popierana ani sponsorowana przez PDFBolt. 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