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

Jak konwertować HTML do PDF w C# dla .NET 10 używając IronPDF

Problem z biblioteką PDF dla języka C#, od którego wszystko się zaczęło

IronPDF

W 2016 roku nasz zespół konsultantów w Iron Software tonął w koszmarach związanych z konwersją HTML do 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 biblioteka PDF dla języka C# – przynęta i zamiana

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

iTextSharp – "bezpłatna" biblioteka, która w rzeczywistości taka nie jest

W 2009 roku iTextSharp był promowany jako bezpłatna biblioteka PDF typu open source. 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. Stworzyło to coś, co wielu programistów nazywa "pułapką AGPL": użyj iTextSharp i albo udostępnij pełny kod źródłowy, albo zapłać znaczną 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ą polegać na dodatkowych komponentach, takich jak XMLWorker lub dodatek pdfHTML, które wiążą się z własnymi zależnościami i dodatkową złożonością licencyjną.

To połączenie restrykcyjnej licencji i braku wbudowanej obsługi konwersji HTML do PDF jest powodem, dla którego wiele zespołów unika obecnie iTextSharp.

iTextSharp nie jest jedynym rozwiązaniem. 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. Tak zwana "licencja społecznościowa" to AGPL, która zobowiązuje użytkownika do udostępnienia całego projektu na licencji open source lub zakupu licencji komercyjnej. Ceny komercyjne wahają się mniej więcej od 699 do 7999 dolarów, co może wydawać się wysoką kwotą za bibliotekę, która nie oferuje gotowej funkcji renderowania HTML do PDF.

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.

Katastrofa wkhtmltopdf (2016–2024)

Korzystanie z WkHtmlToPdf w środowisku produkcyjnym było niezwykle uciążliwe. 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 wcale 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 uciążliwym procesem wdrażania sprawiała, że WkHtmlToPdf był ryzykownym wyborem dla poważnych obciążeń produkcyjnych.

W 2024 roku wkhtmltopdf zostało ostatecznie wycofane. 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 faktycznie 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.

Komercjalne biblioteki C# do obsługi plików PDF, 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 około 680 dolarów, a to tylko za podstawową konwersję HTML do PDF. 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 "wieloplatformowości"

SelectPdf jest często przedstawiany jako wieloplatformowe 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 ma wysoką cenę wynoszącą 799 USD za bibliotekę, która przez lata nabrała sporego bagażu. 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 byciu 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 C# do obsługi plików PDF, 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 programowego tworzenia plików 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.

W PdfSharp rysujesz głównie kształty, tekst i grafikę ręcznie. 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 C# do konwersji HTML na PDF: ograniczona obsługa Bootstrap lub jej brak

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

Niestandardowe biblioteki silników (EvoPdf, Aspose, Spire, SelectPdf, iText7):

  • Obsługa CSS3 na poziomie około 90% z brakami w kluczowych obszarach
  • Partial flexbox implementation
  • Limited CSS Grid
  • Requires extensive testing for each Bootstrap component

No HTML Support (PDFSharpCore, XFINIUM.PDF, GemBox without add-ons):

  • No native HTML rendering engine
  • Manual PDF construction required
  • Bootstrap not applicable

Development impact: Teams using non-Chromium engines must create simplified "PDF-safe" layouts or maintain parallel CSS files, significantly increasing development time and reducing design consistency between web applications and PDF outputs.

For comprehensive Bootstrap framework guidance and CSS3 rendering details, see the Bootstrap & Flexbox CSS Guide.

The Experimental and Abandoned Projects

Some HTML to PDF libraries in C# started with promise but quickly became technical dead ends or required overly complex infrastructure. They may appear "modern," but in practice, they introduce hidden complexity for developers trying to generate PDF documents from HTML content or full web pages.

Gotenberg – The Microservice Nightmare

Gotenberg promotes itself as easy to use with the tagline: "Just run a Docker container!" But in reality, using it in production often requires much more: Docker, Kubernetes, service discovery, load balancing, and network policies.

What started as a simple C# HTML-to-PDF task can quickly turn into a distributed systems problem. You need to ensure Gotenberg is running, that the network is working correctly, and that Docker containers remain stable. The added operational complexity makes it a heavy dependency for what is supposed to be a straightforward PDF conversion.

WebView2 Control – The Windows-Only Trap

Microsoft's WebView2 control initially sounds appealing, but it comes with significant limitations: it only works on Windows, requires the Edge WebView2 Runtime, doesn't function on servers without a desktop environment, and can have security sandbox issues.

Libraries like Westwind.WebView.HtmlToPdf that wrap WebView2 inherit the same limitations, along with additional dependencies.

Chrome Headless – The Process.Start Horror

Some developers actually try to generate PDFs in production by running Chrome in headless mode using Process.Start("chrome", "--headless --print-to-pdf").

This approach comes with several serious problems:

  • Command injection vulnerabilities
  • Chrome auto-updates can break everything unexpectedly
  • No built-in error handling
  • Temporary files scattered across the system
  • Requires Chrome to be installed on the server

Overall, relying on direct Process.Start for Chrome headless PDF generation is considered risky and fragile for production environments.

Selenium WebDriver – Testing Tool, Not a PDF Generator

Selenium is designed for testing, not for generating PDFs. Using it for PDF generation is like using a bulldozer to crack an egg.

While you can navigate a browser instance to HTML content using something like ChromeDriver and driver.Navigate().GoToUrl("data:text/html," + html), Selenium cannot generate PDFs directly. To do anything resembling PDF output, you need to use the Chrome DevTools Protocol, which adds complexity and often leads to memory leaks.

The Selenium.WebDriver.ChromeDriver package simply provides the Chrome driver for Selenium — it is not a PDF generation solution.

These experimental projects demonstrate why attempting html to pdf conversion using abandoned or experimental tools is often more trouble than it's worth:

  • Gotenberg: Requires Docker and orchestration for something that should be a simple pdf conversion task. Managing entire web pages and html files becomes a distributed systems problem.
  • WebView2: Windows-only, dependent on desktop environments, and not suitable for server-side pdf generation.
  • Chrome Headless via Process.Start: Introduces security risks, temp files, and platform dependencies.
  • Selenium WebDriver: Designed for browser automation, not creating PDF documents. Developers often waste time trying to treat a testing tool as a pdf converter.

Attempting to render HTML elements, manipulate PDF documents, or generate PDF files with these libraries often results in failed deployments, broken layouts, or unsearchable PDFs. IronPDF was designed to eliminate these headaches, offering robust methods to convert HTML to PDF, handle dynamic content, and provide full CSS support across all platforms.

The "Emerging" C# PDF Libraries (Spoiler: They're Not Ready)

Even in 2025, new C# PDF libraries keep popping up. Most of them promise the world, but reality tells a different story. These "emerging" solutions often look exciting on GitHub but aren't production-ready.

PeachPDF – Vaporware

PeachPDF is described as "in development for community use," but in reality, it doesn't really exist yet. Checking the GitHub repository shows only three commits, with the last one made eight months ago. The PDF library ecosystem already has many established options, and there's little need for more half-finished projects like this.

Playwright – Microsoft's Browser Automation

Playwright is essentially Microsoft's version of Puppeteer. It shares many of the same challenges. For example, it requires browser binaries, which adds significant overhead. Deployment can be complex, and it isn't really a PDF library — HTML-to-PDF conversion is not its primary focus.

Using Playwright typically involves managing an additional 300MB or more of Chromium browser binaries, which adds further complexity to any project.

Syncfusion PDF Library – The Suite Tax

If you want HTML-to-PDF functionality with Syncfusion, you effectively have to purchase their entire suite of products. The minimum cost is $995 per developer. On Linux, this also adds 147MB of additional files just to get a single feature. In other words, if you only wanted one feature, you end up buying access to 70.

Aspose.PDF – Enterprise Pricing for Everyone

Aspose.PDF starts at $1,199 and can go up to $11,997. For small teams or individual developers, this pricing can be prohibitive. The documentation is extensive but assumes a high level of expertise, making it difficult for newcomers to quickly get started.

Even simple tasks can require navigating a complex API. For example, creating a new document and adding a page involves multiple steps, which can feel unnecessarily complicated compared to more straightforward libraries.

These emerging solutions are often marketed as easy "HTML to PDF C# converters," but in reality, they require complex setup, manual work, or expensive suite purchases. They promise cross-platform compatibility, robust PDF generation, or full CSS support, but testing in real-world .NET applications shows gaps:

  • Browser binaries must be downloaded and managed manually.
  • PDF generation fails for dynamic content or modern HTML elements.
  • CSS and JavaScript rendering is often incomplete.
  • Documentation is minimal or outdated.

Developers who try to adopt these libraries often spend days troubleshooting, only to revert to well-established solutions like IronPDF, which provide robust method calls and handle rendering entire web pages reliably.

Looking for better alternatives? Check our comparison with Aspose.PDF or see why developers switch to IronPDF.

Why We Built IronPDF Differently

After experiencing every failure mode possible in C# HTML to PDF conversion, we designed IronPDF around principles that actually matter to developers in 2025. Our goal was simple: reliable pdf conversion from html content without worrying about platform quirks, licensing traps, or unsupported features.

1. It Just Works™

IronPDF provides a straightforward and reliable way to generate PDFs. There are no external binaries to copy, no Chrome installation required, no platform-specific code to worry about, and no extra "prayers" needed for it to work.

Using IronPDF, you simply create a ChromePdfRenderer, pass in your HTML, and get back a PDF. That's it — it actually works, as expected, without any complex setup or dependencies.

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

With IronPDF, HTML to PDF conversion happens in just a few lines. You can generate PDF files from an HTML files, HTML string, or dynamically rendered web pages without worrying about relative URLs, file permissions, or missing CSS support. Whether you're rendering entire web pages, HTML snippets, or HTML code with images, it all works reliably.

Need more examples? Check our HTML to PDF conversion tutorial or see real-world code samples.

IronPDF is the only library that fully supports:

  • Section 508 (US Accessibility Standards)
  • PDF/A (ISO 19005 for archival)
  • PDF/UA (ISO 14289 for accessibility)

As a member of the PDF Association, we don't just meet standards - we exceed them. This is why government agencies trust us:

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

This means PDF documents created from HTML pages meet strict standards for form fields, file permissions, and accessibility — something PDF converter libraries and HTML renderer tools often fail at.

Struggling with other libraries? See direct comparisons:

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

IronPDF deployment environments

IronPDF został zaprojektowany do wieloplatformowej 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

Chromium Rendering vs. IE/WebKit PDF Generation

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 r.: o 30% szybsze renderowanie HTML do 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 odpowiada średnio w ciągu 23 sekund — prawdziwi inżynierowie są dostępni 24 godziny na dobę, 7 dni w tygodniu. Żadnych chatbotów, żadnych skryptów, tylko eksperci znający 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ć. You can pay $799 once for IronPDF, or you can pay with weeks of debugging, production failures, and eventually buying IronPDF anyway after everything else fails.

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.

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 wieloplatformowe, 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

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie