IRONSOFTWAREHOME
NARZĘDZIA PDF

PDF vs PDF/A (Porównanie i jak z nich korzystać)

Curtis Chau
Curtis Chau
Updated: 20 czerwca 2026

Błąd "dokument nie ma stron" w iText występuje, gdy XMLWorker nie może przeanalizować zawartości HTML, ale Chromowy renderer IronPDF eliminuje ten problem, przetwarzając HTML dokładnie tak jak przeglądarki, zapewniając niezawodne generowanie PDF bez wyjątków podczas parsowania.

Konwersja HTML na PDF jest częstym wymaganiem w aplikacjach .NET, ale deweloperzy używający iText często napotykają błąd "dokument nie ma stron". Ten błąd pojawia się, gdy proces generowania dokumentu PDF kończy się niepowodzeniem, co sprawia, że programiści muszą szukać rozwiązań. W niniejszej analizie omówiono przyczyny tego zjawiska oraz sposoby skutecznego rozwiązania tego problemu dzięki funkcjom konwersji HTML na PDF oferowanym przez IronPDF.

Co powoduje błąd "Dokument nie ma stron"?

Wyjątek "dokument nie ma stron" występuje, gdy parser iText nie potrafi przetworzyć zawartości HTML do poprawnego dokumentu PDF. Ten błąd pojawia się zazwyczaj podczas zamykania dokumentu, co zostało szczegółowo opisane w wielu wątkach na Stack Overflow dotyczących tej kwestii. Zrozumienie przyczyny źródłowej pomaga programistom wybrać bibliotekę PDF odpowiednią do ich potrzeb.

Błąd wynika z faktu, że XMLWorker — komponent do analizy HTML iText — cichaczem nie radzi sobie z strukturami HTML, których nie może przetworzyć. Zamiast zgłaszać wyjątek podczas analizowania, generuje pusty dokument. Gdy dokument się zamyka, iText wykrywa, że nie zapisano żadnej zawartości, i wyrzuca wyjątek "dokument nie ma stron". Ten cichy tryb awarii sprawia, że debugowanie jest szczególnie frustrujące, ponieważ ślad stosu wskazuje na operację zamknięcia, a nie na rzeczywisty błąd parsowania.

static void Main(string[] args)
{
    Document pdfDoc = new Document(PageSize.A4);
    FileStream stream = new FileStream("output.pdf", FileMode.Create);
    PdfWriter writer = PdfWriter.GetInstance(pdfDoc, stream);
    pdfDoc.Open();
    // HTML parsing fails silently -- no exception here
    var sr = new StringReader("<div>Complex HTML</div>");
    XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
    pdfDoc.Close(); // Exception: The document has no pages
    Console.WriteLine("Error: Document has no pages");
}

Co wyświetla konsola, gdy pojawia się ten błąd?

Konsola Debugowania Microsoft Visual Studio pokazująca komunikat o błędzie 'Dokument nie ma stron' z różowym nagłówkiem na ciemnym tle, wyświetlająca szczegóły stosu i wyjątkiem XMLWorker iText, który występuje, gdy parsowanie HTML kończy się niepowodzeniem podczas generowania PDF

Ten kod próbuje utworzyć plik PDF z HTML, ale napotyka wyjątek, ponieważ XMLWorker nie mógł pomyślnie przeanalizować treści HTML. Operacja zapisu zostaje zakończona, ale do dokumentu nie zostaje dodana żadna treść, co skutkuje powstaniem pustego pliku. Ten błąd parsowania jest jednym z najczęstszych problemów, z jakimi borykają się programiści podczas konwersji HTML do PDF w aplikacjach ASP.NET. Problem staje się bardziej złożony w przypadku niestandardowych stylów CSS lub treści renderowanych przez JavaScript.

Dlaczego biblioteka zastępcza boryka się z tym samym problemem?

Chociaż XMLWorker zastąpił przestarzały HTMLWorker, nadal napotyka ten sam problem w przypadku niektórych struktur HTML. Problem nadal występuje, ponieważ XMLWorker ma surowe wymagania dotyczące parsowania, co zostało udokumentowane na oficjalnych forach iText. Ograniczenie to dotyczy programistów próbujących wdrożyć konwersję HTML do PDF z zachowaniem idealnej zgodności pikselowej lub pracujących z responsywnymi układami CSS w nowoczesnych aplikacjach internetowych.

Typowym rozwiązaniem jest wstępne wypełnienie dokumentu pustym akapitem przed parsowaniem kodu HTML. Zapobiega to wyjątkowi "brak stron", zapewniając, że przy zamknięciu dokumentu istnieje co najmniej jeden element treści:

public static void CreatePDF(string html, string path)
{
    using (var fs = new FileStream(path, FileMode.Create))
    {
        var document = new Document();
        var writer = PdfWriter.GetInstance(document, fs);
        document.Open();
        document.Add(new Paragraph("")); // Workaround to avoid error
        var phrase = new Phrase("Draft version", FontFactory.GetFont("Arial", 8));
        document.Add(phrase);
        using (var sr = new StringReader(html))
        {
            XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, sr);
        }
        document.Close();
    }
}

Jak wygląda plik PDF wygenerowany przy użyciu tego rozwiązania?

Pomyślnie wygenerowany plik PDF wyświetlający nagłówek

Dlaczego złożone elementy HTML nadal nie wyświetlają się prawidłowo?

Dodanie pustego akapitu zapobiega natychmiastowemu błędowi, ale złożony kod HTML zawierający elementy tabel, obrazy lub niestandardowe czcionki często nie wyświetla się poprawnie. W wynikowym dokumencie PDF treść może być niekompletna lub nieprawidłowa. Programiści napotykają ten sam problem podczas przetwarzania kodu HTML zawierającego osadzone style, elementy hiperłączy lub określone właściwości szerokości. Odwołania do wartości null i brak renderowania elementów powodują dodatkowe problemy, które wymagają dalszego rozwiązania.

XMLWorker został zaprojektowany do obsługi podzbioru HTML 4 i podstawowego CSS 2. Niewoczesne strony internetowe rutynowo używają funkcji wykraczających poza ten zakres: CSS Grid, Flexbox, zmienne CSS, wyrażenia calc(), grafik SVG i renderowania napędzanego JavaScriptem. Każda z tych sytuacji może wywołać błąd "brak stron" lub spowodować ciche wygenerowanie uszkodzonego wyniku — bez opisowego komunikatu o błędzie, który pomógłby w naprawie.

// Common XMLWorker limitations that require manual handling
public void ProcessComplexHTML(string htmlContent)
{
    // CSS flexbox -- not supported by XMLWorker
    if (htmlContent.Contains("display: flex"))
        throw new NietSupportedException("Flexbox layout not supported");

    // JavaScript content -- silently ignored
    if (htmlContent.Contains("<script>"))
        Console.WriteLine("Warning: JavaScript will be ignored");

    // Czcionki niestandardowe -- require manual embedding
    if (htmlContent.Contains("@font-face"))
        Console.WriteLine("Warning: Web fonts need manual setup");
}

Jak można konwertować nowoczesny kod HTML bez popełniania tego samego błędu?

Ten rzeczywisty scenariusz pokazuje konwersję sformatowanej faktury z formatu HTML do PDF. Próbka zawiera typowe elementy, które często powodują problemy: wbudowane arkusze CSS, zapytania o media, układy tabel i hiperłącza. Oto rodzaje struktur, które powodują błąd "brak stron" w XMLWorker:

<!-- Invoice HTML with modern styling -->
<!DOCTYPE html>
<html>
<head>
    <title>Invoice Sample</title>
    <style>
        .invoice-header {
            background-color: #f0f0f0;
            padding: 20px;
        }
        .invoice-table {
            margin-top: 20px;
        }
        @media print {
            .no-print { display: none; }
        }
    </style>
</head>
<body>
    <div style="font-family: Arial; width: 100%;">
        <div class="invoice-header">
            <h1 style="color: #2e6c80;">Invoice #12345</h1>
            <p>Date: <span id="date">2025-01-15</span></p>
        </div>
        <table class="invoice-table" style="width: 100%; border-collapse: collapse;">
            <thead>
                <tr>
                    <th style="border: 1px solid #ddd; padding: 8px;">Item</th>
                    <th style="border: 1px solid #ddd; padding: 8px;">Price</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td style="border: 1px solid #ddd; padding: 8px;">Service</td>
                    <td style="border: 1px solid #ddd; padding: 8px;">$100.00</td>
                </tr>
            </tbody>
        </table>
        <a href="https://example.com/terms" class="no-print">View Terms</a>
    </div>
</body>
</html>
HTML

Co się dzieje, gdy iText przetwarza tę fakturę?

Podstawowe invoice PDF displaying Invoice #12345 with simple table formatting containing one service item for $100, demonstrating iText's limited CSS styling capabilities and basic table rendering when XMLWorker successfully processes simple HTML structures

Gdy iText przetwarza ten szablon faktury, często wynik jest pozbawiony stylizacji CSS, brak kolory tła i tracą granice tabel. Zapytanie @media print jest ignorowane, a każde odniesienie do fontu sieciowego powoduje ciche awarie parsowania. Jeśli kod HTML zawiera właściwość CSS, której XMLWorker nie rozpoznaje, renderowanie całego bloku może się nie powieść — co spowoduje brak treści bez wygenerowania błędu podczas parsowania.

W jaki sposób IronPDF renderuje tę samą fakturę?

Professional invoice PDF #12345 rendered with IronPDF showing preserved CSS styling, properly formatted table with service item for $100, and functioning 'View Terms' hyperlink, demonstrating the Chrome rendering engine's superior HTML/CSS support compared to XMLWorker

Dlaczego te elementy HTML powodują problemy w iText?

Z XMLWorker iText, ta faktura może się nie udać z powodu stylizacji tabel, właściwości szerokości lub specyfikacji czcionek. Błąd "dokument nie ma stron" często pojawia się, gdy te elementy nie są obsługiwane. Hiperłącza i odniesienia do zapytań o media również mogą nie wyświetlać się poprawnie. Ograniczenia te stają się krytyczne podczas wdrażania zaawansowanych funkcji PDF, takich jak podpisy cyfrowe lub numery stron w aplikacjach biznesowych.

Zgodnie z dokumentacją Mozilla Developer Network dotyczącą CSS, nowoczesny CSS zawiera setki właściwości i wartości, które przeglądarki obsługują natywnie. XMLWorker obsługuje tylko niewielką część z nich, dlatego rzeczywiste treści internetowe konsekwentnie powodują błędy parsowania.

Jak przeprowadzić konwersję HTML do PDF bez błędów parsowania?

IronPDF wykorzystuje silnik renderujący oparty na przeglądarce Chrome, który przetwarza kod HTML dokładnie tak, jak wygląda on w przeglądarce internetowej. Takie podejście eliminuje błędy parsowania i obsługuje wszystkie nowoczesne funkcje HTML i CSS. Pełną listę opcji konfiguracyjnych można znaleźć w dokumentacji API ChromePdfRenderer. Silnik Chrome zapewnia obsługę wykonywania kodu JavaScript, czcionek internetowych oraz responsywnych układów, z którymi XMLWorker nie może sobie poradzić.

Jak zainstalować IronPDF za pomocą NuGet?

Przed napisaniem jakiegokolwiek kodu zainstaluj pakiet IronPDF NuGet. Można to zrobić z poziomu interfejsu CLI platformy .NET:

dotnet add package IronPdf

Lub z konsoli menedżera pakietów NuGet w Visual Studio:

PM > Install-Package IronPdf

Po zainstalowaniu, masz dostęp do ChromePdfRenderer, który zastępuje cały pipeline iText + XMLWorker jedynym, niezawodnym wywołaniem.

Jak przekonwertować HTML na PDF za pomocą IronPDF?

Poniższy przykład renderuje ten sam HTML faktury, który spowodował awarie w iText. Zwróć uwagę, że nie ma żadnych obejść, brak pustych akapitów do wstawienia z przodu i brak cichych awarii do zarządzania:

using IronPdf;

ChromePdfRenderer renderer = new ChromePdfRenderer();

// Configure rendering options for production use
renderer.RenderingOptions.MarginTop = 40;
renderer.RenderingOptions.MarginBottom = 40;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;

string html = @"<div style='font-family: Arial; width: 100%;'>
    <h1 style='color: #2e6c80;'>Invoice #12345</h1>
    <table style='width: 100%; border-collapse: collapse;'>
        <tr>
            <th style='border: 1px solid #ddd; padding: 8px;'>Item</th>
            <th style='border: 1px solid #ddd; padding: 8px;'>Price</th>
        </tr>
        <tr>
            <td style='border: 1px solid #ddd; padding: 8px;'>Service</td>
            <td style='border: 1px solid #ddd; padding: 8px;'>$100.00</td>
        </tr>
    </table>
</div>";

PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("invoice.pdf");

Jak wygląda wynik działania IronPDF?

Czysty, profesjonalny plik PDF z fakturą nr 12345, zawierający poprawnie sformatowaną dwukolumnową tabelę z nagłówkami

Dlaczego to podejście eliminuje błędy parsowania?

Ten kod z powodzeniem tworzy plik PDF bez żadnych wyjątków. Metoda ta automatycznie obsługuje złożony kod HTML i CSS, eliminując potrzebę stosowania obejść. Treść wyświetla się idealnie, zgodnie z podglądem w przeglądarce. IronPDF obsługuje również renderowanie asynchroniczne, niestandardowe marginesy oraz kompresję plików PDF w celu optymalizacji rozmiarów plików.

W scenariuszach, które obejmują zawartość ciężką od JS lub aplikacje jednorodzinne, opcja RenderDelay IronPDF pozwala wykonać JavaScript przed uchwyceniem PDF — czego XMLWorker w ogóle nie może zrobić. Poniższy przykład dodaje nagłówki, stopki i ustawienia zabezpieczeń w gotowym do produkcji wzorcu asynchronicznym:

using IronPdf;
using Microsoft.Extensions.Logging;

// Production-ready PDF generation with IronPDF
public class PdfGenerator
{
    private readonly ChromePdfRenderer _renderer;
    private readonly ILogger<PdfGenerator> _logger;

    public PdfGenerator(ILogger<PdfGenerator> logger)
    {
        _logger = logger;
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.Timeout = 60;
        _renderer.RenderingOptions.EnableJavaScript = true;
        _renderer.RenderingOptions.RenderDelay = 2000;
        _renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
        {
            Height = 25,
            HtmlFragment = "<div style='text-align: center;'>{page} of {total-pages}</div>"
        };
    }

    public async Task<PdfDocument> GenerateWithRetry(string html, int maxRetries = 3)
    {
        for (int i = 0; i < maxRetries; i++)
        {
            try
            {
                _logger.LogInformation("Generating PDF, attempt {Attempt}", i + 1);
                return await _renderer.RenderHtmlAsPdfAsync(html);
            }
            catch (Exception ex)
            {
                _logger.LogWarning("PDF generation failed: {Message}", ex.Message);
                if (i == maxRetries - 1) throw;
                await Task.Delay(1000 * (i + 1));
            }
        }
        throw new InvalidOperationException("PDF generation failed after retries");
    }
}

Jakie jest najlepsze rozwiązanie do niezawodnego generowania plików PDF?

Porównując te dwie biblioteki do konwersji HTML na PDF, różnice w możliwościach bezpośrednio wpływają na jakość plików PDF i niezawodność wdrożenia:

Porównanie funkcji: iText z XMLWorker vs. IronPDF
FunkcjaiText + XMLWorkerIronPDF
Współczesna obsługa HTML/CSSOgraniczone (HTML 4, CSS 2)Pełna (silnik renderujący Chrome)
Wykonanie kodu JavaScriptNieTak
Obsługa błędówAnaliza typowych wyjątkówWiarygodne odwzorowanie
Złożone tabeleCzęsto się nie udajePełne wsparcie
Czcionki niestandardoweWymagane ręczne osadzenieAutomatyczna obsługa
Obsługa SVGNieTak
Renderowanie asynchroniczneNieTak
Obsługa Docker/LinuxOgraniczonePełna obsługa języków ojczystych
Typy mediów CSSPodstawoweEkran i PRINT
Narzędzia do debugowaniaOgraniczoneIntegracja z Chrome DevTools

Jak Przemigrować z iText do IronPDF?

Dla programistów, którzy napotykają błąd "dokument nie ma stron", przejście na IronPDF stanowi natychmiastowe rozwiązanie. Proces konwersji jest prosty, a IronPDF oferuje kompletną dokumentację i przykłady kodu. Poniższe porównanie "przed i po" pokazuje zmniejszenie złożoności:

// Before (iTextSharp) -- error-prone approach requiring workarounds
public byte[] CreatePdfWithIText(string htmlContent)
{
    using var ms = new MemoryStream();
    var document = new Document();
    var writer = PdfWriter.GetInstance(document, ms);
    document.Open();

    // Must add empty paragraph to avoid "no pages" error
    document.Add(new Paragraph(""));

    try
    {
        using var sr = new StringReader(htmlContent);
        XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, sr);
    }
    catch (Exception ex)
    {
        document.Add(new Paragraph("Error: " + ex.Message));
    }

    document.Close();
    return ms.ToArray();
}

// After (IronPDF) -- reliable, no workarounds needed
public byte[] CreatePdfWithIron(string htmlContent)
{
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    renderer.RenderingOptions.EnableJavaScript = true;
    renderer.RenderingOptions.RenderDelay = 500;

    PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
    return pdf.BinaryData;
}

Co sprawia, że API IronPDF jest bardziej przyjazne dla programistów?

Uproszczony interfejs API oznacza mniej kodu do utrzymania i brak błędów parsowania do debugowania. IronPDF oferuje również funkcje dodawania nagłówków i stopek, łączenia plików PDF oraz stosowania podpisów cyfrowych bez skomplikowanych obejść. Dla zespołów pracujących w środowiskach Docker lub wdrażających rozwiązania na serwerach Linux, IronPDF zapewnia spójne działanie na różnych platformach.

NuGetZainstaluj za pomocą NuGet

PM > Install-Package IronPdf

Install IronPDF by running the command above in the NuGet Package Manager Console, or search for the package in the NuGet Package Manager.

Bezpłatna próba, aby doświadczyć bezbłędnej konwersji HTML do PDF.

Jakie są Twoje kolejne kroki?

Błąd "dokument nie ma stron" wynika z fundamentalnych ograniczeń parsowania wbudowanych w XMLWorker iText. Chociaż istnieją rozwiązania alternatywne — takie jak wstępne wypełnienie dokumentu pustym akapitem — nie rozwiązują one podstawowego problemu związanego ze złożonym przetwarzaniem kodu HTML. Renderowanie oparte na przeglądarce Chrome firmy IronPDF zapewnia niezawodne rozwiązanie, które obsługuje nowoczesne treści internetowe bez wyjątków związanych z parsowaniem.

W przypadku aplikacji produkcyjnych wymagających spójnego generowania plików PDF z HTML, IronPDF eliminuje frustrację związaną z debugowaniem błędów parsera i zapewnia profesjonalne wyniki. Silnik obsługuje wszystkie elementy HTML, style CSS i JavaScript, zapewniając prawidłowe renderowanie dokumentów za każdym razem. Niezależnie od tego, czy tworzysz faktury, raporty, czy dowolne dokumenty zawierające tekst, tabele i obrazy, IronPDF zapewnia rozwiązanie, którego potrzebujesz.

Aby kontynuować, oto zalecane kolejne kroki:

Zwróć uwagę: iText i XMLWorker są zarejestrowanymi znakami towarowymi ich odpowiednich właścicieli. Ta strona nie jest związana z, wspierana przez ani sponsorowana przez iText ani XMLWorker. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.
Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

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

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

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta