Przejdź do treści stopki
PORóWNANIA PRODUKTóW

Porównanie konwerterów HTML do PDF: Darmowe vs Płatne biblioteki dla .NET

Problem z biblioteką PDF w C#, który wszystko zaczął

IronPDF

Jeszcze w 2016 roku, nasz zespół konsultingowy w Iron Software tonął w koszmarach konwersji HTML na PDF. Zostaliśmy zatrudnieni do unowocześnienia generowania dokumentów dla klienta z listy Fortune 500, a każda biblioteka, którą wypróbowaliśmy, była katastrofą czekającą na swój czas. Każde z tych "rozwiązań" wydawało się początkowo obiecujące, ale gdy tylko pojawiły się rzeczywiste trudności — dynamiczna treść, układy CSS3, strony z dużą ilością kodu JavaScript — biblioteki albo po cichu zawodziły, albo spektakularnie się zawieszały.

Jeff Fritz doskonale podsumował to podczas niedawnej konferencji .NET:

> "Świat generowania plików PDF w środowisku .NET był cmentarzyskiem porzuconych projektów i niedopracowanych rozwiązań".

Nie przesadzał. Wiedzieliśmy to z pierwszej ręki, ponieważ przetestowaliśmy niemal każdą bibliotekę dostępną na rynku, od tych ledwo utrzymywanych po te z efektownymi prezentacjami sprzedażowymi dla Enterprise. Po miesiącach prób, błędów i frustracji, która doprowadzała do wyrywania włosów z głowy, stało się boleśnie jasne: istniejące rozwiązania po prostu nie były w stanie sprostać współczesnym wymaganiom.

Właśnie tak zaczyna się historia IronPDF — narodziła się z konieczności, napędzana porażkami wszystkich alternatyw, które wypróbowaliśmy.

Dlaczego dotychczasowe rozwiązania nas zawiodły (i nadal zawodzą)

Powiem wprost: stworzyliśmy IronPDF, ponieważ wszystkie inne rozwiązania były wadliwe, a nawet osiem lat później większość z nich nadal jest. Awarie nie zawsze miały charakter techniczny; były to kwestie prawne, architektoniczne, a czasem po prostu czyste szaleństwo.

Oto, z czym zetknęliśmy się podczas naszej pracy konsultingowej, wraz z rzeczywistym kodem, który pokazuje, dlaczego te "rozwiązania" skłoniły nas do stworzenia czegoś lepszego.

Wielka przynęta i zamiana w bibliotekach PDF C

Zacznijmy od bibliotek, które zmieniły swoje licencje po tym, jak programiści zbudowali wokół nich całe aplikacje:

iText – "Darmowa" biblioteka, która naprawdę nią nie jest

Jeszcze w 2009 roku iText był reklamowany jako darmowa i otwarta biblioteka PDF. W tamtym czasie był on dystrybuowany na licencji LGPL, co wydawało się rozsądnym wyborem dla programistów. Jednak w 2012 r. warunki licencji zmieniły się na AGPL. Zgodnie z licencją AGPL programiści stanęli przed trudnym wyborem: albo udostępnić całą swoją aplikację na zasadach open source, albo zapłacić za licencję komercyjną.

Przenieśmy się do roku 2025, kiedy to komercyjna licencja iText może kosztować tysiące dolarów — często około 2500 USD na serwer. To stworzyło to, co wielu programistów nazywa "pułapką AGPL": użyj iText i albo opublikuj swój pełny kod źródłowy, albo zapłać znaczącą opłatę licencyjną.

Oprócz kwestii licencyjnych, iText nie zapewnia natywnej konwersji HTML do PDF w standardowej wersji. Nie ma prostej metody RenderHtml(html). Zamiast tego, programiści muszą korzystać z osobnego dodatku pdfHTML (dla iText), który wprowadza własne zależności i dodatkowe złożoności licencyjne. Starszy komponent XMLWorker był częścią iText i nie jest już istotny dla obecnego rozwoju iText.

Ta kombinacja restrykcyjnego licencjonowania i brak wbudowanej obsługi HTML-to-PDF jest powodem, dla którego wiele zespołów unika dzisiaj iText.

iText nie jest samotny. QuestPDF był kolejną pułapką: intensywnie promowany w Internecie jako "najlepsza biblioteka PDF dla C#", ale w ogóle nie obsługuje konwersji HTML do PDF. Programiści spędzili wiele dni, próbując wpasować to narzędzie w procesy, do których po prostu nie zostało zaprojektowane.

QuestPDF – biblioteka, która nie robi tego, co myślisz

QuestPDF jest często promowany w Internecie, zwłaszcza w społecznościach Reddit, jako jedna z najlepszych bibliotek PDF dla języka C#. Istnieje jednak ważne ograniczenie, które nie zawsze jest oczywiste: QuestPDF w ogóle nie obsługuje konwersji HTML do PDF.

Zamiast renderować HTML, QuestPDF wymaga od programistów tworzenia dokumentów programowo przy użyciu płynnego interfejsu API. Na przykład strony, kontenery i bloki tekstowe definiuje się bezpośrednio w kodzie C#. Chociaż jest to potężne narzędzie w niektórych przypadkach, przypomina raczej ręczne formatowanie dokumentów — prawie jak tworzenie plików PDF "na siłę", zamiast prostej konwersji istniejącego kodu HTML.

Kolejną kwestią do rozważenia jest licencjonowanie. Licencja społecznościowa jest darmowa dla osób, projektów open-source i firm z przychodem poniżej 1 mln USD rocznie — ale organizacje komercyjne powyżej tego progu muszą zakupić płatną licencję. Ceny komercyjne zaczynają się od 999 USD (Professional, do 10 programistów) i dochodzą do 2 999 USD (Enterprise, nieograniczona liczba programistów), co może wydawać się wysokie dla biblioteki, która nie zawiera renderowania HTML-to-PDF w standardzie.

Ze względu na te ograniczenia QuestPDF może nie być odpowiednim rozwiązaniem dla programistów poszukujących konkretnie prostej i niezawodnej konwersji HTML do PDF w środowisku .NET.

Katasrofa wkhtmltopdf (2016-2023)

Używanie wkhtmltopdf na produkcji było notorycznie bolesne. Każda otoczka wokół tego wydawała się podążać za tym samym frustrującym schematem:

  1. Skopiuj tajemniczy plik binarny na serwer.
  2. Mam nadzieję, że zainstalowano odpowiednie zależności natywne.
  3. Obserwuj, jak nieprzewidywalnie ulega awarii w środowisku produkcyjnym.

Nawet jeśli dysponowałeś już opakowaniem, nie można było wcałe zagwarantować niezawodności. Programiści często napotykali takie błędy, jak:

  • "Nie można załadować biblioteki DLL 'wkhtmltox'"
  • "Naruszenie dostępu pod adresem 0x00000000"
  • "Aplikacja przestała działać"
  • "Qt: Nie można zainicjować OLE (błąd 80010106)"

Te awarie często wymagały ręcznej interwencji. W niektórych przypadkach zespoły uciekały się nawet do ponownego uruchamiania puli aplikacji tylko po to, aby proces znów działał — było to rozwiązanie niestabilne i niezrównoważone.

Ta niestabilność, w połączeniu z niewygodnym procesem wdrażania, sprawiała, że wkhtmltopdf był ryzykownym wyborem dla poważnych obciążeń produkcyjnych.

W styczniu 2023 roku wkhtmltopdf zostało zarchiwizowane i porzucone. Każda biblioteka C# do obsługi plików PDF zbudowana na jej bazie stała się natychmiastowym długiem technicznym:

  • TuesPechkin – Ostatnia aktualizacja 2015 r., twierdzenia dotyczące wielowątkowości były fikcją
  • Rotativa – wyłącznie MVC, nadal dostarczająca nieaktywne pliki binarne w 2025 r.
  • DinkToPdf – "kompatybilny z .NET Core" fork, który tak naprawdę nie był
  • Haukcode.DinkToPdf – wariant martwego wariantu
  • NReco.PdfGenerator – pobieranie opłaty w wysokości ponad 150 USD za opakowanie porzuconego oprogramowania
  • OpenHtmlToPdf – nazwa sugeruje, że jest to coś innego, ale tak nie jest

Programiści próbujący konwertować HTML na PDF w języku C# przy użyciu opakowań wkhtmltopdf musieli nieustannie zarządzać uprawnieniami do plików, względnymi adresami URL i zależnościami binarnymi. Generowanie dokumentów PDF dla całych stron internetowych było niestabilne, a podziały stron wewnątrz elementów HTML były nieprzewidywalne.

Koszmar "Po prostu użyj Chrome"

Potem pojawiła się społeczność zajmująca się automatyzacją przeglądarek. "Po prostu użyj Puppeteera!" – powiedzieli. Mimo że PuppeteerSharp i Playwright mogą technicznie generować pliki PDF, nie są one prawdziwymi bibliotekami PDF dla języka C#. Wymagają one dużych plików binarnych przeglądarki, złożonego wdrażania i nie posiadają funkcji zgodności, takich jak PDF/A lub PDF/UA.

Oto jak to naprawdę wyglądało:

// PuppeteerSharp - The "Simple" Solution That Wasn't
public class PuppeteerNightmare
{
    private Browser _browser;

    public async Task Initialize()
    {
        // Step 1: Download 300MB of Chrome
        await new BrowserFetcher().DownloadAsync();
        // Customer: "Why is your app 300MB?"
        // Us: "Uh... for PDFs?"

        // Step 2: Launch Chrome with magic arguments nobody understands
        _browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true,
            Args = new[] 
            { 
                "--no-sandbox",
                "--disable-setuid-sandbox",
                "--disable-dev-shm-usage",
                "--disable-gpu",
                "--no-first-run",
                "--no-zygote",
                "--single-process"
            }
        });
    }

    public async Task<byte[]> GeneratePdf(string html)
    {
        // This works great until:
        // 1. Chrome auto-updates and breaks your args
        // 2. You need to generate 100 PDFs simultaneously
        // 3. You deploy to Azure Functions (spoiler: it won't work)
        // 4. A memory leak eats 5GB of RAM

        var page = await _browser.NewPageAsync();
        await page.SetContentAsync(html);

        // Wait for... something? Nobody knows the right value
        await Task.Delay(1000); 

        return await page.PdfDataAsync();
    }
}
// PuppeteerSharp - The "Simple" Solution That Wasn't
public class PuppeteerNightmare
{
    private Browser _browser;

    public async Task Initialize()
    {
        // Step 1: Download 300MB of Chrome
        await new BrowserFetcher().DownloadAsync();
        // Customer: "Why is your app 300MB?"
        // Us: "Uh... for PDFs?"

        // Step 2: Launch Chrome with magic arguments nobody understands
        _browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true,
            Args = new[] 
            { 
                "--no-sandbox",
                "--disable-setuid-sandbox",
                "--disable-dev-shm-usage",
                "--disable-gpu",
                "--no-first-run",
                "--no-zygote",
                "--single-process"
            }
        });
    }

    public async Task<byte[]> GeneratePdf(string html)
    {
        // This works great until:
        // 1. Chrome auto-updates and breaks your args
        // 2. You need to generate 100 PDFs simultaneously
        // 3. You deploy to Azure Functions (spoiler: it won't work)
        // 4. A memory leak eats 5GB of RAM

        var page = await _browser.NewPageAsync();
        await page.SetContentAsync(html);

        // Wait for... something? Nobody knows the right value
        await Task.Delay(1000); 

        return await page.PdfDataAsync();
    }
}
Imports PuppeteerSharp

Public Class PuppeteerNightmare
    Private _browser As Browser

    Public Async Function Initialize() As Task
        ' Step 1: Download 300MB of Chrome
        Await (New BrowserFetcher()).DownloadAsync()
        ' Customer: "Why is your app 300MB?"
        ' Us: "Uh... for PDFs?"

        ' Step 2: Launch Chrome with magic arguments nobody understands
        _browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {
            .Headless = True,
            .Args = {
                "--no-sandbox",
                "--disable-setuid-sandbox",
                "--disable-dev-shm-usage",
                "--disable-gpu",
                "--no-first-run",
                "--no-zygote",
                "--single-process"
            }
        })
    End Function

    Public Async Function GeneratePdf(html As String) As Task(Of Byte())
        ' This works great until:
        ' 1. Chrome auto-updates and breaks your args
        ' 2. You need to generate 100 PDFs simultaneously
        ' 3. You deploy to Azure Functions (spoiler: it won't work)
        ' 4. A memory leak eats 5GB of RAM

        Dim page = Await _browser.NewPageAsync()
        Await page.SetContentAsync(html)

        ' Wait for... something? Nobody knows the right value
        Await Task.Delay(1000)

        Return Await page.PdfDataAsync()
    End Function
End Class
$vbLabelText   $csharpLabel

Oprócz dużej zależności od przeglądarki Chrome programiści mieli do czynienia z wyzwaniami związanymi z treścią dynamiczną, obsługą CSS oraz konwersją CSS do HTML na PDF. Automatyzacja stron internetowych w ten sposób często skutkowała nieprawidłowymi podziałami stron, dużym zużyciem pamięci i nieprzewidywalnymi rozmiarami stron PDF.

Komercyjne biblioteki PDF C#, które nie były tego warte

Oceniliśmy każdą komercyjną bibliotekę C# do konwersji HTML na PDF. Na papierze biblioteki te wyglądały obiecująco, ale w praktyce wszystkie wiązały się z ukrytymi kosztami, ograniczeniami lub przestarzałą technologią. Oto, co często można było uzyskać za kwotę od 500 do 5000 dolarów:

GemBox.Document – Licznik akapitów

GemBox.Document reklamuje się jako bezpłatny, ale tylko do 20 akapitów. Haczyk polega na tym, że każda komórka tabeli również liczy się jako akapit. Jeśli więc stworzysz coś tak prostego jak tabelę 5×5, to już jest to 25 akapitów — i będziesz musiał zapłacić za licencję.

Pełna wersja GemBox.Document kosztuje 890 USD za jedną licencję programisty, i to tylko dla podstawowej funkcjonalności konwersji dokumentów. Ze względu na surowe ograniczenia wersji darmowej oraz koszt pełnej licencji, skalowanie projektów przy użyciu tej biblioteki szybko staje się trudne.

SelectPdf – kłamstwo o "wielopłatformowości"

SelectPdf jest często przedstawiany jako wielopłatformowe rozwiązanie do konwersji HTML na PDF, ale w rzeczywistości działa tylko w systemie Windows. Programiści, którzy kupią licencję — której cena zaczyna się od 499 dolarów — szybko odkrywają, że biblioteka nie jest kompatybilna z systemami Linux ani macOS.

Wersja darmowa jest również mocno ograniczona. Pozwala to na wygenerowanie maksymalnie pięciu stron; Począwszy od strony szóstej, na wydruku widnieje duży znak wodny "KUP LICENCJĘ".

Te ograniczenia sprawiają, że SelectPdf jest ryzykownym wyborem dla programistów, którzy oczekują prawdziwej obsługi wielu platform lub chcą przetestować bibliotekę bez natychmiastowego napotykania barier płatniczych.

EO.PDF – Dziedzictwo przeszłości

EO.Pdf posiada wysoką cenę $999 dla biblioteki, która przez lata zmagania się z dużym bagażem. Pierwotnie jako silnik renderujący wykorzystywał przeglądarkę Internet Explorer. Niedawno przeszedł na przeglądarkę Chrome, co wiąże się jednak z dużym obciążeniem pamięci wynoszącym 126 MB. Pomimo deklaracji o obsłudze wielu platform, EO.PDF pozostaje w dużej mierze zorientowany na system Windows.

Z technicznego punktu widzenia metoda HtmlToPdf.ConvertHtml(html, pdfStream) działa, ale biorąc pod uwagę koszty i ograniczenia, EO.PDF nie jest uważane za opłacalne rozwiązanie do obsługi nowoczesnych funkcji HTML.

HiQPdf – Cud na trzech stronach

HiQPdf reklamuje się jako posiadający wersję darmową, ale w rzeczywistości jest ona dość ograniczona: można wygenerować tylko do trzech stron. Gdy tylko dotrzesz do strony czwartej, na całym dokumencie pojawi się duży znak wodny.

Jeśli chcesz usunąć to ograniczenie, musisz kupić licencję komercyjną, której cena zaczyna się od około 595 USD.

W praktyce sprawia to, że wersja darmowa jest przydatna tylko w przypadku bardzo małych dokumentów. Wszelkie większe pliki szybko przekraczają limit stron, co skłania programistów do wykupienia płatnej aktualizacji.

Spire.PDF – Gdy obrazy nie są tak naprawdę plikami PDF

Spire.PDF reklamuje konwersję HTML do PDF, ale w praktyce często "konwertuje" HTML po prostu robiąc zrzut ekranu. Wynikiem jest duży plik PDF — czasami o rozmiarze 10 MB — w którym tekst nie jest zaznaczalny. Użytkownicy często pytają: "Dlaczego nie mogę przeszukiwać pliku PDF?". Odpowiedź jest prosta: ponieważ w rzeczywistości jest to po prostu obraz osadzony w pliku PDF, a nie prawdziwy tekst.

Metoda LoadFromHTML przyjmuje kilka parametrów logicznych, ale ich przeznaczenie jest niejasne, a oficjalna dokumentacja zawiera niewiele wskazówek. W wielu przypadkach jedynym sposobem na uzyskanie wyjaśnień jest kontakt z działem sprzedaży.

Takie podejście sprawia, że Spire.PDF jest problematyczny dla każdego, kto potrzebuje plików PDF z możliwością wyszukiwania, kopiowania lub o odpowiedniej strukturze.

ABCpdf – Labirynt licencji

ABCpdf reklamuje "bezpłatną licencję", ale w rzeczywistości wymaga ona rejestracji, jest ograniczona czasowo i dodaje znaki wodne. Pełna wersja opiera się na silniku Gecko (przestarzałej wersji przeglądarki Firefox) lub Trident (Internet Explorer). Co ciekawe, nawet w 2025 roku Internet Explorer jest nadal oferowany jako opcja renderowania.

Korzystając z ABCpdf, dodawanie treści HTML oznacza, że jesteś ograniczony do tych starszych silników renderujących. Na przykład wywołanie funkcji AddImageHtml(html) spowoduje renderowanie przy użyciu przeglądarki IE lub przestarzałego silnika Firefox, w zależności od dokonanego wyboru.

ExpertPdf – ekspert w byćiu drogim

ExpertPdf ma wysoką cenę, wynoszącą od 550 do 1200 dolarów. A co otrzymujesz za tę cenę? Zasadniczo nakładkę na starą wersję przeglądarki Chrome wraz z dokumentacją, która nie była aktualizowana od 2018 roku.

Winnovative – Innowacje wstrzymane w 2016 r.

Konwerter HTML na PDF firmy Winnovative nadal opiera się na silniku WebKit z 2016 roku. Pomimo swojej nazwy biblioteka ta nie nadąża za współczesnymi standardami internetowymi. Ceny wahają się od 750 do 1600 dolarów za technologię, która pochodzi jeszcze z czasów prezydentury Obamy.

Konwerter nie obsługuje CSS Grid ani nowoczesnych funkcji JavaScript. Chociaż umożliwia tworzenie plików PDF, jest wyraźnie przestarzałe w porównaniu z obecnymi rozwiązaniami do konwersji HTML na PDF.

PDFmyURL – to nawet nie jest biblioteka

PDFmyURL nie jest prawdziwą biblioteką C#; w zasadzie jest to po prostu opakowanie API. Korzystając z tej usługi, płacisz za przetwarzanie dokumentów na serwerze innej firmy, co może budzić obawy, jeśli dokumenty zawierają poufne informacje. Minimalny koszt wynosi 39 USD miesięcznie.

Pod względem funkcjonalnym korzystanie z PDFmyURL w języku C# oznacza wysyłanie żądań HTTP do ich serwisu internetowego — nie pracujesz z lokalną biblioteką. Na przykład wysyłasz adres URL do punktu końcowego API i otrzymujesz w odpowiedzi plik PDF. Chociaż może generować pliki PDF, nie jest to samodzielna biblioteka C# do obsługi plików PDF, a raczej usługa internetowa wymagająca dostępu do sieci.

GrabzIt – zrzuty ekranu, a nie pliki PDF

GrabzIt został pierwotnie zaprojektowany do wykonywania zrzutów ekranu stron internetowych. Generowanie plików PDF jest raczej dodatkiem niż podstawową funkcją. Usługa pobiera opłaty za każde przechwycenie i nie zapewnia prawdziwego rozwiązania C# do konwersji HTML na PDF.

PDF Duo .NET – Tajemnicza biblioteka

PDF Duo .NET twierdzi, że działa bez żadnych dodatkowych bibliotek DLL. W rzeczywistości jest on w dużej mierze nieznany i nie jest używany przez społeczność programistów. Dokumentacja praktycznie nie istnieje, a na forum pomocy technicznej znajduje się zaledwie kilka postów, wszystkie z 2019 roku.

Nawet jeśli biblioteki te działały pod względem technicznym, wprowadzały praktyczne ograniczenia:

  • Większość darmowych wersji ma spore ograniczenia (limit stron, znaki wodne, ograniczone funkcje).
  • Licencje często kryją w sobie dodatkowe koszty lub restrykcyjne klauzule.
  • Silniki są przestarzałe (IE, stara wersja Chrome, WebKit 2016) i nie radzą sobie z nowoczesnym HTML/CSS.
  • Obsługa wielu platform jest albo myląca, albo niekompletna.
  • Wdrożenie na dużą skalę wymaga zastosowania rozwiązań alternatywnych i dodatkowego debugowania.

Krótko mówiąc, komercyjne biblioteki często wyglądają atrakcyjnie na papierze, ale w praktyce powodują powstanie długu technicznego, zmuszając zespoły do wydawania znacznych środków finansowych lub ostatecznie do przejścia na bibliotekę taką jak IronPDF, która "po prostu działa".

"Darmowe" rozwiązania PDF C#, które kosztują wszystko

Czasami "bezpłatne" nie oznacza bezpłatnego. Wiele bibliotek PDF typu open source lub "próbnych" w języku C# wiąże się z ukrytymi kosztami — czy to w postaci straconego czasu programistów, niepełnej obsługi konwersji HTML do PDF, czy też subtelnych pułapek licencyjnych. Możesz myśleć, że oszczędzasz pieniądze, ale w rzeczywistości czeka Cię wiele miesięcy debugowania i stosowania obejść.

HtmlRenderer.PdfSharp – Witamy w 2005 roku

HtmlRenderer.PdfSharp obsługuje tylko bardzo stare CSS — w zasadzie to, co istniało za czasów George'a W. Bush był prezydentem. Nowoczesne funkcje CSS, takie jak flexbox, układy siatki lub border-radius, nie są obsługiwane. Każda próba ich użycia zakończy się niepowodzeniem.

Aby sformatować treść, należy polegać na tradycyjnych układach opartych na tabelach, podobnych do tych stosowanych przy tworzeniu stron internetowych w 1999 roku. Nowoczesne frameworki lub biblioteki HTML, takie jak Bootstrap, nie będą działać, a JavaScript nie jest w ogóle obsługiwany.

Jeśli spróbujesz renderować nowoczesny kod HTML, biblioteka może ulec awarii lub generować nieprawidłowe wyniki, co sprawia, że nie nadaje się ona do współczesnych potrzeb związanych z konwersją stron internetowych do formatu PDF.

PDFSharp– Biblioteka, którą wszyscy mylą

PDFSharp to solidna biblioteka do programatycznego tworzenia PDF. Nie konwertuje jednak plików HTML do formatu PDF. Jeśli potrzebujesz funkcji konwersji HTML do PDF, musisz użyć dodatkowej biblioteki, takiej jak HtmlRenderer.PdfSharp. Problem polega na tym, że HtmlRenderer.PdfSharp nie był aktualizowany od 2019 roku, więc może być przestarzały lub zawodny.

Z PDFSharp głównie ręcznie rysujesz kształty, tekst i grafiki. Na przykład można utworzyć nowy dokument PDF, dodać do niego strony oraz narysować na nich linie lub kształty, ale różni się to znacznie od renderowania treści HTML do formatu PDF.

HTMLDOC – z ery dot-com

HTMLDOC jest objęty licencją GPL, co sprawia, że jest "wirusowy" pod względem licencji. Ostatnia znacząca aktualizacja biblioteki miała miejsce w 2001 roku, więc nie nadąża ona za współczesnymi standardami. Nie obsługuje poprawnie CSS i działa wyłącznie z poziomu wiersza poleceń. Dokumentacja nadal zawiera nawet odniesienia do przeglądarki Netscape.

Aby wygenerować plik PDF, należy uruchomić polecenie typu htmldoc --webpage -f output.pdf input.html. Innymi słowy, korzystanie z HTMLDOC w dzisiejszych czasach jest niczym powrót do późnych lat 90.

Chociaż te "bezpłatne" biblioteki mogą wydawać się atrakcyjne do konwersji HTML na PDF w małych projektach, często zawodzą podczas obsługi:

  • Pełna zawartość stron internetowych: dynamiczne strony HTML, nowoczesny CSS, fragmenty kodu JavaScript.
  • Zgodność z formatem PDF: Brak obsługi formatów PDF/A, PDF/UA ani funkcji ułatwień dostępu.
  • Uprawnienia do plików i pola formularzy: Ograniczone lub nieobecne.
  • Wdrażanie na wielu platformach: Niektóre działają tylko w systemie Windows lub opierają się na silnikach przeglądarki Internet Explorer.

Próba renderowania całych stron internetowych za pomocą tych narzędzi często skutkuje częściową zawartością HTML, zepsutym układem lub plikami PDF, które są w zasadzie zrzutami ekranu, a nie dokumentami o strukturze umożliwiającej wyszukiwanie. Programiści szybko zdają sobie sprawę, że "bezpłatność" wiąże się z ukrytymi kosztami w postaci godzin straconych na debugowanie, ręczne obejścia i niespójne wyniki — a wszystko to w przypadku biblioteki, która miała ułatwić im życie.

IronPDF został stworzony specjalnie w celu rozwiązania tych problemów, oferując solidne metody generowania dokumentów PDF z plików HTML, ciągów znaków lub dynamicznej treści internetowej, z odpowiednią obsługą CSS, obsługą podziałów stron oraz płynną integracją z aplikacjami .NET.

Zgodność z Bootstrapem i nowoczesnymi frameworkami CSS

Kluczowym czynnikiem przy wyborze biblioteki do konwersji HTML na PDF jest jej obsługa Bootstrap i nowoczesnych frameworków CSS. Wiele aplikacji internetowych wykorzystuje Bootstrap do tworzenia responsywnego projektu, a możliwość konwersji tych interfejsów do formatu PDF bez modyfikacji jest niezbędna do generowania raportów, faktur i dokumentacji, które pasują do wyglądu aplikacji internetowej.

IronPDF: Pełna obsługa nowoczesnych frameworków

  • Bootstrap 5: Kompletny system układów flexbox, CSS Grid, klasy użytkowe oraz wszystkie biblioteki komponentów
  • Bootstrap 4: Kompletne systemy kart, nawigacja, narzędzia flex oraz responsywne punkty przełamania
  • Tailwind CSS: Wszystkie klasy typu "utility-first" są renderowane poprawnie
  • Foundation: Kompletny system siatki i obsługa komponentów
  • Nowoczesny CSS3: Flexbox, CSS Grid, właściwości niestandardowe, animacje, przejścia, transformacje i filtry

Weryfikacja w praktyce: IronPDF z powodzeniem renderuje stronę główną Bootstrap oraz wszystkie oficjalne przykłady z idealną wiernością pikselową.

Przykład kodu: Prezentacja porównania funkcji

using IronPdf;

// Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here";

var renderer = new ChromePdfRenderer();
string bootstrapShowcase = @"
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .feature-icon {
            width: 64px;
            height: 64px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 2rem;
            border-radius: 12px;
        }
        .comparison-badge { font-size: 0.875rem; font-weight: 600; }
    </style>
</head>
<body>
    <div class='container my-5'>
        <div class='text-center mb-5'>
            <h1 class='display-4 fw-bold mb-3'>HTML to PDF Conversion Features</h1>
            <p class='lead text-muted'>Comprehensive feature comparison across rendering engines</p>
        </div>

        <div class='row g-4 mb-5'>
            <div class='col-md-4'>
                <div class='card h-100 border-primary border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-primary text-white mx-auto mb-3'>🚀</div>
                        <h4 class='card-title'>Chromium Engine</h4>
                        <p class='text-muted mb-3'>Modern browser-grade rendering</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-success'>✓ Full CSS3 Support</span>
                            <span class='comparison-badge badge bg-success'>✓ JavaScript Execution</span>
                            <span class='comparison-badge badge bg-success'>✓ Bootstrap 5 Ready</span>
                            <span class='comparison-badge badge bg-success'>✓ Modern Standards</span>
                        </div>
                    </div>
                    <div class='card-footer bg-primary text-white text-center'>
                        <strong>IronPDF, Puppeteer Sharp</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-warning border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-warning text-dark mx-auto mb-3'>⚙</div>
                        <h4 class='card-title'>Custom Engines</h4>
                        <p class='text-muted mb-3'>Proprietary rendering implementations</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-warning text-dark'>~ 90% CSS3</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Limited JavaScript</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Partial Flexbox</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Testing Required</span>
                        </div>
                    </div>
                    <div class='card-footer bg-warning text-dark text-center'>
                        <strong>EvoPDF, Aspose, Spire, iText7</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-danger border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-danger text-white mx-auto mb-3'>⏳</div>
                        <h4 class='card-title'>WebKit Legacy</h4>
                        <p class='text-muted mb-3'>Outdated rendering technology</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-danger'>✗ No Flexbox</span>
                            <span class='comparison-badge badge bg-danger'>✗ Limited CSS3</span>
                            <span class='comparison-badge badge bg-danger'>✗ Bootstrap 3 Max</span>
                            <span class='comparison-badge badge bg-danger'>✗ Security Issues</span>
                        </div>
                    </div>
                    <div class='card-footer bg-danger text-white text-center'>
                        <strong>WkHtmlToPdf, NReco, DinkToPdf</strong>
                    </div>
                </div>
            </div>
        </div>

        <div class='card shadow-sm mb-4'>
            <div class='card-header bg-white'>
                <h4 class='mb-0'>Detailed Feature Matrix</h4>
            </div>
            <div class='card-body p-0'>
                <div class='table-responsive'>
                    <table class='table table-striped mb-0'>
                        <thead class='table-dark'>
                            <tr>
                                <th style='width: 30%'>Feature</th>
                                <th class='text-center'>Chromium</th>
                                <th class='text-center'>Custom</th>
                                <th class='text-center'>WebKit</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td><strong>HTML5 Elements</strong></td>
                                <td class='text-center'><span class='badge bg-success'>100%</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>85-95%</span></td>
                                <td class='text-center'><span class='badge bg-danger'>60-70%</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS3 Flexbox</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Partial</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS Grid Layout</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Limited</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>JavaScript Execution</strong></td>
                                <td class='text-center'><span class='badge bg-success'>V8 Engine</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Basic</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Minimal</span></td>
                            </tr>
                            <tr>
                                <td><strong>Bootstrap 5 Support</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Perfect</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Needs Testing</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Not Supported</span></td>
                            </tr>
                            <tr>
                                <td><strong>Custom Fonts (Web Fonts)</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Variable</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Limited</span></td>
                            </tr>
                            <tr>
                                <td><strong>Modern Animations</strong></td>
                                <td class='text-center'><span class='badge bg-success'>CSS3 + JS</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>CSS3 Only</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Basic CSS</span></td>
                            </tr>
                            <tr>
                                <td><strong>Security Updates</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-danger'>2016 (EOL)</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>

        <div class='row g-4'>
            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-success text-white'>
                        <h5 class='mb-0'>✓ Chromium Advantages</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Browser-Accurate:</strong> Renders exactly as Chrome/Edge displays web content</li>
                            <li class='mb-2'><strong>Modern Standards:</strong> Full HTML5, CSS3, and ES6+ JavaScript support</li>
                            <li class='mb-2'><strong>Framework Ready:</strong> Bootstrap, Tailwind, Foundation work perfectly</li>
                            <li class='mb-2'><strong>Active Updates:</strong> Regular security patches and feature improvements</li>
                            <li class='mb-0'><strong>Developer Experience:</strong> Design in browser, convert to PDF with confidence</li>
                        </ul>
                    </div>
                </div>
            </div>

            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-danger text-white'>
                        <h5 class='mb-0'>✗ Legacy Engine Issues</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Rendering Gaps:</strong> Modern CSS features don't work or require workarounds</li>
                            <li class='mb-2'><strong>Maintenance Burden:</strong> Parallel CSS for web vs PDF increases complexity</li>
                            <li class='mb-2'><strong>Limited Frameworks:</strong> Bootstrap 4/5 and modern frameworks not supported</li>
                            <li class='mb-2'><strong>Security Risks:</strong> WebKit-based engines haven't received updates since 2016</li>
                            <li class='mb-0'><strong>Development Friction:</strong> Extensive testing required for each layout</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>

        <div class='alert alert-info mt-4 d-flex align-items-start'>
            <div class='me-3 fs-3'>💡</div>
            <div>
                <h5 class='alert-heading'>Recommendation</h5>
                <p class='mb-0'>Choose Chromium-based engines (IronPDF) for production applications requiring modern web standards. Legacy engines force compromises in design and increase maintenance costs, while custom engines require extensive testing for framework compatibility.</p>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapShowcase);
pdf.SaveAs("feature-showcase.pdf");
using IronPdf;

// Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here";

var renderer = new ChromePdfRenderer();
string bootstrapShowcase = @"
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .feature-icon {
            width: 64px;
            height: 64px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 2rem;
            border-radius: 12px;
        }
        .comparison-badge { font-size: 0.875rem; font-weight: 600; }
    </style>
</head>
<body>
    <div class='container my-5'>
        <div class='text-center mb-5'>
            <h1 class='display-4 fw-bold mb-3'>HTML to PDF Conversion Features</h1>
            <p class='lead text-muted'>Comprehensive feature comparison across rendering engines</p>
        </div>

        <div class='row g-4 mb-5'>
            <div class='col-md-4'>
                <div class='card h-100 border-primary border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-primary text-white mx-auto mb-3'>🚀</div>
                        <h4 class='card-title'>Chromium Engine</h4>
                        <p class='text-muted mb-3'>Modern browser-grade rendering</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-success'>✓ Full CSS3 Support</span>
                            <span class='comparison-badge badge bg-success'>✓ JavaScript Execution</span>
                            <span class='comparison-badge badge bg-success'>✓ Bootstrap 5 Ready</span>
                            <span class='comparison-badge badge bg-success'>✓ Modern Standards</span>
                        </div>
                    </div>
                    <div class='card-footer bg-primary text-white text-center'>
                        <strong>IronPDF, Puppeteer Sharp</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-warning border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-warning text-dark mx-auto mb-3'>⚙</div>
                        <h4 class='card-title'>Custom Engines</h4>
                        <p class='text-muted mb-3'>Proprietary rendering implementations</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-warning text-dark'>~ 90% CSS3</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Limited JavaScript</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Partial Flexbox</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Testing Required</span>
                        </div>
                    </div>
                    <div class='card-footer bg-warning text-dark text-center'>
                        <strong>EvoPDF, Aspose, Spire, iText7</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-danger border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-danger text-white mx-auto mb-3'>⏳</div>
                        <h4 class='card-title'>WebKit Legacy</h4>
                        <p class='text-muted mb-3'>Outdated rendering technology</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-danger'>✗ No Flexbox</span>
                            <span class='comparison-badge badge bg-danger'>✗ Limited CSS3</span>
                            <span class='comparison-badge badge bg-danger'>✗ Bootstrap 3 Max</span>
                            <span class='comparison-badge badge bg-danger'>✗ Security Issues</span>
                        </div>
                    </div>
                    <div class='card-footer bg-danger text-white text-center'>
                        <strong>WkHtmlToPdf, NReco, DinkToPdf</strong>
                    </div>
                </div>
            </div>
        </div>

        <div class='card shadow-sm mb-4'>
            <div class='card-header bg-white'>
                <h4 class='mb-0'>Detailed Feature Matrix</h4>
            </div>
            <div class='card-body p-0'>
                <div class='table-responsive'>
                    <table class='table table-striped mb-0'>
                        <thead class='table-dark'>
                            <tr>
                                <th style='width: 30%'>Feature</th>
                                <th class='text-center'>Chromium</th>
                                <th class='text-center'>Custom</th>
                                <th class='text-center'>WebKit</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td><strong>HTML5 Elements</strong></td>
                                <td class='text-center'><span class='badge bg-success'>100%</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>85-95%</span></td>
                                <td class='text-center'><span class='badge bg-danger'>60-70%</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS3 Flexbox</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Partial</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS Grid Layout</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Limited</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>JavaScript Execution</strong></td>
                                <td class='text-center'><span class='badge bg-success'>V8 Engine</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Basic</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Minimal</span></td>
                            </tr>
                            <tr>
                                <td><strong>Bootstrap 5 Support</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Perfect</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Needs Testing</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Not Supported</span></td>
                            </tr>
                            <tr>
                                <td><strong>Custom Fonts (Web Fonts)</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Variable</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Limited</span></td>
                            </tr>
                            <tr>
                                <td><strong>Modern Animations</strong></td>
                                <td class='text-center'><span class='badge bg-success'>CSS3 + JS</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>CSS3 Only</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Basic CSS</span></td>
                            </tr>
                            <tr>
                                <td><strong>Security Updates</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-danger'>2016 (EOL)</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>

        <div class='row g-4'>
            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-success text-white'>
                        <h5 class='mb-0'>✓ Chromium Advantages</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Browser-Accurate:</strong> Renders exactly as Chrome/Edge displays web content</li>
                            <li class='mb-2'><strong>Modern Standards:</strong> Full HTML5, CSS3, and ES6+ JavaScript support</li>
                            <li class='mb-2'><strong>Framework Ready:</strong> Bootstrap, Tailwind, Foundation work perfectly</li>
                            <li class='mb-2'><strong>Active Updates:</strong> Regular security patches and feature improvements</li>
                            <li class='mb-0'><strong>Developer Experience:</strong> Design in browser, convert to PDF with confidence</li>
                        </ul>
                    </div>
                </div>
            </div>

            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-danger text-white'>
                        <h5 class='mb-0'>✗ Legacy Engine Issues</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Rendering Gaps:</strong> Modern CSS features don't work or require workarounds</li>
                            <li class='mb-2'><strong>Maintenance Burden:</strong> Parallel CSS for web vs PDF increases complexity</li>
                            <li class='mb-2'><strong>Limited Frameworks:</strong> Bootstrap 4/5 and modern frameworks not supported</li>
                            <li class='mb-2'><strong>Security Risks:</strong> WebKit-based engines haven't received updates since 2016</li>
                            <li class='mb-0'><strong>Development Friction:</strong> Extensive testing required for each layout</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>

        <div class='alert alert-info mt-4 d-flex align-items-start'>
            <div class='me-3 fs-3'>💡</div>
            <div>
                <h5 class='alert-heading'>Recommendation</h5>
                <p class='mb-0'>Choose Chromium-based engines (IronPDF) for production applications requiring modern web standards. Legacy engines force compromises in design and increase maintenance costs, while custom engines require extensive testing for framework compatibility.</p>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(bootstrapShowcase);
pdf.SaveAs("feature-showcase.pdf");
Imports IronPdf

' Set your IronPDF license key
IronPdf.License.LicenseKey = "License-Key goes here"

Dim renderer As New ChromePdfRenderer()
Dim bootstrapShowcase As String = "
<!DOCTYPE html>
<html>
<head>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .feature-icon {
            width: 64px;
            height: 64px;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 2rem;
            border-radius: 12px;
        }
        .comparison-badge { font-size: 0.875rem; font-weight: 600; }
    </style>
</head>
<body>
    <div class='container my-5'>
        <div class='text-center mb-5'>
            <h1 class='display-4 fw-bold mb-3'>HTML to PDF Conversion Features</h1>
            <p class='lead text-muted'>Comprehensive feature comparison across rendering engines</p>
        </div>

        <div class='row g-4 mb-5'>
            <div class='col-md-4'>
                <div class='card h-100 border-primary border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-primary text-white mx-auto mb-3'>🚀</div>
                        <h4 class='card-title'>Chromium Engine</h4>
                        <p class='text-muted mb-3'>Modern browser-grade rendering</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-success'>✓ Full CSS3 Support</span>
                            <span class='comparison-badge badge bg-success'>✓ JavaScript Execution</span>
                            <span class='comparison-badge badge bg-success'>✓ Bootstrap 5 Ready</span>
                            <span class='comparison-badge badge bg-success'>✓ Modern Standards</span>
                        </div>
                    </div>
                    <div class='card-footer bg-primary text-white text-center'>
                        <strong>IronPDF, Puppeteer Sharp</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-warning border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-warning text-dark mx-auto mb-3'>⚙</div>
                        <h4 class='card-title'>Custom Engines</h4>
                        <p class='text-muted mb-3'>Proprietary rendering implementations</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-warning text-dark'>~ 90% CSS3</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Limited JavaScript</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Partial Flexbox</span>
                            <span class='comparison-badge badge bg-warning text-dark'>⚠ Testing Required</span>
                        </div>
                    </div>
                    <div class='card-footer bg-warning text-dark text-center'>
                        <strong>EvoPDF, Aspose, Spire, iText7</strong>
                    </div>
                </div>
            </div>

            <div class='col-md-4'>
                <div class='card h-100 border-danger border-2 shadow-sm'>
                    <div class='card-body text-center'>
                        <div class='feature-icon bg-danger text-white mx-auto mb-3'>⏳</div>
                        <h4 class='card-title'>WebKit Legacy</h4>
                        <p class='text-muted mb-3'>Outdated rendering technology</p>
                        <div class='d-flex flex-column gap-2'>
                            <span class='comparison-badge badge bg-danger'>✗ No Flexbox</span>
                            <span class='comparison-badge badge bg-danger'>✗ Limited CSS3</span>
                            <span class='comparison-badge badge bg-danger'>✗ Bootstrap 3 Max</span>
                            <span class='comparison-badge badge bg-danger'>✗ Security Issues</span>
                        </div>
                    </div>
                    <div class='card-footer bg-danger text-white text-center'>
                        <strong>WkHtmlToPdf, NReco, DinkToPdf</strong>
                    </div>
                </div>
            </div>
        </div>

        <div class='card shadow-sm mb-4'>
            <div class='card-header bg-white'>
                <h4 class='mb-0'>Detailed Feature Matrix</h4>
            </div>
            <div class='card-body p-0'>
                <div class='table-responsive'>
                    <table class='table table-striped mb-0'>
                        <thead class='table-dark'>
                            <tr>
                                <th style='width: 30%'>Feature</th>
                                <th class='text-center'>Chromium</th>
                                <th class='text-center'>Custom</th>
                                <th class='text-center'>WebKit</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td><strong>HTML5 Elements</strong></td>
                                <td class='text-center'><span class='badge bg-success'>100%</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>85-95%</span></td>
                                <td class='text-center'><span class='badge bg-danger'>60-70%</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS3 Flexbox</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Partial</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>CSS Grid Layout</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Limited</span></td>
                                <td class='text-center'><span class='badge bg-danger'>None</span></td>
                            </tr>
                            <tr>
                                <td><strong>JavaScript Execution</strong></td>
                                <td class='text-center'><span class='badge bg-success'>V8 Engine</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Basic</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Minimal</span></td>
                            </tr>
                            <tr>
                                <td><strong>Bootstrap 5 Support</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Perfect</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Needs Testing</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Not Supported</span></td>
                            </tr>
                            <tr>
                                <td><strong>Custom Fonts (Web Fonts)</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Full</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Variable</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>Limited</span></td>
                            </tr>
                            <tr>
                                <td><strong>Modern Animations</strong></td>
                                <td class='text-center'><span class='badge bg-success'>CSS3 + JS</span></td>
                                <td class='text-center'><span class='badge bg-warning text-dark'>CSS3 Only</span></td>
                                <td class='text-center'><span class='badge bg-danger'>Basic CSS</span></td>
                            </tr>
                            <tr>
                                <td><strong>Security Updates</strong></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-success'>Active</span></td>
                                <td class='text-center'><span class='badge bg-danger'>2016 (EOL)</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>

        <div class='row g-4'>
            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-success text-white'>
                        <h5 class='mb-0'>✓ Chromium Advantages</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Browser-Accurate:</strong> Renders exactly as Chrome/Edge displays web content</li>
                            <li class='mb-2'><strong>Modern Standards:</strong> Full HTML5, CSS3, and ES6+ JavaScript support</li>
                            <li class='mb-2'><strong>Framework Ready:</strong> Bootstrap, Tailwind, Foundation work perfectly</li>
                            <li class='mb-2'><strong>Active Updates:</strong> Regular security patches and feature improvements</li>
                            <li class='mb-0'><strong>Developer Experience:</strong> Design in browser, convert to PDF with confidence</li>
                        </ul>
                    </div>
                </div>
            </div>

            <div class='col-md-6'>
                <div class='card shadow-sm h-100'>
                    <div class='card-header bg-danger text-white'>
                        <h5 class='mb-0'>✗ Legacy Engine Issues</h5>
                    </div>
                    <div class='card-body'>
                        <ul class='list-unstyled mb-0'>
                            <li class='mb-2'><strong>Rendering Gaps:</strong> Modern CSS features don't work or require workarounds</li>
                            <li class='mb-2'><strong>Maintenance Burden:</strong> Parallel CSS for web vs PDF increases complexity</li>
                            <li class='mb-2'><strong>Limited Frameworks:</strong> Bootstrap 4/5 and modern frameworks not supported</li>
                            <li class='mb-2'><strong>Security Risks:</strong> WebKit-based engines haven't received updates since 2016</li>
                            <li class='mb-0'><strong>Development Friction:</strong> Extensive testing required for each layout</li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>

        <div class='alert alert-info mt-4 d-flex align-items-start'>
            <div class='me-3 fs-3'>💡</div>
            <div>
                <h5 class='alert-heading'>Recommendation</h5>
                <p class='mb-0'>Choose Chromium-based engines (IronPDF) for production applications requiring modern web standards. Legacy engines force compromises in design and increase maintenance costs, while custom engines require extensive testing for framework compatibility.</p>
            </div>
        </div>
    </div>
</body>
</html>"

Dim pdf = renderer.RenderHtmlAsPdf(bootstrapShowcase)
pdf.SaveAs("feature-showcase.pdf")
$vbLabelText   $csharpLabel

Wynik: Kompleksowe porównanie funkcji w formacie PDF z komponentami kart Bootstrap 5, responsywnym systemem siatki, narzędziami do tworzenia plakietek, narzędziami do obsługi kolorów, komponentami tabel z paskami oraz komponentami alertów — wszystko renderowane z idealną dokładnością kolorów, wiernością układu i typografią.

Większość bibliotek HTML-to-PDF w C#: ograniczona obsługa Bootstrap lub brak jej całkowicie

Większość bibliotek C# do konwersji HTML na PDF należy do kategorii o znacznych ograniczeniach dotyczących Bootstrap:

Biblioteki oparte na WebKit (wkhtmltopdf, NReco, DinkToPdf, HiQPdf):

  • Brak obsługi flexbox (Bootstrap 4/5 w dużym stopniu opiera się na flexbox)
  • Brak CSS Grid
  • Bootstrap 3 maksymalnie (tylko układy oparte na tabelach)
  • Ostatnia aktualizacja: 2016 r. — luki w zabezpieczeniach i brak nowoczesnych funkcji CSS

Biblioteki z niestandardowymi silnikami (EvoPdf, Aspose, Spire, SelectPdf, iText):

  • Obsługa CSS3 na poziomie około 90% z brakami w kluczowych obszarach
  • Częściowa implementacja flexbox
  • Ograniczona siatka CSS
  • Wymaga intensywnego testowania dla każdego komponentu Bootstrap

Brak wsparcia dla HTML (PDFSharpCore, XFINIUM.PDF, GemBox bez dodatków):

  • Brak natywnego silnika renderowania HTML
  • Wymagana ręczna konstrukcja PDF
  • Bootstrap nie ma zastosowania

Wpływ na rozwój: Zespoły korzystające z silników innych niż Chromium muszą tworzyć uproszczone "PDF-bezpieczne" układy lub utrzymywać równoległe pliki CSS, co znacząco zwiększa czas rozwoju i zmniejsza spójność projektową między aplikacjami webowymi a wynikami PDF.

Dla pełnych wskazówek dotyczących frameworka Bootstrap i szczegółów renderowania CSS3, zobacz Przewodnik po Bootstrap & Flexbox CSS.

Projekty eksperymentalne i porzucone

Niektóre biblioteki HTML do PDF w C# zaczęły z obietnicą, ale szybko stały się technicznymi pułapkami lub wymagały zbyt skomplikowanej infrastruktury. Mogą wyglądać "nowocześnie", ale w praktyce wprowadzają ukrytą złożoność dla programistów próbujących generować dokumenty PDF z treści HTML lub pełnych stron webowych.

Gotenberg – Koszmar mikroserwisowy

Gotenberg promuje się jako łatwy w użyciu z hasłem: "Po prostu uruchom kontener Docker!" Ale w rzeczywistości, użycie go w produkcji często wymaga znacznie więcej: Docker, Kubernetes, odkrywanie usług, balansowanie obciążenia i polityki sieciowe.

To, co zaczęło się jako proste zadanie C# HTML-to-PDF, może szybko przerodzić się w problem z systemami rozproszonymi. Musisz zapewnić, że Gotenberg działa, że sieć działa poprawnie i że kontenery Docker pozostają stabilne. Dodatkowa złożoność operacyjna czyni to ciężką zależnością dla tego, co powinno być prostą konwersją PDF.

Kontrola WebView2 – Pułapka Windows-Only

Kontrola WebView2 Microsoft początkowo brzmi atrakcyjnie, ale ma znaczące ograniczenia: działa tylko na Windows, wymaga środowiska Edge WebView2 Runtime, nie działa na serwerach bez środowiska pulpitu i może mieć problemy z bezpieczeństwem sandbox.

Biblioteki takie jak Westwind.WebView.HtmlToPdf, które otaczają WebView2, dziedziczą te same ograniczenia wraz z dodatkowymi zależnościami.

Headless Chrome – Horror Process.Start

Niektórzy programiści rzeczywiście próbują generować PDF w produkcji, uruchamiając Chrome w trybie headless za pomocą Process.Start("chrome", "--headless --print-to-pdf").

To podejście ma kilka poważnych problemów:

  • Luki w zabezpieczeniach wstrzykiwania komend
  • Automatyczne aktualizacje Chrome mogą niespodziewanie wszystko zepsuć
  • Brak wbudowanego obsługi błędów
  • Tymczasowe pliki rozrzucone po systemie
  • Wymaga zainstalowania Chrome na serwerze

Ogólnie poleganie na bezpośrednim Process.Start dla generowania PDF za pomocą Headless Chrome jest uważane za ryzykowne i kruche dla środowisk produkcyjnych.

Selenium WebDriver – Narzędzie do testowania, nie generator PDF

Selenium jest zaprojektowane do testowania, a nie do generowania PDF. Używanie go do generowania PDF to jak używanie buldożera do rozbijania jajka.

Chociaż możesz nawigować instancją przeglądarki do treści HTML za pomocą czegoś takiego jak ChromeDriver i driver.Navigate().GoToUrl("data:text/html," + html), Selenium nie może generować PDF bezpośrednio. Aby zrobić coś przypominającego wyjście PDF, musisz użyć Chrome DevTools Protocol, co dodaje złożoność i często prowadzi do wycieków pamięci.

Pakiet Selenium.WebDriver.ChromeDriver po prostu dostarcza sterownik Chrome dla Selenium — nie jest to rozwiązanie dla generowania PDF.

Te projekty eksperymentalne pokazują, dlaczego próba konwersji html do pdf za pomocą porzuconych lub eksperymentalnych narzędzi często stanowi więcej kłopotów niż jest warta:

  • Gotenberg: Wymaga Docker i orkiestracji do czegoś, co powinno być prostym zadaniem konwersji pdf. Zarządzanie całymi stronami internetowymi i plikami html staje się problemem systemów rozproszonych.
  • WebView2: Tylko Windows, zależne od środowiska pulpitu i nieodpowiednie do generowania pdf na stronie serwera.
  • Headless Chrome via Process.Start: Wprowadza zagrożenia bezpieczeństwa, pliki tymczasowe i zależności od platformy.
  • Selenium WebDriver: Zaprojektowane do automatyzacji przeglądarki, nie do tworzenia dokumentów PDF. Programiści często tracą czas, próbując traktować narzędzie testowe jako konwerter pdf.

Próba renderowania elementów HTML, manipulacja dokumentami PDF lub generowanie plików PDF za pomocą tych bibliotek często kończy się nieudanymi wdrożeniami, zepsutymi układami lub nieprzeszukiwalnymi plikami PDF. IronPDF został zaprojektowany, aby wyeliminować te bóle głowy, oferując solidne metody do konwersji HTML na PDF, obsługę dynamicznej treści i pełne wsparcie dla CSS na wszystkich platformach.

"Emerging" biblioteki PDF C# (Spojler: nie są gotowe)

Nawet w 2025 roku, nowe biblioteki PDF C# nadal się pojawiają. Większość z nich obiecuje świat, ale rzeczywistość mówi inną historię. Te "emerging" rozwiązania często wyglądają ekscytująco na GitHub, ale nie są gotowe do produkcji.

PeachPDF – Oprogramowanie iluzoryczne

PeachPDF jest opisane jako "w trakcie rozwoju do użytku społecznościowego", ale w rzeczywistości jeszcze nie istnieje. Sprawdzenie repozytorium GitHub pokazuje tylko trzy comity, z ostatnim wykonanym osiem miesięcy temu. Ekosystem bibliotek PDF ma już wiele ustalonych opcji, a brak potrzeby dla więcej półskończonych projektów jak ten.

Playwright – Automatyzacja przeglądarki Microsoftu

Playwright jest zasadniczo wersją Puppeteer Microsoftu. Dzieli wiele tych samych wyzwań. Na przykład, wymaga przeglądarek binarnych, co dodaje znaczące koszty operacyjne. Wdrożenie może być skomplikowane, a nie jest to naprawdę biblioteka PDF — konwersja HTML do PDF nie jest jej głównym celem.

Korzystanie z Playwright zwykle wiąże się z zarządzaniem dodatkowymi 300MB lub więcej binarnymi plikami przeglądarki Chromium, co dodaje dalszej złożoności do każdego projektu.

Biblioteka PDF Syncfusion – Podatek za Suite

Jeśli chcesz funkcjonalności HTML-to-PDF z Syncfusion, w praktyce musisz zakupić cały ich pakiet produktów. Chociaż Syncfusion oferuje darmową licencję dla społeczności dla osób prywatnych i firm z mniej niż 5 programistami i mniejszym rocznym przychodem niż 1 mln USD, zespoły komercyjne powyżej tych progów płacą cenę subskrypcyjną, która wymaga kontaktu, aby poznać aktualne stawki. Na Linuksie dodanie wsparcia PDF wymaga również 147MB dodatkowych plików tylko po to, aby uzyskać jedną funkcję. Innymi słowy, jeśli chciałeś tylko jednej funkcji, kończysz na pozyskaniu dostępu do 70.

Aspose.PDF – Cenowy model Enterprise dla wszystkich

Aspose.PDF zaczyna się od 1 199 USD i może sięgać do 11 997 USD. Dla małych zespołów lub indywidualnych deweloperów, ta cena może być zaporowa. Dokumentacja jest obszerna, ale zakłada wysoki poziom wiedzy, przez co trudno nowym użytkownikom szybko rozpocząć pracę.

Nawet proste zadania mogą wymagać nawigacji w skomplikowanym API. Na przykład stworzenie nowego dokumentu i dodanie strony wymaga wielu kroków, które mogą wydawać się niepotrzebnie skomplikowane w porównaniu do prostszych bibliotek.

Te powstające rozwiązania są często reklamowane jako proste "konwertery HTML do PDF w C#", ale w rzeczywistości wymagają skomplikowanej konfiguracji, ręcznej pracy lub drogich zakupów pakietów. Obiecują kompatybilność krzyżową, solidne generowanie PDF lub pełne wsparcie CSS, ale testowanie w rzeczywistych aplikacjach .NET pokazuje luki:

  • Przeglądarki binarne muszą być pobierane i zarządzane ręcznie.
  • Generowanie PDF nie udaje się dla dynamicznej treści lub nowoczesnych elementów HTML.
  • Renderowanie CSS i JavaScript jest często niekompletne.
  • Dokumentacja jest minimalna lub przestarzała.

Deweloperzy, którzy próbują przyjąć te biblioteki, często spędzają dni na ich rozwiązywaniu, tylko po to, aby powrócić do dobrze znanych rozwiązań takich jak IronPDF, które zapewniają solidne wywołania metod i prawidłowo obsługują renderowanie całych stron webowych.

Szukasz lepszych alternatyw? Sprawdź nasze porównanie z Aspose.PDF lub zobacz dlaczego deweloperzy przechodzą na IronPDF.

Dlaczego stworzyliśmy IronPDF inaczej

Po doświadczeniu każdego możliwego trybu awarii w konwersji C# HTML-to-PDF, zaprojektowaliśmy IronPDF opierając się na zasadach, które naprawdę mają znaczenie dla programistów w 2025 roku. Naszym celem było proste: niezawodna konwersja pdf z treści html bez martwienia się o niedociągnięcia platform, pułapki licencyjne czy nieobsługiwane funkcje.

1. Po prostu działa™

IronPDF zapewnia prosty i niezawodny sposób generowania PDF. Nie ma zewnętrznych binariów do skopiowania, nie jest wymagana instalacja Chrome, nie ma kodu specyficznego dla platformy, o który trzeba się martwić i nie potrzeba dodatkowych "modlitw", żeby to działało.

Korzystając z IronPDF, po prostu tworzysz ChromePdfRenderer, przekazujesz swój HTML i otrzymujesz z powrotem PDF. To wszystko — rzeczywiście działa, jak oczekiwano, bez żadnej skomplikowanej konfiguracji i zależności.

using IronPdf;

public class WhatPdfGenerationShouldBe
{
    public async Task<byte[]> GeneratePdf(string html)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}
using IronPdf;

public class WhatPdfGenerationShouldBe
{
    public async Task<byte[]> GeneratePdf(string html)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}
Imports IronPdf

Public Class WhatPdfGenerationShouldBe
    Public Async Function GeneratePdf(html As String) As Task(Of Byte())
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
        Return pdf.BinaryData
    End Function
End Class
$vbLabelText   $csharpLabel

Z IronPDF konwersja HTML na PDF odbywa się w zaledwie kilku liniach. Możesz generować pliki PDF z plików HTML, ciągów HTML lub dynamicznie renderowanych stron webowych bez martwienia się o względne URL, uprawnienia do plików czy brak wsparcia dla CSS. Niezależnie od tego, czy renderujesz całe strony webowe, fragmenty HTML, czy kod HTML z obrazami, wszystko działa niezawodnie.

Potrzebujesz więcej przykładów? Sprawdź nasze poradnik konwersji HTML na PDF lub zobacz rzeczywiste przykłady kodu.

2. Zgodność prawna, której inni nie dorównują

IronPDF to jedyna biblioteka, która w pełni wspiera:

  • Sekcja 508 (amerykańskie normy dostępności)
  • PDF/A (ISO 19005 for archival)
  • PDF/UA (ISO 14289 do dostępności)

Jako członek PDF Association, nie tylko spełniamy standardy - przekraczamy je. Dlatego agencje rządowe ufają nam:

public class ComplianceThatMatters
{
    public async Task<byte[]> GenerateCompliantPdf(string html)
    {
        var renderer = new ChromePdfRenderer();

        // Full Section 508 compliance
        renderer.RenderingOptions.CreatePdfA = true;

        // Better accessibility than Chrome itself
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);

        // Add proper tags for screen readers
        pdf.AddAccessibilityTags();

        // This is why NASA, Tesla, and the US Government use IronPDF
        return pdf.BinaryData;
    }
}
public class ComplianceThatMatters
{
    public async Task<byte[]> GenerateCompliantPdf(string html)
    {
        var renderer = new ChromePdfRenderer();

        // Full Section 508 compliance
        renderer.RenderingOptions.CreatePdfA = true;

        // Better accessibility than Chrome itself
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);

        // Add proper tags for screen readers
        pdf.AddAccessibilityTags();

        // This is why NASA, Tesla, and the US Government use IronPDF
        return pdf.BinaryData;
    }
}
Imports System.Threading.Tasks

Public Class ComplianceThatMatters
    Public Async Function GenerateCompliantPdf(html As String) As Task(Of Byte())
        Dim renderer = New ChromePdfRenderer()

        ' Full Section 508 compliance
        renderer.RenderingOptions.CreatePdfA = True

        ' Better accessibility than Chrome itself
        Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)

        ' Add proper tags for screen readers
        pdf.AddAccessibilityTags()

        ' This is why NASA, Tesla, and the US Government use IronPDF
        Return pdf.BinaryData
    End Function
End Class
$vbLabelText   $csharpLabel

Oznacza to, że dokumenty PDF tworzone z stron HTML spełniają ścisłe standardy dotyczące pól formularzy, uprawnień do plików i dostępności — coś, co biblioteki konwertera PDF i narzędzia renderowania HTML często zawodzą.

Masz problemy z innymi bibliotekami? Zobacz bezpośrednie porównania:

To nie jest marketingowa paplanina. Puppeteer i Playwright dosłownie nie są w stanie generować dokumentów zgodnych ze standardami PDF/A lub PDF/UA. Korzystają oni z funkcji drukowania do pliku PDF w przeglądarce Chrome, która nie posiada tych możliwości. Kiedy Biały Dom potrzebuje plików PDF w formacie dostępnym dla osób niepełnosprawnych, nie korzysta z darmowych bibliotek — używa IronPDF.

3. Stworzone z myślą o nowoczesnym programowaniu

Nasze zaawansowane API pozwala programistom generować dokumenty PDF z treści dynamicznych za pomocą zaledwie kilku wierszy kodu:

public class AiGeneratedExample
{
    public async Task<byte[]> GenerateInvoiceWithAI(Invoice invoice)
    {
        var renderer = new ChromePdfRenderer
        {
            RenderingOptions =
            {
                MarginTop = 25,
                MarginBottom = 25,
                PaperOrientation = PdfPaperOrientation.Portrait,
                EnableJavaScript = true,
                CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
            }
        };

        var html = GenerateInvoiceHtml(invoice);
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);

        // Add metadata
        pdf.MetaData.Author = "AI-Generated";
        pdf.MetaData.Title = $"Invoice #{invoice.Number}";

        return pdf.BinaryData;
    }
}
public class AiGeneratedExample
{
    public async Task<byte[]> GenerateInvoiceWithAI(Invoice invoice)
    {
        var renderer = new ChromePdfRenderer
        {
            RenderingOptions =
            {
                MarginTop = 25,
                MarginBottom = 25,
                PaperOrientation = PdfPaperOrientation.Portrait,
                EnableJavaScript = true,
                CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
            }
        };

        var html = GenerateInvoiceHtml(invoice);
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);

        // Add metadata
        pdf.MetaData.Author = "AI-Generated";
        pdf.MetaData.Title = $"Invoice #{invoice.Number}";

        return pdf.BinaryData;
    }
}
Imports System.Threading.Tasks
Imports IronPdf

Public Class AiGeneratedExample
    Public Async Function GenerateInvoiceWithAI(invoice As Invoice) As Task(Of Byte())
        Dim renderer = New ChromePdfRenderer With {
            .RenderingOptions = New PdfRenderingOptions With {
                .MarginTop = 25,
                .MarginBottom = 25,
                .PaperOrientation = PdfPaperOrientation.Portrait,
                .EnableJavaScript = True,
                .CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
            }
        }

        Dim html = GenerateInvoiceHtml(invoice)
        Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)

        ' Add metadata
        pdf.MetaData.Author = "AI-Generated"
        pdf.MetaData.Title = $"Invoice #{invoice.Number}"

        Return pdf.BinaryData
    End Function
End Class
$vbLabelText   $csharpLabel

Programiści mogą z łatwością konwertować HTML do formatu PDF, renderując strony internetowe z obsługą CSS, z podziałem stron wewnątrz/na zewnątrz oraz opcjami CSS do drukowania. API obsługuje względne adresy URL, pliki graficzne i elementy HTML, zapewniając pełną kontrolę nad rozmiarem strony PDF, niestandardowymi nagłówkami i uprawnieniami do plików.

4. Integracja z Real OCR

IronPDF umożliwia edycję dokumentów PDF z wykorzystaniem funkcji OCR:

public class BeyondHtmlToPdf
{
    public async Task<string> ProcessScannedDocument(byte[] scannedPdf)
    {
        var pdf = PdfDocument.FromBytes(scannedPdf);

        // OCR the content
        var text = pdf.ExtractTextFromPage(0);

        if (string.IsNullOrWhiteSpace(text))
        {
            text = await pdf.ApplyOcr();
        }

        var structuredData = await ExtractWithAI(text);
        var combined = PdfDocument.Merge(pdf, otherPdf);

        combined.SignWithCertificate(certificate);
        return structuredData;
    }

    private async Task<string> ExtractWithAI(string text)
    {
        return await OpenAIService.Extract(text);
    }
}
public class BeyondHtmlToPdf
{
    public async Task<string> ProcessScannedDocument(byte[] scannedPdf)
    {
        var pdf = PdfDocument.FromBytes(scannedPdf);

        // OCR the content
        var text = pdf.ExtractTextFromPage(0);

        if (string.IsNullOrWhiteSpace(text))
        {
            text = await pdf.ApplyOcr();
        }

        var structuredData = await ExtractWithAI(text);
        var combined = PdfDocument.Merge(pdf, otherPdf);

        combined.SignWithCertificate(certificate);
        return structuredData;
    }

    private async Task<string> ExtractWithAI(string text)
    {
        return await OpenAIService.Extract(text);
    }
}
Imports System.Threading.Tasks

Public Class BeyondHtmlToPdf
    Public Async Function ProcessScannedDocument(scannedPdf As Byte()) As Task(Of String)
        Dim pdf = PdfDocument.FromBytes(scannedPdf)

        ' OCR the content
        Dim text = pdf.ExtractTextFromPage(0)

        If String.IsNullOrWhiteSpace(text) Then
            text = Await pdf.ApplyOcr()
        End If

        Dim structuredData = Await ExtractWithAI(text)
        Dim combined = PdfDocument.Merge(pdf, otherPdf)

        combined.SignWithCertificate(certificate)
        Return structuredData
    End Function

    Private Async Function ExtractWithAI(text As String) As Task(Of String)
        Return Await OpenAIService.Extract(text)
    End Function
End Class
$vbLabelText   $csharpLabel

W przeciwieństwie do innych narzędzi do konwersji plików PDF, IronPDF umożliwia generowanie dokumentów PDF ze skanowanych plików graficznych lub treści HTML oraz automatyczne wyodrębnianie danych strukturalnych, usprawniając tworzenie plików PDF w złożonych aplikacjach .NET.

Dowiedz się więcej: Łączenie plików PDF | Podpisy cyfrowe | Wyodrębnianie tekstu z plików PDF

5. Wdrożenie, które naprawdę działa

Środowiska wdrożeniowe IronPDF

IronPDF został zaprojektowany do wielopłatformowej konwersji HTML do PDF w nowoczesnych aplikacjach .NET. Możesz generować dokumenty PDF z treści HTML bez martwienia się o zależności platformowe, instalacje plików binarnych czy konfiguracje serwerów:

  • Windows Server
  • Dystrybucje systemu Linux (Ubuntu, Debian, Alpine)
  • macOS
  • Kontenery Docker
  • Azure Functions
  • AWS Lambda
  • Kubernetes

Obsługuje również wiele platform docelowych .NET:

  • .NET Framework 4.0 i nowsze wersje
  • .NET Core 2.0 i nowsze wersje
  • .NET 5, 6, 7, 8, 9 i 10

Korzystanie z biblioteki jest proste. Wystarczy utworzyć renderer, wywołać metodę RenderHtmlAsPdfAsync z treścią HTML i uzyskać plik PDF. Krótko mówiąc: po prostu działa wszędzie.

Zobacz przewodniki wdrożeniowe: Wdrożenie w Dockerze | Azure Functions | AWS Lambda | Instalacja w systemie Linux

Zintegrowane zalety techniczne

1. Prawdziwe renderowanie Chromium

Renderowanie Chromium a generowanie plików PDF w IE/WebKit

IronPDF wykorzystuje nowoczesny silnik Chromium — a nie WebKit z 2016 roku ani Internet Explorer — zapewniając pełną obsługę CSS3, JavaScript i elementów HTML.

public class ModernWebStandards
{
    public async Task<byte[]> GenerateModernPdf()
    {
        var renderer = new ChromePdfRenderer();

        var html = @"
        <style>
            .container {
                display: grid;
                grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
                gap: 2rem;
            }
            .card {
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                border-radius: 15px;
                box-shadow: 0 20px 40px rgba(0,0,0,0.1);
            }
            @media print { .no-print { display: none; } }
        </style>
        <div class='container'>
            <div class='card'>Modern CSS works!</div>
        </div>";

        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}
public class ModernWebStandards
{
    public async Task<byte[]> GenerateModernPdf()
    {
        var renderer = new ChromePdfRenderer();

        var html = @"
        <style>
            .container {
                display: grid;
                grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
                gap: 2rem;
            }
            .card {
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                border-radius: 15px;
                box-shadow: 0 20px 40px rgba(0,0,0,0.1);
            }
            @media print { .no-print { display: none; } }
        </style>
        <div class='container'>
            <div class='card'>Modern CSS works!</div>
        </div>";

        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        return pdf.BinaryData;
    }
}
Imports System.Threading.Tasks

Public Class ModernWebStandards
    Public Async Function GenerateModernPdf() As Task(Of Byte())
        Dim renderer = New ChromePdfRenderer()

        Dim html = "
        <style>
            .container {
                display: grid;
                grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
                gap: 2rem;
            }
            .card {
                background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                border-radius: 15px;
                box-shadow: 0 20px 40px rgba(0,0,0,0.1);
            }
            @media print { .no-print { display: none; } }
        </style>
        <div class='container'>
            <div class='card'>Modern CSS works!</div>
        </div>"

        Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
        Return pdf.BinaryData
    End Function
End Class
$vbLabelText   $csharpLabel

Ta solidna metoda gwarantuje, że pliki PDF zachowują prawidłowe zasady podziału stron wewnątrz dokumentu oraz po stronach, pliki graficzne są poprawnie osadzone, a ciągi HTML lub pliki HTML z dowolnego podanego adresu URL są niezawodnie konwertowane. Programiści mogą z łatwością konwertować pliki HTML na dokumenty PDF za pomocą zaledwie kilku wierszy kodu.

2. Comiesięczne aktualizacje

IronPDF dostarcza comiesięczne aktualizacje, dzięki czemu narzędzia do generowania plików PDF są zsynchronizowane z ewoluującymi standardami internetowymi.

  • Październik 2025 r.: Obsługa .NET 10 od pierwszego dnia
  • Wrzesień 2025 r.: Ulepszone interfejsy API integracji AI
  • Sierpień 2025: ulepszenia wydajności renderowania HTML na PDF
  • Lipiec 2025 r.: Natywna obsługa Apple Silicon

Porównaj to z konkurencją:

  • DinkToPdf: Ostatnia aktualizacja: czerwiec 2020 r.
  • HtmlRenderer: Ostatnia aktualizacja 2019
  • TuesPechkin: Ostatnia aktualizacja 2015

3. Rzeczywiste wsparcie

IronPDF nie pozostawi Cię na lodzie. Gdy wyślesz wiadomość e-mail na adres support@ironsoftware.com, odpowie na nią prawdziwy programista. Żadnych forów, żadnych chatbotów — po prostu ktoś, kto zna proces konwersji HTML do PDF, API PDF Converter oraz uprawnienia do plików PDF.

Rewolucja AI

Oto coś, czego nie uwzględniła żadna inna biblioteka PDF: pełna integracja z AI. IronPDF został zaprojektowany tak, aby idealnie współpracować z asystentami kodowania opartymi na sztucznej inteligencji, umożliwiając programistom generowanie dokumentów HTML, które można natychmiast przekonwertować na pliki PDF. Jest to szczególnie przydatne przy konwersji stron internetowych, fragmentów kodu HTML lub dynamicznej zawartości HTML do formatu PDF, przy zachowaniu obsługi CSS, względnych adresów URL i ustawień podziałów stron.

public class AIPoweredDocuments
{
    private readonly ChromePdfRenderer _renderer = new();

    public async Task<byte[]> GenerateAIDocument(string prompt)
    {
        // Step 1: AI generates the HTML
        var html = await GenerateHtmlWithAI(prompt);

        // Step 2: IronPDF renders it perfectly as a PDF document
        var pdf = await _renderer.RenderHtmlAsPdfAsync(html);

        // Step 3: OCR and extract data from existing PDF files
        var existingData = await ExtractDataFromPdfs();

        // Step 4: AI enhances the PDF document
        var enhanced = await EnhanceWithAI(pdf, existingData);

        return enhanced.BinaryData;
    }

    private async Task<string> GenerateHtmlWithAI(string prompt)
    {
        // IronPDF's API is so clean that ChatGPT/Claude
        // can generate working code without training
        var response = await OpenAI.Complete($@"
            Generate HTML for: {prompt}
            Requirements:
            - Use modern CSS3/HTML5
            - Include responsive design
            - Add print-specific CSS for PDF page size
        ");

        return response.Html;
    }
}
public class AIPoweredDocuments
{
    private readonly ChromePdfRenderer _renderer = new();

    public async Task<byte[]> GenerateAIDocument(string prompt)
    {
        // Step 1: AI generates the HTML
        var html = await GenerateHtmlWithAI(prompt);

        // Step 2: IronPDF renders it perfectly as a PDF document
        var pdf = await _renderer.RenderHtmlAsPdfAsync(html);

        // Step 3: OCR and extract data from existing PDF files
        var existingData = await ExtractDataFromPdfs();

        // Step 4: AI enhances the PDF document
        var enhanced = await EnhanceWithAI(pdf, existingData);

        return enhanced.BinaryData;
    }

    private async Task<string> GenerateHtmlWithAI(string prompt)
    {
        // IronPDF's API is so clean that ChatGPT/Claude
        // can generate working code without training
        var response = await OpenAI.Complete($@"
            Generate HTML for: {prompt}
            Requirements:
            - Use modern CSS3/HTML5
            - Include responsive design
            - Add print-specific CSS for PDF page size
        ");

        return response.Html;
    }
}
Imports System.Threading.Tasks

Public Class AIPoweredDocuments
    Private ReadOnly _renderer As New ChromePdfRenderer()

    Public Async Function GenerateAIDocument(prompt As String) As Task(Of Byte())
        ' Step 1: AI generates the HTML
        Dim html = Await GenerateHtmlWithAI(prompt)

        ' Step 2: IronPDF renders it perfectly as a PDF document
        Dim pdf = Await _renderer.RenderHtmlAsPdfAsync(html)

        ' Step 3: OCR and extract data from existing PDF files
        Dim existingData = Await ExtractDataFromPdfs()

        ' Step 4: AI enhances the PDF document
        Dim enhanced = Await EnhanceWithAI(pdf, existingData)

        Return enhanced.BinaryData
    End Function

    Private Async Function GenerateHtmlWithAI(prompt As String) As Task(Of String)
        ' IronPDF's API is so clean that ChatGPT/Claude
        ' can generate working code without training
        Dim response = Await OpenAI.Complete($"
            Generate HTML for: {prompt}
            Requirements:
            - Use modern CSS3/HTML5
            - Include responsive design
            - Add print-specific CSS for PDF page size
        ")

        Return response.Html
    End Function
End Class
$vbLabelText   $csharpLabel

Takie podejście pozwala programistom generować dokumenty PDF z treści HTML utworzonych przez AI — w tym pól formularzy, obrazów i niestandardowych nagłówków — za pomocą zaledwie kilku wierszy kodu. IronPDF płynnie obsługuje konwersję HTML do PDF, OCR i ekstrakcję AI, tworząc w pełni edytowalne, dostępne i profesjonalne pliki PDF gotowe do użycia w dowolnej aplikacji .NET.

Dlaczego programiści wybierają IronPDF

Dzięki IronPDF rozpoczęcie pracy jest niezwykle szybkie i proste: wystarczy zainstalować pakiet, napisać zaledwie trzy linijki kodu i wygenerować plik PDF — wszystko to w około pięć minut.

Natomiast inne rozwiązania do konwersji HTML na PDF często wiążą się ze znacznie dłuższym procesem konfiguracji: trzeba zainstalować pakiet, pobrać wymagane pliki binarne, skonfigurować ścieżki do plików, poradzić sobie z różnicami między platformami, debugować awarie i radzić sobie z innymi komplikacjami. Dla wielu programistów może to zająć nawet dwa tygodnie, co często skłania ich do przejścia na IronPDF ze względu na prostotę i niezawodność.

Programiści cenią IronPDF, ponieważ sprawia, że generowanie plików PDF jest szybkie, niezawodne i łatwe. API jest proste, więc utworzenie pliku PDF z pliku HTML lub treści HTML wymaga zaledwie kilku wierszy kodu. Użytkownicy końcowi zyskują dzięki przystępnym i dobrze zorganizowanym plikom PDF, zawierającym odpowiednie pola formularzy, obrazy oraz spójne odwzorowanie całych stron internetowych. IronPDF eliminuje kłopoty związane z problemami specyficznymi dla platformy, skomplikowanymi konfiguracjami lub niedziałającymi narzędziami innych firm.

Wypróbuj sam

Nie czytaj o tym – przekonaj się, jak proste może być tworzenie plików PDF dzięki IronPDF:

// Install-Package IronPdf
using IronPdf;

class Program
{
    static async Task Main()
    {
        // Your first PDF in 3 lines of code
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Hello World</h1>");
        pdf.SaveAs("hello.pdf");

        // No configuration, no extra binaries, no complicated setup
        // It just works across Windows, Linux, macOS, and Docker
    }
}
// Install-Package IronPdf
using IronPdf;

class Program
{
    static async Task Main()
    {
        // Your first PDF in 3 lines of code
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Hello World</h1>");
        pdf.SaveAs("hello.pdf");

        // No configuration, no extra binaries, no complicated setup
        // It just works across Windows, Linux, macOS, and Docker
    }
}
Imports IronPdf

Class Program
    Shared Async Function Main() As Task
        ' Your first PDF in 3 lines of code
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = Await renderer.RenderHtmlAsPdfAsync("<h1>Hello World</h1>")
        pdf.SaveAs("hello.pdf")

        ' No configuration, no extra binaries, no complicated setup
        ' It just works across Windows, Linux, macOS, and Docker
    End Function
End Class
$vbLabelText   $csharpLabel

Dzięki IronPDF możesz przekształcić dowolną treść HTML lub dynamicznie generowaną treść internetową w profesjonalny dokument PDF za pomocą zaledwie kilku wierszy kodu. Biblioteka obsługuje konwersję HTML do PDF, skalowanie stron, obsługę CSS, względne adresy URL, obrazy i wiele więcej — wszystko to bez skomplikowanej konfiguracji.

Niezależnie od tego, czy tworzysz faktury, raporty czy całe strony internetowe w formacie PDF, IronPDF płynnie integruje się z aplikacjami Visual Studio i .NET. Otrzymujesz niezawodne renderowanie elementów HTML, prawidłową strukturę dokumentu oraz pełną kontrolę nad uprawnieniami do plików i polami formularzy, a wszystko to przy zachowaniu prostego i łatwego w utrzymaniu kodu.

Potrzebujesz pomocy? Zespół wsparcia IronPDF łączy cię z prawdziwymi inżynierami. Brak chatbotów, brak skryptów, tylko eksperci, którzy znają bibliotekę.

Materiały dla początkujących:

Podsumowanie

Stworzyliśmy IronPDF, ponieważ mieliśmy dość frustracji, z jaką programiści borykali się w przypadku innych bibliotek: przestarzałego kodu, "bezpłatnych" rozwiązań, których debugowanie zajmowało tygodnie, specyficznych dla platformy dziwactw oraz pytań do pomocy technicznej pozostających bez odpowiedzi.

Osiem lat później, z ponad 10 milionami pobrań w serwisie NuGet, IronPDF pozostaje jedyną biblioteką do konwersji HTML na PDF, która:

  • Co miesiąc aktualizowane o ulepszenia i obsługę .NET
  • Działa spójnie w systemach Windows, Linux, macOS i Docker
  • Oferuje prawdziwe wsparcie dla programistów zamiast forów lub chatbotów
  • Płynnie integruje się z nowoczesnymi narzędziami do kodowania opartymi na sztucznej inteligencji
  • Zawiera funkcje OCR i edycji plików PDF
  • Spełnia standardy zgodności z sekcją 508, PDF/A i PDF/UA

Rozumiemy to — nikt nie chce płacić za bibliotekę plików PDF. Ale rzeczywistość jest taka: i tak będziesz musiał zapłacić. Możesz zapłacić $999 raz za IronPDF, lub możesz zapłacić tygodnie debugowania, niepowodzenia produkcji i ostatecznie kupić IronPDF, gdy wszystko inne zawiedzie.

Nie stworzyliśmy IronPDF, aby był kolejną opcją. Stworzyliśmy to, aby było rozwiązaniem. Nie bez powodu mamy 10 milionów pobrań i klientów takich jak NASA, Tesla i Biały Dom — programiści wypróbowują "darmowe" opcje, tracą tygodnie, a potem trafiają do nas. Oszczędź sobie tej podróży.

Chcesz przestać zmagać się z generowaniem plików PDF?

IronPDF: Wybierz właściwe rozwiązanie za pierwszym razem. Twoja przyszła ja (i Twoi użytkownicy) będą Ci wdzięczni.

Zwróć uwagęABCpdf, Aspose, DinkToPdf, ExpertPDF, GemBox, Gotenberg, GrabzIt, HTMLDOC, HiQPdf, NReco, PDF Duo .NET, PDFMyUrl, PDFSharp, PeachPDF, Playwright, PuppeteerSharp, QuestPDF, Rotativa, SelectPDF, Spire, Syncfusion, TuesPechkin, WebView2, Winnovative, Xfinium PDF, iText, and wkhtmltopdf are registered trademarks of their respective owners. This site is not affiliated with, endorsed by, or sponsored by Aspose Pty Ltd, CodeFlint, DinkToPdf, DuoDimension, Easy Software Products, GemBox Ltd., Gotenberg, GrabzIt, HiQPdf Software, Microsoft, NReco, Outside Software SRL, PDFmyURL, PeachPDF, PuppeteerSharp, Rotativa, SelectPdf, Syncfusion, TuesPechkin, Viscom Software, WebSupergoo Software, Winnovative Software, XFINIUM Software, e-iceblue, empira Software GmbH, iText Group, or wkhtmltopdf. 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.

Często Zadawane Pytania

Co wyróżnia IronPDF spośród innych bibliotek do konwersji HTML na PDF w języku C#?

IronPDF oferuje uproszczony proces konfiguracji w porównaniu z innymi rozwiązaniami do konwersji HTML na PDF, eliminując konieczność instalowania wielu pakietów, pobierania dodatkowych plików binarnych i konfigurowania ścieżek do plików. Ta prostota pomaga uniknąć różnic między platformami i minimalizuje konieczność debugowania.

Dlaczego łatwość konfiguracji jest ważna w bibliotekach HTML do PDF?

Łatwość konfiguracji ma kluczowe znaczenie, ponieważ pozwala programistom zaoszczędzić czas i zmniejsza złożoność związaną z integracją biblioteki z aplikacjami. IronPDF znacznie upraszcza ten proces w porównaniu z innymi rozwiązaniami.

W jaki sposób IronPDF radzi sobie z różnicami między platformami?

IronPDF płynnie radzi sobie z różnicami między platformami, co eliminuje konieczność ręcznej konfiguracji lub debugowania problemów z kompatybilnością w różnych systemach operacyjnych przez programistów.

Jakie są typowe wyzwania związane z innymi rozwiązaniami do konwersji HTML na PDF?

Inne rozwiązania często wymagają czasochłonnej konfiguracji, takiej jak instalacja dodatkowych pakietów, konfiguracja ścieżek plików i rozwiązywanie problemów specyficznych dla danej platformy, co może prowadzić do wydłużenia czasu poświęcanego na debugowanie i konserwację.

W jaki sposób IronPDF usprawnia proces debugowania?

IronPDF zmniejsza prawdopodobieństwo awarii i komplikacji podczas konfiguracji i wykonywania, co skutkuje mniejszą liczbą sesji debugowania w porównaniu z innymi bibliotekami do konwersji HTML na PDF.

Czy IronPDF nadaje się do zastosowań na dużą skalę?

Tak, IronPDF został zaprojektowany z myślą o wydajnej obsłudze aplikacji na dużą skalę, oferując wysoką wydajność i niezawodny proces konwersji, który jest niezbędny w projektach na poziomie Enterprise.

Jakie korzyści czerpią programiści z korzystania z IronPDF?

Programiści czerpią korzyści z szybkiej integracji IronPDF, mniejszej złożoności konfiguracji oraz niezawodnych funkcji konwersji HTML do PDF, co pozwala zaoszczędzić czas i zasoby podczas tworzenia oprogramowania.

Czy IronPDF radzi sobie ze złożonymi strukturami HTML?

IronPDF jest zdolny do precyzyjnego konwertowania złożonych struktur HTML na format PDF, zachowując style, układy i interaktywne elementy z wysoką wiernością.

W jaki sposób IronPDF zapewnia kompatybilność między platformami?

IronPDF jest zaprojektowany jako rozwiązanie wielopłatformowe, zapewniające spójne działanie na różnych systemach operacyjnych bez konieczności dodatkowej konfiguracji ze strony programisty.

Co sprawia, że IronPDF jest niezawodnym wyborem do konwersji z HTML na PDF?

Niezawodność IronPDF wynika z łatwości użytkowania, solidnej wydajności oraz zdolności do obsługi skomplikowanych dokumentów HTML bez kompromisów w zakresie jakości lub prędkości.

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

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie