IRONSOFTWAREHOME

Iron Suite for .NET

10 bibliotek .NET. Jeden kompletny pakiet dokumentów.

IRONPDF
IRONWORD
IRONXL
IRONPPT
IRONOCR
IRONBARCODE
IRONQR
IRONPRINT
IRONZIP
IRONWEBSCRAPER
PORÓWNANIE

Wybór najlepszej biblioteki C# do generowania dokumentów w 2026

Curtis Chau
Curtis Chau
Updated: 28 czerwca 2026

Wybor biblioteki PDF dla C# wpływa na ekspozycje licencyjna projektu, elastycznosc wdrożenia oraz dlugoterminowy koszt utrzymania. Wiekszosc bibliotek, ktore wydaja sie odpowiednie w trakcie oceny, ujawnia ograniczenia w produkcji — wymagania AGPL, ktorego sie nie spodziewales, renderowanie HTML niezgodne z przeglądarka lub wycieki pamięci, ktore wystepuja tylko na Linuxie.

Ten artykuł porownuje glówne opcje z przykładami kodu, dokumentuje kompromisy, które maja znaczenie w praktyce, oraz zawiera porównanie kodu generującego ten sam rachunek w trzech różnych bibliotekach, aby można bylo bezpośrednio zobaczyć roznice w API.

Szybki start: HTML do PDF w trzech liniach

Zainstaluj poprzez NuGet:

PM > Install-Package IronSuite

Wygeneruj plik PDF:

using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");

Działa na systemach Windows, Linux, macOS i Docker bez dodatkowej konfiguracji. Wynik jest zgodny z przeglądarką Chrome, ponieważIronPDF wykorzystuje ten sam silnik renderujący Chromium.

Kryteria oceny

Zanim zaczniesz porównywać biblioteki, dowiedz się, co należy oceniać. Oto pytania, które pozwalają wcześnie wykryć problemy produkcyjne:

KryteriaCo należy przetestowaćDlaczego to ma znaczenie
Renderowanie HTML/CSSPrzekaż jej swoje rzeczywiste szablony z Flexbox/GridWiększość bibliotek deklaruje obsługę HTML, ale w najlepszym razie renderuje CSS 2.1
Wykonanie koduJavaScriptTest z wykorzystaniem Chart.js lub dynamicznej zawartości tabeliBiblioteki bez obsługi JS generują puste sekcje
Model licencyjnyZapoznaj się z pełną treścią licencji, a nie tylko z jej streszczeniemLicencja AGPL wymaga udostępnienia całej aplikacji na zasadach open source
Obsługa platformWdrożenie w docelowym środowisku Linux/Docker/ARM64Sukces systemu Windows nie pozwala przewidzieć zachowania systemu Linux
Pamięć pod obciążeniemGeneruj ponad 100 dokumentów w pętliTesty na pojedynczych dokumentach ukrywają luki, które powodują awarie serwerów produkcyjnych
Opublikowane cenySprawdź, czy ceny są podane na stronie internetowej"Skontaktuj się z działem sprzedaży" często oznacza 15 000–210 000 USD rocznie

Porównanie bibliotek

IronPDF — wbudowany Chromium, pełna obsługa CSS/JS

IronPDF osadza Chromium bezpośrednio w pakiecie NuGet. Renderowanie HTML odpowiada Chrome, ponieważ jest to silnik Chrome. CSS Flexbox, Grid, właściwości niestandardowe iJavaScriptdziałają zgodnie z oczekiwaniami.

using IronPdf;

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;

var pdf = renderer.RenderHtmlAsPdf(@"
    <html>
    <head>
        <style>
            .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
            .card { background: linear-gradient(135deg, #f8fafc, #e2e8f0);
                    border-radius: 8px; padding: 20px; text-align: center; }
        </style>
    </head>
    <body>
        <div class='grid'>
            <div class='card'><h3>Revenue</h3><p>$1.2M</p></div>
            <div class='card'><h3>Users</h3><p>45,230</p></div>
            <div class='card'><h3>Uptime</h3><p>99.97%</p></div>
        </div>
    </body>
    </html>");
pdf.SaveAs("dashboard.pdf");

Kompromisy, które należy wziąć pod uwagę: Wbudowany Chromium zwiększa rozmiar pakietu instalacyjnego o około 200 MB. W przypadku standardowych wdrożeń na serwerach i w kontenerach jest to jednorazowe pobranie, które nie ma wpływu na działanie środowiska uruchomieniowego. W przypadku środowisk o ograniczonej wielkości, takich jak plan konsumpcyjny Azure Functions, należy sprawdzić limit wielkości wdrożenia. Pierwsze wygenerowanie pliku PDF w procesie na zimno zajmuje 2–5 sekund na inicjalizację Chromium; kolejne generacje działają w czasie 100–500 ms. Wymagania pamięciowe wynoszą około 150–200 MB — należy odpowiednio zaplanować zasoby kontenera.

Licencjonowanie: Licencje wieczyste zaczynaja sie od $liteLicense (1 programista). Ceny opublikowane na stronie ironpdf.com. Brak opłat za dokument, brak licencji AGPL, brak progów przychodów.

iText (iText) — Licencjonowanie AGPL, ograniczony HTML

iText to wydajna biblioteka do obsługi plików PDF o długiej historii. Dodatek pdfHTML umożliwia konwersję HTML do PDF, ale nie korzysta z silnika przeglądarki — aproksymuje CSS 2.1 za pomocą niestandardowego parsera.

Zespół produkcyjny w średniej wielkości firmie SaaS odkrył to podczas migracji szablonów faktur z widoków Razor. Szablony wykorzystują CSS Flexbox do tworzenia responsywnych układów kolumn. Po zintegrowaniu biblioteki pdfHTML firmyiTextwszystkie faktury były renderowane jako pionowy stos w jednym kolumnie. Wlasciwosci display: flex, gap i justify-content zostaly cicho zignorowane. Zespół poświęcił trzy tygodnie na prace programistyczne, zanim zdał sobie sprawę, że pdfHTML nie jest w stanie renderować ich istniejącego CSS.

**Rzeczywistość AGPL:**iTextkorzysta z licencji AGPL. Jeśli Twoja aplikacja jest dostępna w sieci — co obejmuje każdą aplikację internetową, API i produkt SaaS — musisz udostępnić cały kod źródłowy aplikacji na licencji AGPL. Nie tylko moduł PDF. Wszystko.iTexti firma macierzysta Apryse aktywnie dbają o to.

Licencjonowanie komercyjne: w 2024 r. firmaiTextprzeszła na model licencjonowania oparty na subskrypcji. Ceny nie są publikowane — w celu uzyskania wyceny należy skontaktować się z działem sprzedaży. Dane zewnętrzne wskazują na kwotę od 15 000 do 210 000 dolarów rocznie, w zależności od intensywności użytkowania.

PDFSharp — Licencja MIT, brak HTML

PdfSharp jest naprawde darmowy na licencji MIT z 34,9 mln pobran NuGet. Kompromisem jest funkcjonalność: zapewnia API rysowania oparte na współrzędnych, bez parsera HTML, silnika CSS i systemu szablonów.

Zespół budujacy pulpit raportowania wybral PdfSharp, poniewaz byl bezplatny i dobrze znany. Spędzili cztery miesiące na pisaniu kodu układu opartego na współrzędnych — obliczając pozycje X/Y dla każdego elementu tekstowego, rysując obramowania tabel piksel po pikselu, ręcznie obsługując podziały stron. Kiedy w końcu porównali swój wynik z tym, co ten sam szablon HTML wygenerował w przeglądarce, zdali sobie sprawę, że stworzyli gorszą wersję tego, co biblioteka oparta na Chromium robi automatycznie.

PdfSharp dziala dobrze do laczenia PDFow, dodawania znakow wodnych i budowania prostych dokumentow strukturalnych z danych. Jeśli nie potrzebujesz renderowania HTML, pozostaje to uzasadnioną opcją.

QuestPDF — Eleganckie API, bez HTML, próg przychodów

QuestPDF oferuje płynny interfejs API w języku C# do programowego tworzenia dokumentów. Projekt API jest naprawdę dobry — to jedno z lepszych API bibliotek .NET w każdej kategorii.

Istotne są dwa ograniczenia:QuestPDFnie renderuje HTML (z założenia — jest to świadomy wybór architektoniczny, a nie brakująca funkcja), a licencja Community License obejmuje firmy o rocznych przychodach brutto poniżej 1 mln USD. Gdy Twoja firma przekroczy ten próg, licencja komercyjna staje się obowiązkowa. Firmy zbliżające się do tego punktu zwrotnego powinny przeznaczyć środki na tę transformację, zanim stanie się ona pilna.

Pomimo jasnego pozycjonowaniaQuestPDFw opozycji do HTML, programiści często odkrywają to dopiero po rozpoczęciu wdrażania, ponieważ biblioteka pojawia się w wynikach wyszukiwania "biblioteka PDF dla C#" obok bibliotek obsługujących HTML.

Nadrzędki wkhtmltopdf — porzucone, niezałatane luki CVE

Czas wkhtmltopdf już minął. Organizacja GitHub została zarchiwizowana w lipcu 2024 r. Podstawowy silnik QtWebKit został wycofany przez Qt w 2015 roku. Znane luki CVE — w tym CVE-2022-35583 (CVSS 9.8, umożliwiająca wyciek danych uwierzytelniających AWS poprzez SSRF) — nigdy nie zostaną załatane.

Narzędzia typu wrapper dla języka C#, takie jak DinkToPdf, NReco.PdfGenerator i WkHtmlToXSharp, wykorzystują ten sam, już nieaktualny plik binarny. Silnik renderujący jest zamrożony na poziomie możliwości Safari z około 2011 roku: bez Flexbox, bez Grid, z ograniczonym JavaScriptem. Nie jest to opcja odpowiednia dla nowych projektów.

Puppeteer Sharp — pełne renderowanie, złożoność operacyjna

Puppeteer Sharp kontroluje Headless Chrome przez powiazania .NET. Jakość renderowania odpowiada Chrome, ponieważ jest to Chrome. Kompromis ma charakter operacyjny: zarządzasz zewnętrznymi procesami przeglądarki, w tym pobieraniem, pulą procesów, monitorowaniem pamięci i odzyskiwaniem po awarii.

using PuppeteerSharp;

// Downloads ~280MB Chromium on first run
await new BrowserFetcher().DownloadAsync();

await using var browser = await Puppeteer.LaunchAsync(
    new LaunchOptions { Headless = true });
await using var page = await browser.NewPageAsync();
await page.SetContentAsync(html);
return await page.PdfAsync(new PdfOptions { Format = PaperFormat.A4, PrintBackground = true });

W środowisku produkcyjnym potrzebne są również puli procesów przeglądarki, monitorowanie wycieków pamięci (procesy Chromium mogą powodować wycieki), odzyskiwanie po awarii oraz czyszczenie zasobów. Wdrożenie w Dockerze wymaga zainstalowania zależności Chromium — co oznacza znaczny plik Dockerfile w porównaniu ze standardowym obrazem .NET Standard.Puppeteer Sharpjest opłacalny, jeśli Twój zespół jest w stanie pokryć związane z nim koszty operacyjne.

Aspose.PDF — bogate funkcje, problemy z pamięcią w systemie Linux

Aspose.PDF oferuje szeroki zakres funkcji związanych z plikami PDF wraz z dobrą dokumentacją. Istotną kwestią jest stabilność systemu Linux:Asposeopiera się na bibliotece System.Drawing.Common, która w systemie Linux wymaga biblioteki libgdiplus — biblioteki, która nie jest już utrzymywana i w której odnotowano wycieki pamięci. Raporty programistów obejmują lata:

> "Kilkadziesiąt żądań powoduje wyczerpanie pamięci usługi w środowisku Unix, ale nie ma to miejsca w środowisku opartym na systemie Windows" > — Forum Aspose, marzec 2022 r.

W przypadku wdrożeń wyłącznie w systemie WindowsAsposenadal spełnia swoje zadanie. W przypadku wdrożeń wielopłatformowych lub kontenerowych zależność od System.Drawing.Common stwarza stałe ryzyko. Ceny licencji komercyjnych zaczynają się od około 999 USD na programistę.

Porównanie funkcji

FunkcjaIronPDFiTextPDFSharpQuestPDFwkhtmltopdfPuppeteerAspose
HTML do PDFPelny (Chromium)Ograniczony (CSS 2.1)NieNiePrzestarzalyPelny (Chrome)Ograniczone
CSS Flexbox/GridTakNieNieNieNieTakNie
JavaScriptTakNieNieNieOgraniczoneTakNie
Linux (bez libgdiplus)TakTakCzesciowy*TakNie dotyczyTakNie
Wdrożenie DockerStandardowy obraz .NETStandardowyCzesciowy*StandardowyZłożoneZłożoneWymaga libgdiplus
Aktywna konserwacjaTakTakTakTakPorzuconyTakTak
Opublikowane cenyTak ($liteLicense+)Nie (od $15K–$210K/rok)Bezpłatne (MIT)Tak (darmowy do $1M)BezpłatneBezpłatne (MIT)Tak (od $999+)
Licencja wieczystaTakNie (subskrypcja)Nie dotyczyNie dotyczyNie dotyczyNie dotyczyTak
Bez AGPLTakNie (wymaga komercyjnej)TakTakTakTakTak

*PDFSharp dokumentuje problemy specyficzne dla platformy z niektorymi konfiguracjami.

Porownanie wydajności

Testowano na średniej klasy VM w chmurze (4 vCPU, 8GB RAM) z 200-elementowym szablonem faktury HTML, średnio po 50 iteracjach po rozgrzaniu:

ScenariuszIronPDFPuppeteer SharpiText pdfHTMLwkhtmltopdf
Prosta strona HTML~150ms~500 ms~200 ms~200 ms
Zlozony układ CSS (Flexbox/Grid)~250ms~600 msNie powiodlo sie/Czesciowe~400ms (uszkodzony)
Strona silnie bazujaca na JavaScript~350ms~800msNie powiodlo sieNie powiodlo sie/Czesciowe
Pamieć na operacje~80 MB~150 MB~60MB~50MB
Zimny start (pierwsza generacja)2–5s3–8s<1s<1s

iText oraz wkhtmltopdf wykazuja szybsze zimne starty, poniewaz nie inicjalizuja silnika przeglądarki — ale tez nie mogą renderować tej samej zawartości. Porownanie wydajności ma sens tylko w scenariuszach, gdzie wszystkie biblioteki produkuja poprawny wynik.

Porownanie kodu: ta sama faktura, trzy biblioteki

Roznice miedzy tymi bibliotekami sa najjasniejsze, gdy buduje sie ten sam dokument. Oto faktura generowana na trzy sposoby.

IronPDF — Podejscie HTML/CSS

using IronPdf;

public class InvoiceGenerator
{
    public byte[] GenerateInvoice(InvoiceData data)
    {
        var renderer = new ChromePdfRenderer();

        string html = $@"
        <!DOCTYPE html>
        <html>
        <head>
            <style>
                body {{font-family: 'Segoe UI', sans-serif; margin: 40px;}}
                h1 {{color: #2c3e50;}}
                table {{width: 100%; border-collapse: collapse;}}
                th {{background: #3498db; color: white; padding: 12px; text-align: left;}}
                td {{border-bottom: 1px solid #e0e0e0; padding: 10px;}}
                .total {{font-weight: bold; font-size: 1.2em; text-align: right; margin-top: 20px;}}
            </style>
        </head>
        <body>
            <h1>Invoice #{data.InvoiceNumber}</h1>
            <table>
                <tr><th>Item</th><th>Qty</th><th>Price</th></tr>
                {string.Join("", data.Items.Select(i =>
                    $"<tr><td>{i.Name}</td><td>{i.Quantity}</td><td>${i.Price:F2}</td></tr>"))}
            </table>
            <p class='total'>Total: ${data.Total:F2}</p>
        </body>
        </html>";

        var pdf = renderer.RenderHtmlAsPdf(html);
        return pdf.BinaryData;
    }
}
C#

QuestPDF — Podejscie z użyciem Fluent API

using QuestPDF.Fluent;
using QuestPDF.Infrastructure;

public class InvoiceGenerator
{
    public byte[] GenerateInvoice(InvoiceData data)
    {
        var document = Document.Create(container =>
        {
            container.Page(page =>
            {
                page.Size(PageSizes.A4);
                page.Margin(40);
                page.DefaultTextStyle(x => x.FontFamily("Segoe UI"));

                page.Header()
                    .Text($"Invoice #{data.InvoiceNumber}")
                    .FontSize(24).FontColor(Colors.Blue.Darken2);

                page.Content().Column(column =>
                {
                    column.Item().Table(table =>
                    {
                        table.ColumnsDefinition(cols =>
                        {
                            cols.RelativeColumn(3);
                            cols.RelativeColumn(1);
                            cols.RelativeColumn(1);
                        });

                        table.Header(header =>
                        {
                            header.Cell().Background(Colors.Blue.Medium).Padding(8)
                                .Text("Item").FontColor(Colors.White);
                            header.Cell().Background(Colors.Blue.Medium).Padding(8)
                                .Text("Qty").FontColor(Colors.White);
                            header.Cell().Background(Colors.Blue.Medium).Padding(8)
                                .Text("Price").FontColor(Colors.White);
                        });

                        foreach (var item in data.Items)
                        {
                            table.Cell().BorderBottom(1).BorderColor(Colors.Grey.Lighten2)
                                .Padding(8).Text(item.Name);
                            table.Cell().BorderBottom(1).BorderColor(Colors.Grey.Lighten2)
                                .Padding(8).Text(item.Quantity.ToString());
                            table.Cell().BorderBottom(1).BorderColor(Colors.Grey.Lighten2)
                                .Padding(8).Text($"${item.Price:F2}");
                        }
                    });

                    column.Item().AlignRight().PaddingTop(20)
                        .Text($"Total: ${data.Total:F2}").FontSize(16).Bold();
                });
            });
        });

        using var stream = new MemoryStream();
        document.GeneratePdf(stream);
        return stream.ToArray();
    }
}

PDFSharp — Podejscie do rysowania wspolrzednych

using PdfSharpCore.Drawing;
using PdfSharpCore.Pdf;

public class InvoiceGenerator
{
    public byte[] GenerateInvoice(InvoiceData data)
    {
        var document = new PdfDocument();
        var page = document.AddPage();
        var gfx = XGraphics.FromPdfPage(page);

        var titleFont = new XFont("Arial", 24);
        var headerFont = new XFont("Arial", 12, XFontStyleEx.Bold);
        var bodyFont = new XFont("Arial", 12);

        double y = 40;

        gfx.DrawString($"Invoice #{data.InvoiceNumber}", titleFont,
            XBrushes.DarkBlue, 40, y);
        y += 50;

        // Table header — manually positioned
        double[] colX = { 40, 300, 400 };
        double rowHeight = 30;

        gfx.DrawRectangle(XBrushes.SteelBlue, 40, y, 500, rowHeight);
        gfx.DrawString("Item", headerFont, XBrushes.White, colX[0] + 10, y + 20);
        gfx.DrawString("Qty", headerFont, XBrushes.White, colX[1] + 10, y + 20);
        gfx.DrawString("Price", headerFont, XBrushes.White, colX[2] + 10, y + 20);
        y += rowHeight;

        // Each row drawn individually with explicit coordinates
        foreach (var item in data.Items)
        {
            gfx.DrawRectangle(XPens.LightGray, 40, y, 500, rowHeight);
            gfx.DrawString(item.Name, bodyFont, XBrushes.Black, colX[0] + 10, y + 20);
            gfx.DrawString(item.Quantity.ToString(), bodyFont, XBrushes.Black, colX[1] + 10, y + 20);
            gfx.DrawString($"${item.Price:F2}", bodyFont, XBrushes.Black, colX[2] + 10, y + 20);
            y += rowHeight;
        }

        y += 20;
        gfx.DrawString($"Total: ${data.Total:F2}", headerFont, XBrushes.Black, 440, y);

        using var stream = new MemoryStream();
        document.Save(stream);
        return stream.ToArray();
    }
}

Wersja IronPDF używa HTML/CSS — umiejetnosci, ktore posiada wiekszosc programistów. WersjaQuestPDFwymaga nauki specyficznegodla domeny Fluent API, ale zapewnia strukture. Wersja PdfSharp wymaga recznego obliczenia kazdej pozycji piksela — kazdego przesuniecia kolumny, kazdej wysokosci wiersza, kazdego obramowania rysowanego indywidualnie.

Którą bibliotekę wybrać?

Kiedy oceniam te biblioteki, drzewo decyzji jest prostoliniowe:

Potrzebujesz HTML do PDF z nowoczesnym CSS? Praktyczne opcje to IronPDF lubPuppeteerSharp.IronPDF obsługuje Chromium wewnetrznie;Puppeteer Sharpwymaga zarządzania zewnętrznymi procesami przeglądarki. wkhtmltopdf nie jest opcja dla nowych projektow. pdfHTMLiTextnie może renderować Flexbox ani Grid.

**Tworzenie dokumentów programistycznie z danych, bez HTML?**QuestPDFoferuje produktywne i dobrze zaprojektowane Fluent API. PdfSharp zapewnia kontrolę na nizszym poziomie, ale wymaga znacznie wiecej kodu dla rownowaznych ukladow.

Wdrozenie krzyzowkowe (Linux, Docker, chmura)? IronPDF,QuestPDFiPuppeteer Sharpdziałaja na Linuxie bez zależności libgdiplus. Aspose.PDF dokumentuje wycieki pamięci na Linuxie. PdfSharp ma czesciowe wsparcie dla platform z znanymi problemami.

Ograniczenia licencyjne? PdfSharp (MIT) iPuppeteer Sharp(MIT) sa bezplatne bez warunkow.QuestPDFjest darmowe do $1M przychodu.iTextwymaga zgodności z AGPL lub licencji komercyjnej (od $15K–$210K/rok). Licencja wieczysta IronPDF zaczyna się od $liteLicense.Asposezaczyna sie od ~$999.

Przed zaangażowaniem sie

Testuj przy użyciu rzeczywistej treści, a nie 'Hello World.' Wdrozenie do docelowej platformy wczesnie. Mierz pamięć na ponad 100 dokumentach, nie jednym. Przeczytaj cała treść licencji ze swoim zespolem prawnym. Sprawdz opóźnienie zimnego startu, jeżeli celem jest serverless.

IronPDF oferuje wersję próbną z pełna funkcjonalnościa do oceniania w zgodzie z twoimi specyficznymi wymaganiami.

Zwróć uwagę: Apryse, Aspose, DinkToPdf, NReco, PDFSharp, PuppeteerSharp, QuestPDF, iText, and wkhtmltopdf są zarejestrowanymi znakami towarowymi ich właścicieli. Ta strona nie jest powiazana, polecana ani sponsorowana przez Apryse,AsposePty Ltd, CodeFlint, DinkToPdf, NReco, PDFTron, PuppeteerSharp, empira Software GmbH,iTextGroup lub wkhtmltopdf. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.
Key in blue circle

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

Your trial license will be sent to your email address

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

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Otrzymaj swoją Konsultację Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta