Altbilgi içeriğine atla
ÜRüN KARşıLAşTıRMALARı

ASP.NET MVC'de PDF Nasıl Oluşturulur: IronPDF vs iTextSharp?

Full Comparison

Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.

View Full Comparison

iText "belgenin sayfası yok" hatası XMLWorker'ın HTML içeriğini işleyememesi durumunda ortaya çıkar, ancak IronPDF'in Chrome tabanlı işleyicisi bu sorunu ortadan kaldırarak, tarayıcılar gibi HTML işleyerek parse hatalarına yol açmadan güvenilir PDF oluşturması sağlar.

.NET uygulamalarında HTML'i PDF'e dönüştürmek yaygın bir gerekliliktir, ancak iText kullanan geliştiriciler sıklıkla "belgenin sayfası yok" hatasıyla karşılaşır. Bu hata, PDF belge oluşturma süreci başarısız olduğunda ortaya çıkar ve geliştiricileri çözüm arayışına yönlendirir. Bu analiz, bunun neden olduğunu ve .NET'nin HTML'den PDF'ye dönüştürme yetenekleri ile nasıl etkili bir şekilde çözülebileceğini keşfeder.

"Belge Sayfa İçermiyor" Hatasına Ne Sebep Olur?

"belgenin sayfası yok" istisnası, iText'in ayrıştırıcısının HTML içeriğini geçerli bir PDF belgesine dönüştürememesi durumunda ortaya çıkar. Bu hata genellikle belge kapatma işlemi sırasında, bu sorunla ilgili birçok Stack Overflow başlığında açıklandığı gibi ortaya çıkar. Kökteki nedeni anlamak, geliştiricilerin ihtiyaçları için doğru PDF kütüphanesini seçmelerine yardımcı olur.

Hata, XMLWorker -- iText'in HTML ayrıştırma bileşeni -- işleyemediği HTML yapıları ile karşılaştığında sessizce başarısız olması nedeniyle ortaya çıkar. Ayrıştırma sırasında bir istisna yükseltmek yerine, boş bir belge üretir. Belge kapandığında, iText hiçbir içerik yazılmadığını tespit eder ve "belgenin sayfası yok" istisnası fırlatır. Bu sessiz hata modu, yığın izlemesinin gerçek ayrıştırma hatası yerine kapanış işlemini işaret etmesi nedeniyle hata ayıklamayı özellikle sinir bozucu hale getirir.

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");
}
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");
}
Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.tool.xml

Module Program
    Sub Main(args As String())
        Dim pdfDoc As New Document(PageSize.A4)
        Dim stream As New FileStream("output.pdf", FileMode.Create)
        Dim writer As PdfWriter = PdfWriter.GetInstance(pdfDoc, stream)
        pdfDoc.Open()
        ' HTML parsing fails silently -- no exception here
        Dim sr As 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")
    End Sub
End Module
$vbLabelText   $csharpLabel

Bu Hata Meydana Geldiğinde Konsol Çıktısı Ne Gösterir?

Windows Visual Studio Hata Ayıklama Konsolu 'Belgenin sayfası yok' hata mesajını koyu zemin üzerinde pembe başlık altında gösteriyor, yığın izleme detaylarını ve PDF oluşturulurken HTML ayrıştırması başarısız olduğunda ortaya çıkan iText XMLWorker istisnasını içeriyor

Bu kod, HTML'den bir PDF dosyası oluşturmayı deniyor ancak XMLWorker, HTML içeriğini başarıyla ayrıştıramadığı için bir istisna ile karşılaşılıyor. Yazma işlemi tamamlanır, ancak belgeye herhangi bir içerik eklenmez ve sonuçta boş bir dosya oluşur. Bu ayrıştırma hatası, geliştiricilerin ASP.NET uygulamalarında HTML'den PDF'ye dönüşüm yaparken karşılaştığı en yaygın sorunlardan biridir. Özelleştirilmiş CSS stilleri veya JavaScript ile oluşturulan içerikle uğraşırken sorun daha karmaşık hale gelir.

Yerine Geçen Kütüphane Neden Aynı Sorunu Yaşıyor?

Her ne kadar XMLWorker, kullanım dışı bırakılan HTMLWorker'ın yerini almış olsa da, hala belirli HTML yapılarıyla aynı sorunla karşılaşmaktadır. XMLWorker'ın katı ayrıştırma gereksinimleri olduğu için sorun devam ediyor, bu durum iText'in resmi forumlarında belgelenmiştir. Bu sınırlama, modern web uygulamalarında piksel mükemmeliyetinde HTML'den PDF'e dönüştürme yapmaya çalışan veya duyarlı CSS düzenleriyle çalışan geliştiricileri etkiler.

Yaygın bir çözüm, HTML ayrıştırmadan önce belgeyi boş bir paragrafla önceden doldurmaktır. Bu, belge kapandığında en az bir içerik öğesi bulunduğundan emin olarak "sayfa yok" istisnasını önler:

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();
    }
}
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();
    }
}
Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.tool.xml

Public Shared Sub CreatePDF(html As String, path As String)
    Using fs As New FileStream(path, FileMode.Create)
        Dim document As New Document()
        Dim writer As PdfWriter = PdfWriter.GetInstance(document, fs)
        document.Open()
        document.Add(New Paragraph("")) ' Workaround to avoid error
        Dim phrase As New Phrase("Draft version", FontFactory.GetFont("Arial", 8))
        document.Add(phrase)
        Using sr As New StringReader(html)
            XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, sr)
        End Using
        document.Close()
    End Using
End Sub
$vbLabelText   $csharpLabel

Bu Geçici Çözümle PDF Çıktısı Nasıl Görünür?

Başarıyla 'Merhaba, Dünya!' başlığını ve 'Taslak versiyonu' üst bilgisini ve test içeriğini gösteren PDF oluşturuldu, XMLWorker'ın boş paragraf çözümünü uygulayarak 'Belge sayfası yok' hatasını önledikten sonra başarılı HTML renderini gösteriyor

Neden Karmaşık HTML Öğeleri Hâlâ İşlenemiyor?

Boş bir paragraf eklemek anında hatayı önler, ancak tablo elemanları, resimler veya özel yazı tipleri içeren karmaşık HTML genellikle doğru şekilde işlenemez. İçerik, ortaya çıkan PDF belgesinde eksik veya hatalı olabilir. Geliştiriciler, gömülü stiller, köprü elementleri veya belirli genişlik özellikleri içeren HTML'yi işlerken aynı sorunla karşılaşır. Boş referanslar ve eksik eleman oluşturma, ek çözümler gerektiren ilave sorunlar yaratır.

XMLWorker, HTML 4 ve temel CSS 2'nin bir alt kümesini ele alacak şekilde tasarlanmıştır. Modern web sayfaları bu kapsamın çok ötesinde özellikler kullanır: CSS Grid, Flexbox, CSS değişkenleri, calc() ifadeleri, SVG grafikleri ve JavaScript destekli işleme. Bunlardan herhangi biri "sayfa yok" hatasını tetikleyebilir veya sessizce bozuk çıktı üretebilir -- ve düzeltmeye yönelik açıklayıcı bir hata mesajı olmadan.

// 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 NotSupportedException("Flexbox layout not supported");

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

    // Özel yazı tipleri -- require manual embedding
    if (htmlContent.Contains("@font-face"))
        Console.WriteLine("Warning: Web fonts need manual setup");
}
// 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 NotSupportedException("Flexbox layout not supported");

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

    // Özel yazı tipleri -- require manual embedding
    if (htmlContent.Contains("@font-face"))
        Console.WriteLine("Warning: Web fonts need manual setup");
}
' Common XMLWorker limitations that require manual handling
Public Sub ProcessComplexHTML(ByVal htmlContent As String)
    ' CSS flexbox -- not supported by XMLWorker
    If htmlContent.Contains("display: flex") Then
        Throw New NotSupportedException("Flexbox layout not supported")
    End If

    ' JavaScript content -- silently ignored
    If htmlContent.Contains("<script>") Then
        Console.WriteLine("Warning: JavaScript will be ignored")
    End If

    ' Özel yazı tipleri -- require manual embedding
    If htmlContent.Contains("@font-face") Then
        Console.WriteLine("Warning: Web fonts need manual setup")
    End If
End Sub
$vbLabelText   $csharpLabel

Aynı Hata Olmadan Modern HTML Nasıl Dönüştürülür?

Bu gerçek dünya senaryosu, biçimlendirilmiş bir faturanın HTML'den PDF'e dönüştürülmesini gösterir. Bu örnek, CSS satır içi, medya sorguları, tablo düzenleri ve köprüler gibi genellikle sorun yaratan ortak unsurları içerir. Bunlar, XMLWorker'da 'hiçbir sayfa yok' hatasını tetikleyen türdeki yapılardır:


<!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>

<!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

iText Bu Faturayı İşlediğinde Ne Olur?

Temel 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

iText bu fatura taslağını işlediğinde, çıktı genellikle CSS stilinden yoksun, arka plan renkleri eksik ve tablo kenarları kaybolmuş olur. @media print sorgusu görmezden gelinir ve herhangi bir web fontu referansı sessiz ayrıştırma hatalarına neden olur. HTML'de XMLWorker'ın tanımadığı bir CSS özelliği varsa, tüm blok işlenemeyebilir - ve bu, hiçbir hata atmadan eksik içerikle sonuçlanabilir.

IronPDF Aynı Faturayı Nasıl İşliyor?

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

Bu HTML Elemanları iText'te Neden Sorunlara Neden Olur?

iText'in XMLWorker'ı ile bu fatura, tablo stilleri, genişlik özellikleri veya yazı tipi spesifikasyonları nedeniyle başarısız olabilir. 'Belgede sayfa yok' hatası genellikle bu öğeler desteklenmediğinde görünür. Köprüler ve medya sorgusu referansları da doğru şekilde işlenmeyebilir. Bu sınırlamalar, dijital imzalar veya iş uygulamalarında sayfa numaraları gibi ileri düzey PDF özellikleri uygularken kritik hale gelir.

Mozilla Geliştirici Ağı'nın CSS üzerindeki belgelerine göre, modern CSS tarayıcılar tarafından doğal olarak desteklenen yüzlerce özelliğe ve değere sahiptir. XMLWorker bunların yalnızca küçük bir kısmını kapsar, bu yüzden gerçek dünya web içeriği sürekli olarak çözümleme hatalarını tetikler.

Çözümleme Hatası Olmadan HTML'yi PDF'e Nasıl Dönüştürürsünüz?

IronPDF, HTML'yi web tarayıcısında göründüğü haliyle işleyen bir Chrome tabanlı motor kullanır. Bu yaklaşım, çözümleme hatalarını ortadan kaldırır ve tüm modern HTML ve CSS özelliklerini destekler. Konfigürasyon seçeneklerinin tam listesini görmek için ChromePdfRenderer API referansına göz atabilirsiniz. Chrome motoru, XMLWorker'ın işleyemediği JavaScript çalıştırmayı, web yazı tiplerini ve duyarlı düzenleri destekler.

IronPDF'i NuGet Üzerinden Nasıl Yüklerim?

Kod yazmadan önce .NET NuGet paketini yükleyin. .NET CLI üzerinden bunu yapabilirsiniz:

dotnet add package IronPdf

Veya Visual Studio'daki NuGet Paket Yöneticisi Konsolu'ndan:

Install-Package IronPdf

Yüklendikten sonra, iText + XMLWorker hattını eksiksiz ve güvenilir bir çağrı ile değiştiren ChromePdfRenderer erişiminiz olur.

IronPDF ile HTML'yi PDF'e Nasıl İşlersiniz?

Aşağıdaki örnek, iText'te hatalara neden olan aynı fatura HTML'ini işler. Dikkat edin, hiçbir çözüm yolu, eklemeniz gereken boş paragraflar ya da yönetilecek sessiz hatalar yoktur:

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");
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");
Imports IronPdf

Dim renderer As 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

Dim html As String = "<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>"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("invoice.pdf")
$vbLabelText   $csharpLabel

IronPDF Çıkışı Nasıl Görünür?

İki kolonlu tablo içeren ve öğe ile fiyat başlıkları olan düzgün biçimlendirilmiş Fatura #12345'i gösteren temiz profesyonel fatura PDF'si, IronPDF'in çözümleme hatası veya biçimlendirme sorunları olmadan güvenilir HTML tablo işleme yeteneğini gösteriyor

Bu Yaklaşım Çözümleme Hatalarını Neden Ortadan Kaldırır?

Bu kod herhangi bir istisna olmadan PDF dosyasını başarıyla oluşturur. Yöntem karmaşık HTML ve CSS'yi otomatik olarak ele alır, dolayısıyla geçici çözümlere gerek kalmaz. İçerik piksel mükemmelliğiyle, tarayıcı önizlemesiyle uyumlu olarak işlenir. IronPDF ayrıca asenkron işleme desteği, özel marjinler ve PDF sıkıştırma özellikleri sunarak optimize edilmiş dosya boyutları sağlar.

JavaScript ağırlıklı içerik veya tek sayfalı uygulamalar içeren senaryolar için, IronPDF'in RenderDelay seçeneği, PDF yakalanmadan önce JavaScript'in çalışmasına izin verir -- XMLWorker'ın bunu yapması mümkün değildir. Aşağıdaki örnek, üretime hazır asenkron bir modelde üstbilgiler, altbilgiler ve güvenlik ayarlarını ekler:

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");
    }
}
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");
    }
}
Imports IronPdf
Imports Microsoft.Extensions.Logging

' Production-ready PDF generation with IronPDF
Public Class PdfGenerator
    Private ReadOnly _renderer As ChromePdfRenderer
    Private ReadOnly _logger As ILogger(Of PdfGenerator)

    Public Sub New(logger As ILogger(Of PdfGenerator))
        _logger = logger
        _renderer = New ChromePdfRenderer()
        _renderer.RenderingOptions.Timeout = 60
        _renderer.RenderingOptions.EnableJavaScript = True
        _renderer.RenderingOptions.RenderDelay = 2000
        _renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
            .Height = 25,
            .HtmlFragment = "<div style='text-align: center;'>{page} of {total-pages}</div>"
        }
    End Sub

    Public Async Function GenerateWithRetry(html As String, Optional maxRetries As Integer = 3) As Task(Of PdfDocument)
        For i As Integer = 0 To maxRetries - 1
            Try
                _logger.LogInformation("Generating PDF, attempt {Attempt}", i + 1)
                Return Await _renderer.RenderHtmlAsPdfAsync(html)
            Catch ex As Exception
                _logger.LogWarning("PDF generation failed: {Message}", ex.Message)
                If i = maxRetries - 1 Then Throw
                Await Task.Delay(1000 * (i + 1))
            End Try
        Next
        Throw New InvalidOperationException("PDF generation failed after retries")
    End Function
End Class
$vbLabelText   $csharpLabel

Güvenilir PDF Oluşturma İçin En İyi Çözüm Nedir?

HTML'yi PDF'e dönüştürmek için kullanılan iki kütüphaneyi karşılaştırırken, yetenek farklılıkları doğrudan PDF kalitesini ve dağıtım güvenilirliğini etkiler:

Özellik karşılaştırması: XMLWorker ile iText vs. IronPDF
Özellik iText + XMLWorker IronPDF
Modern HTML/CSS desteği Sınırlı (HTML 4, CSS 2) Tam (Chrome işleme motoru)
JavaScript yürütme Hayır Evet
Hata işleme Çözümleme hataları yaygın Güvenilir işleme
Karmaşık tablolar Genellikle başarısız Tam destek
Özel yazı tipleri Elle gömülmesi gerekli Otomatik işleme
SVG desteği Hayır Evet
Asenkron işleme Hayır Evet
Docker/Linux desteği Sınırlı Tam doğal destek
CSS medya türleri Temel Ekran ve Baskı
Hata ayıklama araçları Sınırlı Chrome DevTools entegrasyonu

iText'ten IronPDF'e Nasıl Geçiş Yaparsınız?

'Belgede sayfa yok' hatası yaşayan geliştiriciler için IronPDF'e geçiş, anında bir çözüm sunar. Dönüşüm süreci basittir ve IronPDF tam belgeleme ve kod örnekleri sunar. Aşağıdaki öncesi ve sonrası karşılaştırması, karmaşıklıkta azalmayı gösterir:

// 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;
}
// 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;
}
Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports iTextSharp.tool.xml

Public Class PdfCreator

    ' Before (iTextSharp) -- error-prone approach requiring workarounds
    Public Function CreatePdfWithIText(htmlContent As String) As Byte()
        Using ms As New MemoryStream()
            Dim document As New Document()
            Dim writer As PdfWriter = PdfWriter.GetInstance(document, ms)
            document.Open()

            ' Must add empty paragraph to avoid "no pages" error
            document.Add(New Paragraph(""))

            Try
                Using sr As New StringReader(htmlContent)
                    XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, sr)
                End Using
            Catch ex As Exception
                document.Add(New Paragraph("Error: " & ex.Message))
            End Try

            document.Close()
            Return ms.ToArray()
        End Using
    End Function

    ' After (IronPDF) -- reliable, no workarounds needed
    Public Function CreatePdfWithIron(htmlContent As String) As Byte()
        Dim renderer As New ChromePdfRenderer()
        renderer.RenderingOptions.EnableJavaScript = True
        renderer.RenderingOptions.RenderDelay = 500

        Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
        Return pdf.BinaryData
    End Function

End Class
$vbLabelText   $csharpLabel

IronPDF'in API'sini Daha Geliştirici Dostu Yapan Nedir?

Basitleştirilmiş API, daha az kod bakımı ve çözümleme hatası ayıklaması gerektirmediği anlamına gelir. IronPDF ayrıca üstbilgiler ve altbilgiler ekleme , PDF'leri birleştirme, ve dijital imza uygulama gibi özellikler sunar ve karmaşık geçici çözümler gerektirmez. Docker ortamlarında çalışan veya Linux sunucularına dağıtım yapan ekipler için, IronPDF platformlar arasında tutarlı davranış sergiler.

NuGet NuGet ile yükleyin

PM >  Install-Package IronPdf

NuGet'te hızlı kurulum için https://www.nuget.org/packages/IronPdf'i kontrol edin. 10 milyonun üzerinde indirme ile, C# ile PDF geliştirmeyi dönüştürüyor. DLL veya Windows yükleyici'yi de indirebilirsiniz.

Ücretsiz denemenizi başlatın ve hatasız HTML'den PDF'e dönüşüm tecrübesi yaşayın.

Sonraki Adımlarınız Neler?

"belgenin sayfası yok" hatası, iText'in XMLWorker'ına yapılandırılmış temel parsing sınırlamalarından kaynaklanır. Çözüm yolları var olsa da - belgelere boş bir paragrafla önceden dolum yapmak gibi - karmaşık HTML işleme ile altta yatan sorunu çözmezler. IronPDF'in Chrome tabanlı işleme motoru, modern web içeriğini çözümleme hataları olmadan ele alan güvenilir bir çözüm sunar.

HTML'den tutarlı şekilde PDF oluşturması gerektiren üretim uygulamaları için, IronPDF çözümleyici hatalarını ayıklama sıkıntısını ortadan kaldırır ve profesyonel sonuçlar sunar. Motor, tüm HTML öğeleri, CSS stillerini ve JavaScript'i işler ve belgelerin her seferinde doğru şekilde işlenmesini sağlar. İster faturalar, raporlar veya metin, tablolar ve görüntüler içeren herhangi bir belge oluşturuyor olun, IronPDF ihtiyaç duyduğunuz çözümü sunar.

İleri hareket etmek için önerilen bir sonraki adımlar şunlardır:

Lütfen dikkate alıniText ve XMLWorker, ilgili sahiplerinin tescilli ticari markalarıdır. Bu site, iText veya XMLWorker tarafından desteklenmemekte veya onaylanmamaktadır. Tüm ürün adları, logolar ve markalar kendi sahiplerine aittir. Karşılaştırmalar, yalnızca bilgilendirme amaçlıdır ve yazı sırasında halka açık bilgilerle alakalı olarak yansıtılmaktadır.

Sıkça Sorulan Sorular

iTextSharp HTML'den PDF'ye 'belge sayfası yok' hatasına ne sebep olur?

iTextSharp'ta 'belge sayfası yok' hatası, HTML'den PDF'ye dönüştürme sürecinde, genellikle HTML içeriği veya desteklenmeyen özelliklerle ilgili sorunlar nedeniyle çözümleme başarısız olduğunda meydana gelir.

HTML'den PDF'ye dönüştürme için iTextSharp'a alternatif var mı?

Evet, IronPDF .NET uygulamalarında HTML'den PDF'ye dönüştürme için iTextSharp'ta bulunan birçok sınırlamayı aşarak güvenilir bir çözüm sunar.

IronPDF, HTML'den PDF'ye dönüştürmeyi iTextSharp'tan farklı olarak nasıl ele alır?

IronPDF, daha kapsamlı çözümleme yetenekleri sunar ve daha geniş bir HTML ve CSS özellik yelpazesini destekleyerek 'sayfa yok' gibi dönüştürme hatalarının olasılığını azaltır.

IronPDF karmaşık HTML belgelerini PDF'ye dönüştürebilir mi?

IronPDF, karmaşık CSS, JavaScript ve multimedya unsurları içeren karmaşık HTML belgelerini işleyebilmek üzere tasarlanmıştır ve doğru PDF çıktısı sağlar.

Geliştiriciler neden iTextSharp yerine IronPDF kullanmayı düşünmelidir?

Geliştiricilerin, kullanım kolaylığı, HTML ve CSS için tam destek sağlaması ve yaygın hatalar olmadan yüksek kaliteli PDF'ler üretebilmesi nedeniyle IronPDF'i iTextSharp'a tercih edebilirler.

IronPDF, PDF dönüşüm sürecinde JavaScript ve CSS'i destekliyor mu?

Evet, IronPDF, JavaScript, CSS ve modern HTML5'i tam olarak destekler, bu da orijinal HTML'nin görsel bütünlüğünün PDF çıktısında sürdürüldüğü anlamına gelir.

HTML'den PDF'ye dönüştürme için IronPDF ile nasıl başlayabilirim?

IronPDF ile başlamak için, web sitesinde bulunan ayrıntılı eğitimleri ve belgeleri keşfedebilirsiniz, bunlar uygulama için adım adım kılavuzlar sunar.

.NET geliştiricileri için IronPDF kullanmanın faydaları nelerdir?

IronPDF, karmaşık HTML içeriği desteği, kolay entegrasyon ve güvenilir performans gibi avantajlarla .NET geliştiricileri için esnek bir PDF üretim aracı sunar.

IronPDF, PDF dönüştürme hatalarının giderilmesi için herhangi bir destek sunuyor mu?

Evet, IronPDF, PDF dönüştürme sırasında karşılaşılan sorunların giderilmesine yardımcı olacak geniş çaplı destek kaynakları, belgeler ve bir destek ekibi sunar.

Satın almadan önce IronPDF'in yeteneklerini test etmenin bir yolu var mı?

IronPDF, geliştiricilerin özelliklerini test etmesine ve satın alma kararı vermeden önce performansını değerlendirmesine olanak tanıyan bir ücretsiz deneme sürümü sunar.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara