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

IronPDF ile iTextSharp "Document Has No Pages" Hatasını HTML'den PDF'e Dönüştürmede Düzeltin

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

IronPDF, mülk tabanlı yapılandırma ve yerel HTML desteğiyle PDF başlık ve altbilgi oluşturmayı basitleştirirken, iText kesin konumlandırma için manuel koordinat hesaplamaları ile PdfPageEventHelper uygulamasını gerektirir.

Profesyonel PDF belgeleri üretirken -- iş raporları, faturalar, teknik belgeler -- tutarlı başlıklar ve alt bilgiler kalite sinyali verir ve markayı güçlendirir. iText ile çalışmış geliştiriciler zorluğunu bilir: başlık ve altbilgi eklemek, sayfa etkinlik işleyicileri yazmayı, koordinatları hesaplamayı ve düşük seviyede yazı tiplerini yönetmeyi gerektirir. IronPDF, ne istediğinizi tarif etmenize izin vererek, her pikseli belirtmenize gerek kalmadan temelde farklı bir yaklaşım benimser. Bu kılavuz, bir sonraki projeniz için bilinçli bir karar verebilmeniz adına her iki kütüphaneyi yan yana inceler.

IronPDF Nasıl Kurulur?

Karşılaştırmalara dalmadan önce, işte .NET'yi bir .NET 10 projesine nasıl ekleyeceğiniz. .NET CLI veya Visual Studio'da NuGet Paket Yöneticisi Konsolunu kullanın:

dotnet add package IronPdf
# Or in the NuGet Package Manager Console:
# Install-Package IronPdf
dotnet add package IronPdf
# Or in the NuGet Package Manager Console:
# Install-Package IronPdf
SHELL

Kurulumdan sonra, uygulama başlatıldığında tek sefere mahsus bir lisans anahtarı çağrısı ekleyin:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"
$vbLabelText   $csharpLabel

.NET NuGet paketi, .NET 8+ hedefler ve bağlı Chromium motoru ile gönderilir, bu yüzden ek bir çalışma zamanı gereksinimine ihtiyaç duyulmaz. ücretsiz deneme lisansı, .NET'i ortamınızda taahhütte bulunmadan önce değerlendirebilmeniz için mevcut.

iText Başlık ve Alt Bilgi Uygulama Zorlukları Nelerdir?

iText ile çalışmak, başlık ve altbilgi eklemek için PdfPageEventHelper sınıfını uygulatmayı ve OnEndPage metodunu geçersiz kılmayı gerektirir. Bu yaklaşım, PdfContentByte nesnesinin doğrudan manipülasyonunu ve kesin koordinat hesaplamalarını içerir. Modern HTML'den PDF'e çözümlerden farklı olarak, iText'in etkinlik destekli mimarisi PDF yapısının ve koordinat sistemlerinin derin bir şekilde anlaşılmasını gerektirir.

Koordinat sistemi, sayfanın sol alt köşesinden başlar ki bu, çoğu geliştiricinin yerleşimlerle ilgili düşünme biçimine terstir. Bu, PDF spesifikasyonunun sayfa koordinat alanını tanımlamasının doğrudan bir sonucudur. Sayfa boyutu değiştiğinde -- A4'ten Mektuba geçiş gibi -- her koordinat değeri yeniden hesaplanmalıdır. Başlığın altına bir alt çizgi eklemek, metni ortalamak veya alt bilgiyi sağ kenara hizalamak hepsi sayısal öteleme gerektirir.

public class HeaderFooterEvent : PdfPageEventHelper
{
    private readonly Font headerFont = new Font(Font.FontFamily.HELVETICA, 12, Font.BOLD);
    private readonly Font footerFont = new Font(Font.FontFamily.HELVETICA, 10);

    public override void OnEndPage(PdfWriter writer, Document document)
    {
        PdfContentByte cb = writer.DirectContent;

        // Add header text -- requires precise Y coordinate calculation
        float headerY = document.PageSize.Height - 30;
        ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER,
            new Phrase("Company Report", headerFont),
            document.PageSize.Width / 2, headerY, 0);

        // Draw underline manually
        cb.MoveTo(40, headerY - 5);
        cb.LineTo(document.PageSize.Width - 40, headerY - 5);
        cb.Stroke();

        // Add footer with page number
        string footerText = $"Page {writer.PageNumber}";
        ColumnText.ShowTextAligned(cb, Element.ALIGN_RIGHT,
            new Phrase(footerText, footerFont),
            document.PageSize.Width - 40, 30, 0);

        // Add date on left side
        ColumnText.ShowTextAligned(cb, Element.ALIGN_LEFT,
            new Phrase(DateTime.Now.ToString("MM/dd/yyyy"), footerFont),
            40, 30, 0);
    }
}

// Usage
PdfWriter writer = PdfWriter.GetInstance(document, stream);
writer.PageEvent = new HeaderFooterEvent();
public class HeaderFooterEvent : PdfPageEventHelper
{
    private readonly Font headerFont = new Font(Font.FontFamily.HELVETICA, 12, Font.BOLD);
    private readonly Font footerFont = new Font(Font.FontFamily.HELVETICA, 10);

    public override void OnEndPage(PdfWriter writer, Document document)
    {
        PdfContentByte cb = writer.DirectContent;

        // Add header text -- requires precise Y coordinate calculation
        float headerY = document.PageSize.Height - 30;
        ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER,
            new Phrase("Company Report", headerFont),
            document.PageSize.Width / 2, headerY, 0);

        // Draw underline manually
        cb.MoveTo(40, headerY - 5);
        cb.LineTo(document.PageSize.Width - 40, headerY - 5);
        cb.Stroke();

        // Add footer with page number
        string footerText = $"Page {writer.PageNumber}";
        ColumnText.ShowTextAligned(cb, Element.ALIGN_RIGHT,
            new Phrase(footerText, footerFont),
            document.PageSize.Width - 40, 30, 0);

        // Add date on left side
        ColumnText.ShowTextAligned(cb, Element.ALIGN_LEFT,
            new Phrase(DateTime.Now.ToString("MM/dd/yyyy"), footerFont),
            40, 30, 0);
    }
}

// Usage
PdfWriter writer = PdfWriter.GetInstance(document, stream);
writer.PageEvent = new HeaderFooterEvent();
Imports iTextSharp.text
Imports iTextSharp.text.pdf

Public Class HeaderFooterEvent
    Inherits PdfPageEventHelper

    Private ReadOnly headerFont As Font = New Font(Font.FontFamily.HELVETICA, 12, Font.BOLD)
    Private ReadOnly footerFont As Font = New Font(Font.FontFamily.HELVETICA, 10)

    Public Overrides Sub OnEndPage(writer As PdfWriter, document As Document)
        Dim cb As PdfContentByte = writer.DirectContent

        ' Add header text -- requires precise Y coordinate calculation
        Dim headerY As Single = document.PageSize.Height - 30
        ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER, 
            New Phrase("Company Report", headerFont), 
            document.PageSize.Width / 2, headerY, 0)

        ' Draw underline manually
        cb.MoveTo(40, headerY - 5)
        cb.LineTo(document.PageSize.Width - 40, headerY - 5)
        cb.Stroke()

        ' Add footer with page number
        Dim footerText As String = $"Page {writer.PageNumber}"
        ColumnText.ShowTextAligned(cb, Element.ALIGN_RIGHT, 
            New Phrase(footerText, footerFont), 
            document.PageSize.Width - 40, 30, 0)

        ' Add date on left side
        ColumnText.ShowTextAligned(cb, Element.ALIGN_LEFT, 
            New Phrase(DateTime.Now.ToString("MM/dd/yyyy"), footerFont), 
            40, 30, 0)
    End Sub
End Class

' Usage
Dim writer As PdfWriter = PdfWriter.GetInstance(document, stream)
writer.PageEvent = New HeaderFooterEvent()
$vbLabelText   $csharpLabel

Bu manuel yerleştirme yaklaşımı, farklı sayfa yönelimleri, özel kağıt boyutları veya değişken kenar boşluğu gereksinimleri ile başa çıkarken daha karmaşık hale gelir. PDF/A uyumluluğunu veya dijital imzaları gerektiren üretim sistemleri için bu manuel yaklaşım önemli bir bakım yükü ekler.

Temel Başlıklarla Çıktı Nasıl Görünür?

Başlıkta başlık metni ve alt bilgide sayfa numaralandırması içeren şirket raporunu görüntüleyen PDF belgesi, temel başlık ve alt bilgi uygulamasının PDF oluşturmadaki gösterimi

Yukarıdaki kod, gereken manuel çalışmayı gösterir -- kesin koordinatları hesaplayacak, yazı tiplerini ayrı yönetecek ve DirectContent aracılığıyla işlemeyi gerçekleştireceksiniz. Her tasarım değişikliği, olay işleyici boyunca saçılmış sayısal sabitleri düzenlemeyi gerektirir.

Koordinata Dayalı Düzen Neden Bakım Sorunları Yaratır?

Bir tasarım değişikliği geldiğinde -- logoyu taşı, font boyutunu ayarla, tarihi ortaya kaydır -- bir geliştirici neyi değiştireceğini anlamak için piksel ötelemelerini izlemesi gerekir. Görsel bir katman yoktur; kodun kendisi yerleşimin tek belirtimidir. Bu, geliştiriciler arasındaki devriyanın hataları artırmasını ve küçük görsel revizyonları bile üretmek için gereken süreyi artırır.

IronPDF Üstbilgi ve Altbilgi Oluşturmayı Nasıl Kolaylaştırır?

.NET, başlık ve altbilgi oluşturma sürecini sezgisel bir API ile dönüştürür. Etkinlik işleyicileri uygulamak yerine, ChromePdfRenderer üzerinde basit mülk ayarları yoluyla başlık ve altbilgileri yapılandırırsınız. Bu yaklaşım, modern .NET geliştirme uygulamalarıyla uyumlu olup öğrenme eğrisini önemli ölçüde azaltır.

using IronPdf;

var renderer = new ChromePdfRenderer();

// Configure text header with multiple properties
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
    CenterText = "Company Report",
    LeftText = "CONFIDENTIAL",
    RightText = DateTime.Now.ToString("MMMM yyyy"),
    DrawDividerLine = true,
    FontSize = 12,
    FontFamily = "Arial",
    Spacing = 5
};

// Configure text footer with dynamic placeholders
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    LeftText = "{date} {time}",
    CenterText = "© 2024 Company Name",
    RightText = "Page {page} of {total-pages}",
    DrawDividerLine = true,
    FontSize = 10,
    Spacing = 10
};

// Set margins to ensure proper spacing
renderer.RenderingOptions.MarginTop = 30;
renderer.RenderingOptions.MarginBottom = 25;

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

// Configure text header with multiple properties
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
    CenterText = "Company Report",
    LeftText = "CONFIDENTIAL",
    RightText = DateTime.Now.ToString("MMMM yyyy"),
    DrawDividerLine = true,
    FontSize = 12,
    FontFamily = "Arial",
    Spacing = 5
};

// Configure text footer with dynamic placeholders
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    LeftText = "{date} {time}",
    CenterText = "© 2024 Company Name",
    RightText = "Page {page} of {total-pages}",
    DrawDividerLine = true,
    FontSize = 10,
    Spacing = 10
};

// Set margins to ensure proper spacing
renderer.RenderingOptions.MarginTop = 30;
renderer.RenderingOptions.MarginBottom = 25;

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Configure text header with multiple properties
renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
    .CenterText = "Company Report",
    .LeftText = "CONFIDENTIAL",
    .RightText = DateTime.Now.ToString("MMMM yyyy"),
    .DrawDividerLine = True,
    .FontSize = 12,
    .FontFamily = "Arial",
    .Spacing = 5
}

' Configure text footer with dynamic placeholders
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
    .LeftText = "{date} {time}",
    .CenterText = "© 2024 Company Name",
    .RightText = "Page {page} of {total-pages}",
    .DrawDividerLine = True,
    .FontSize = 10,
    .Spacing = 10
}

' Set margins to ensure proper spacing
renderer.RenderingOptions.MarginTop = 30
renderer.RenderingOptions.MarginBottom = 25

Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("report.pdf")
$vbLabelText   $csharpLabel

Render seçenekleri, IronPDF ile PDF oluşturma sürecinde hassas kontrol sağlarken kodun okunabilirliğini korur. Bu özellik tabanlı yaklaşım, düşük seviyeli PDF düzenlemeye girmeden başlık ve alt bilgileri korumayı ve değiştirmeyi kolaylaştırır.

IronPDF Profesyonel Biçimlendirmeyi Nasıl Yönetir?

Şirket markalaması, sayfa numaraları ve zaman damgaları ile tutarlı biçimlendirmeye sahip çok sayfalı dokümanda IronPDF'in başlık ve altbilgi yeteneklerini gösteren iki sayfalık PDF belgesi

Fark hemen belirgindir -- IronPDF, konumlandırma, kenar boşlukları ve render işlemlerini otomatik olarak yönetirken dinamik içerik için yerleşik yer tutucular sağlar. Kütüphanenin Chrome render motoru, HTML ön izlemenizle birebir eşleşen, piksel mükemmelliğinde çıktı sağlar.

Üretim Sistemleri İçin Hangi Özellikler En Önemlidir?

Özellik Karşılaştırması: Başlıklar ve Alt Bilgiler İçin iText ve IronPDF
Özellik iText IronPDF
Uygulama Yöntemi PdfPageEventHelper sınıfı RenderingOptions özellikleri
Kod Karmaşıklığı Manuel koordinat hesaplamaları Basit özellik atama
Sayfa Numaraları Manuel takip writer.PageNumber ile Yerleşik {page} yer tutucu
HTML Desteği Sınırlı, XMLWorker gerektirir Yerel HTML başlık desteği
Marj Yönetimi Manuel hesaplama Otomatik ayar
Dinamik İçerik Özel uygulama gereklidir Önceden tanımlanmış yer tutucular
İlk Sayfa Farklı Karmaşık koşullu mantık FirstPageNumber özelliği
Öğrenme Eğrisi Dik Aşamalı

Sayfa Numaraları ile Üst ve Alt Bilgiler Nasıl Eklenir?

Sayfa numaralandırma, PDF belgeleri için standart bir gerekliliktir. iText ile, mevcut sayfa numarasını ve toplam sayfaları manuel olarak izlemeniz gerekiyor, toplam sayfa sayısını doğru almak için sıklıkla iki geçişli bir yaklaşım gerekir.

// iTextSharp approach with complete page numbering
public class CompleteHeaderFooterEvent : PdfPageEventHelper
{
    private readonly PdfTemplate totalPageCount;
    private readonly Font normalFont = new Font(Font.FontFamily.HELVETICA, 10);

    public CompleteHeaderFooterEvent(PdfWriter writer)
    {
        // Create placeholder for total page count
        totalPageCount = writer.DirectContent.CreateTemplate(30, 16);
    }

    public override void OnEndPage(PdfWriter writer, Document document)
    {
        PdfPTable footerTable = new PdfPTable(3);
        footerTable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
        footerTable.SetWidths(new float[] { 1, 1, 1 });

        PdfPCell leftCell = new PdfPCell(new Phrase(DateTime.Now.ToString("dd/MM/yyyy"), normalFont));
        leftCell.Border = Rectangle.NO_BORDER;
        leftCell.HorizontalAlignment = Element.ALIGN_LEFT;

        PdfPCell centerCell = new PdfPCell(new Phrase("Confidential", normalFont));
        centerCell.Border = Rectangle.NO_BORDER;
        centerCell.HorizontalAlignment = Element.ALIGN_CENTER;

        PdfPCell rightCell = new PdfPCell();
        rightCell.Border = Rectangle.NO_BORDER;
        rightCell.HorizontalAlignment = Element.ALIGN_RIGHT;

        Chunk pageNum = new Chunk($"Page {writer.PageNumber} of ", normalFont);
        rightCell.AddElement(pageNum);
        rightCell.AddElement(Image.GetInstance(totalPageCount));

        footerTable.AddCell(leftCell);
        footerTable.AddCell(centerCell);
        footerTable.AddCell(rightCell);

        footerTable.WriteSelectedRows(0, -1, document.LeftMargin,
            document.PageSize.GetBottom(document.BottomMargin), writer.DirectContent);
    }

    public override void OnCloseDocument(PdfWriter writer, Document document)
    {
        ColumnText.ShowTextAligned(totalPageCount, Element.ALIGN_LEFT,
            new Phrase(writer.PageNumber.ToString(), normalFont), 0, 0, 0);
    }
}
// iTextSharp approach with complete page numbering
public class CompleteHeaderFooterEvent : PdfPageEventHelper
{
    private readonly PdfTemplate totalPageCount;
    private readonly Font normalFont = new Font(Font.FontFamily.HELVETICA, 10);

    public CompleteHeaderFooterEvent(PdfWriter writer)
    {
        // Create placeholder for total page count
        totalPageCount = writer.DirectContent.CreateTemplate(30, 16);
    }

    public override void OnEndPage(PdfWriter writer, Document document)
    {
        PdfPTable footerTable = new PdfPTable(3);
        footerTable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
        footerTable.SetWidths(new float[] { 1, 1, 1 });

        PdfPCell leftCell = new PdfPCell(new Phrase(DateTime.Now.ToString("dd/MM/yyyy"), normalFont));
        leftCell.Border = Rectangle.NO_BORDER;
        leftCell.HorizontalAlignment = Element.ALIGN_LEFT;

        PdfPCell centerCell = new PdfPCell(new Phrase("Confidential", normalFont));
        centerCell.Border = Rectangle.NO_BORDER;
        centerCell.HorizontalAlignment = Element.ALIGN_CENTER;

        PdfPCell rightCell = new PdfPCell();
        rightCell.Border = Rectangle.NO_BORDER;
        rightCell.HorizontalAlignment = Element.ALIGN_RIGHT;

        Chunk pageNum = new Chunk($"Page {writer.PageNumber} of ", normalFont);
        rightCell.AddElement(pageNum);
        rightCell.AddElement(Image.GetInstance(totalPageCount));

        footerTable.AddCell(leftCell);
        footerTable.AddCell(centerCell);
        footerTable.AddCell(rightCell);

        footerTable.WriteSelectedRows(0, -1, document.LeftMargin,
            document.PageSize.GetBottom(document.BottomMargin), writer.DirectContent);
    }

    public override void OnCloseDocument(PdfWriter writer, Document document)
    {
        ColumnText.ShowTextAligned(totalPageCount, Element.ALIGN_LEFT,
            new Phrase(writer.PageNumber.ToString(), normalFont), 0, 0, 0);
    }
}
Imports System
Imports iTextSharp.text
Imports iTextSharp.text.pdf

' iTextSharp approach with complete page numbering
Public Class CompleteHeaderFooterEvent
    Inherits PdfPageEventHelper

    Private ReadOnly totalPageCount As PdfTemplate
    Private ReadOnly normalFont As Font = New Font(Font.FontFamily.HELVETICA, 10)

    Public Sub New(writer As PdfWriter)
        ' Create placeholder for total page count
        totalPageCount = writer.DirectContent.CreateTemplate(30, 16)
    End Sub

    Public Overrides Sub OnEndPage(writer As PdfWriter, document As Document)
        Dim footerTable As New PdfPTable(3)
        footerTable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin
        footerTable.SetWidths(New Single() {1, 1, 1})

        Dim leftCell As New PdfPCell(New Phrase(DateTime.Now.ToString("dd/MM/yyyy"), normalFont))
        leftCell.Border = Rectangle.NO_BORDER
        leftCell.HorizontalAlignment = Element.ALIGN_LEFT

        Dim centerCell As New PdfPCell(New Phrase("Confidential", normalFont))
        centerCell.Border = Rectangle.NO_BORDER
        centerCell.HorizontalAlignment = Element.ALIGN_CENTER

        Dim rightCell As New PdfPCell()
        rightCell.Border = Rectangle.NO_BORDER
        rightCell.HorizontalAlignment = Element.ALIGN_RIGHT

        Dim pageNum As New Chunk($"Page {writer.PageNumber} of ", normalFont)
        rightCell.AddElement(pageNum)
        rightCell.AddElement(Image.GetInstance(totalPageCount))

        footerTable.AddCell(leftCell)
        footerTable.AddCell(centerCell)
        footerTable.AddCell(rightCell)

        footerTable.WriteSelectedRows(0, -1, document.LeftMargin, document.PageSize.GetBottom(document.BottomMargin), writer.DirectContent)
    End Sub

    Public Overrides Sub OnCloseDocument(writer As PdfWriter, document As Document)
        ColumnText.ShowTextAligned(totalPageCount, Element.ALIGN_LEFT, New Phrase(writer.PageNumber.ToString(), normalFont), 0, 0, 0)
    End Sub
End Class
$vbLabelText   $csharpLabel

Bu desen, bir PDF şablon nesnesi oluşturmayı gerektirir, ardından belge kapandıktan sonra toplam sayfa sayısını geri doldurmayı gerektirir. Operasyonun iki geçişli doğası, iText iç yapısını bilmeyenler için bariz değildir ve bunu yanlış yapmak, son PDF'de yanlış sayfa sayısı üretir.

IronPDF'in Yaklaşımı Neden Daha Sürdürülebilir?

IronPDF, yerleşik yer tutucular ve otomatik sayfa numarası yönetimi ile sayfa numaralandırmayı ele alır:

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    LeftText = "{date} {time}",
    CenterText = "Confidential -- Internal Use Only",
    RightText = "Page {page} of {total-pages}",
    DrawDividerLine = true,
    FontSize = 10,
    FontFamily = "Calibri",
    Spacing = 8
};

// Skip numbering on cover page
renderer.RenderingOptions.FirstPageNumber = 0;

renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.MarginTop = 30;

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
    LeftText = "{date} {time}",
    CenterText = "Confidential -- Internal Use Only",
    RightText = "Page {page} of {total-pages}",
    DrawDividerLine = true,
    FontSize = 10,
    FontFamily = "Calibri",
    Spacing = 8
};

// Skip numbering on cover page
renderer.RenderingOptions.FirstPageNumber = 0;

renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.MarginTop = 30;

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
    .LeftText = "{date} {time}",
    .CenterText = "Confidential -- Internal Use Only",
    .RightText = "Page {page} of {total-pages}",
    .DrawDividerLine = True,
    .FontSize = 10,
    .FontFamily = "Calibri",
    .Spacing = 8
}

' Skip numbering on cover page
renderer.RenderingOptions.FirstPageNumber = 0

renderer.RenderingOptions.MarginBottom = 25
renderer.RenderingOptions.MarginTop = 30

Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
$vbLabelText   $csharpLabel

Yerleşik yer tutucu destekleri {page}, {total-pages}, {date}, {time}, {html-title}, {pdf-title} ve {url} içerir. Karmaşık bir son işlem veya iki geçişli render almaya gerek yok. Kütüphane, toplam sayfa sayısını dahili olarak çözümler ve her yer tutucu yerine otomatik olarak ekler.

Dinamik İçerikle HTML Başlıkları Oluşturabilir misiniz?

Şirket logoları, stilize tipografi veya yapılandırılmış tablolar içeren düzenler için, HTML başlıkları, metin tabanlı başlıklardan çok daha fazla esneklik sağlar. IronPDF, yerel HTML başlık ve altbilgi desteği ile burada öne çıkıyor:

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 10px 0;'>
            <img src='logo.png' style='height: 40px;'>
            <div style='text-align: center;'>
                <h2 style='margin: 0; color: #2c3e50;'>Annual Report 2024</h2>
                <p style='margin: 0; font-size: 12px; color: #7f8c8d;'>Financial Performance &amp; Strategic Overview</p>
            </div>
            <div style='text-align: right; font-size: 11px; color: #95a5a6;'>
                Document ID: AR-2024-001<br>
                Classification: Public
            </div>
        </div>",
    MaxHeight = 80,
    DrawDividerLine = true,
    BaseUrl = new Uri(System.IO.Path.GetFullPath("assets/")).AbsoluteUri
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <table style='width: 100%; font-size: 10px; color: #34495e;'>
            <tr>
                <td style='width: 33%; text-align: left;'>Generated: {date} at {time}</td>
                <td style='width: 34%; text-align: center;'>Page {page} of {total-pages}</td>
                <td style='width: 33%; text-align: right;'>Annual Report 2024</td>
            </tr>
        </table>",
    MaxHeight = 30,
    DrawDividerLine = true
};

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("annual-report.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 10px 0;'>
            <img src='logo.png' style='height: 40px;'>
            <div style='text-align: center;'>
                <h2 style='margin: 0; color: #2c3e50;'>Annual Report 2024</h2>
                <p style='margin: 0; font-size: 12px; color: #7f8c8d;'>Financial Performance &amp; Strategic Overview</p>
            </div>
            <div style='text-align: right; font-size: 11px; color: #95a5a6;'>
                Document ID: AR-2024-001<br>
                Classification: Public
            </div>
        </div>",
    MaxHeight = 80,
    DrawDividerLine = true,
    BaseUrl = new Uri(System.IO.Path.GetFullPath("assets/")).AbsoluteUri
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <table style='width: 100%; font-size: 10px; color: #34495e;'>
            <tr>
                <td style='width: 33%; text-align: left;'>Generated: {date} at {time}</td>
                <td style='width: 34%; text-align: center;'>Page {page} of {total-pages}</td>
                <td style='width: 33%; text-align: right;'>Annual Report 2024</td>
            </tr>
        </table>",
    MaxHeight = 30,
    DrawDividerLine = true
};

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("annual-report.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
    .HtmlFragment = "
        <div style='width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 10px 0;'>
            <img src='logo.png' style='height: 40px;'>
            <div style='text-align: center;'>
                <h2 style='margin: 0; color: #2c3e50;'>Annual Report 2024</h2>
                <p style='margin: 0; font-size: 12px; color: #7f8c8d;'>Financial Performance &amp; Strategic Overview</p>
            </div>
            <div style='text-align: right; font-size: 11px; color: #95a5a6;'>
                Document ID: AR-2024-001<br>
                Classification: Public
            </div>
        </div>",
    .MaxHeight = 80,
    .DrawDividerLine = True,
    .BaseUrl = New Uri(System.IO.Path.GetFullPath("assets/")).AbsoluteUri
}

renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
    .HtmlFragment = "
        <table style='width: 100%; font-size: 10px; color: #34495e;'>
            <tr>
                <td style='width: 33%; text-align: left;'>Generated: {date} at {time}</td>
                <td style='width: 34%; text-align: center;'>Page {page} of {total-pages}</td>
                <td style='width: 33%; text-align: right;'>Annual Report 2024</td>
            </tr>
        </table>",
    .MaxHeight = 30,
    .DrawDividerLine = True
}

Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("annual-report.pdf")
$vbLabelText   $csharpLabel

Karmaşık Başlıklar Pratikte Nasıl Görünür?

PDF belgesi, şirket logosu ve yıllık rapor markası içeren profesyonel başlık ile IronPDF'in gelişmiş HTML başlık işleme yeteneklerini ve tutarlı çok sayfalı formatlamayı göstermektedir

iText ile HTML başlıklarına ulaşmak, XMLWorker genişletmesini eklemeyi ve karmaşık ayrıştırma kodu yazmayı gerektirir. Kütüphanenin sınırlı CSS desteği, farklı kağıt boyutlarında güvenilir şekilde çalışan modern düzenler üretmeyi zorlaştırmaktadır. Görseller, esnek düzenler ve web yazı tipleri, önemli ölçüde kod karmaşıklığı ekleyen çözümler gerektirir.

İlk Sayfa Başlıklarını Farklı Şekilde Nasıl Ele Alırsınız?

Pek çok profesyonel belge, kapak sayfasında farklı bir başlık gerektirir -- başlık sayfası için büyük bir logo, ardından sonraki sayfalar için kompakt bir başlık. IronPDF, bu deseni koşullu HTML ve CSS ile destekler:

using IronPdf;

var renderer = new ChromePdfRenderer();

string firstPageHeader = @"
    <div style='text-align: center; padding: 20px 0;'>
        <img src='logo-large.png' style='height: 80px; margin-bottom: 10px;'>
        <h1 style='margin: 0; color: #2c3e50;'>2024 Annual Report</h1>
        <h3 style='margin: 5px 0; color: #7f8c8d;'>Fiscal Year Ending December 31, 2024</h3>
    </div>";

string subsequentPageHeader = @"
    <div style='display: flex; justify-content: space-between; align-items: center;'>
        <img src='logo-small.png' style='height: 30px;'>
        <span>Annual Report 2024</span>
        <span>Page {page}</span>
    </div>";

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = $@"
        <style>
            .first-page {{display: none;}}
            .other-pages {{display: block;}}
            @page:first {{
                .first-page {{display: block;}}
                .other-pages {{display: none;}}
            }}
        </style>
        <div class='first-page'>{firstPageHeader}</div>
        <div class='other-pages'>{subsequentPageHeader}</div>",
    MaxHeight = 100
};

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report-with-cover.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string firstPageHeader = @"
    <div style='text-align: center; padding: 20px 0;'>
        <img src='logo-large.png' style='height: 80px; margin-bottom: 10px;'>
        <h1 style='margin: 0; color: #2c3e50;'>2024 Annual Report</h1>
        <h3 style='margin: 5px 0; color: #7f8c8d;'>Fiscal Year Ending December 31, 2024</h3>
    </div>";

string subsequentPageHeader = @"
    <div style='display: flex; justify-content: space-between; align-items: center;'>
        <img src='logo-small.png' style='height: 30px;'>
        <span>Annual Report 2024</span>
        <span>Page {page}</span>
    </div>";

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = $@"
        <style>
            .first-page {{display: none;}}
            .other-pages {{display: block;}}
            @page:first {{
                .first-page {{display: block;}}
                .other-pages {{display: none;}}
            }}
        </style>
        <div class='first-page'>{firstPageHeader}</div>
        <div class='other-pages'>{subsequentPageHeader}</div>",
    MaxHeight = 100
};

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report-with-cover.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

Dim firstPageHeader As String = "
    <div style='text-align: center; padding: 20px 0;'>
        <img src='logo-large.png' style='height: 80px; margin-bottom: 10px;'>
        <h1 style='margin: 0; color: #2c3e50;'>2024 Annual Report</h1>
        <h3 style='margin: 5px 0; color: #7f8c8d;'>Fiscal Year Ending December 31, 2024</h3>
    </div>"

Dim subsequentPageHeader As String = "
    <div style='display: flex; justify-content: space-between; align-items: center;'>
        <img src='logo-small.png' style='height: 30px;'>
        <span>Annual Report 2024</span>
        <span>Page {page}</span>
    </div>"

renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
    .HtmlFragment = $"
        <style>
            .first-page {{display: none;}}
            .other-pages {{display: block;}}
            @page:first {{
                .first-page {{display: block;}}
                .other-pages {{display: none;}}
            }}
        </style>
        <div class='first-page'>{firstPageHeader}</div>
        <div class='other-pages'>{subsequentPageHeader}</div>",
    .MaxHeight = 100
}

Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("report-with-cover.pdf")
$vbLabelText   $csharpLabel

Bu yaklaşım, kapak ve iç başlığı aynı anda güncellemeyi kolaylaştırarak başlık tanımını tek bir yerde tutar. Yüksek verimli senaryolar için asenkron PDF renderlama keşfedebilirsiniz.

Hangi Yaklaşım Daha İyi Performans ve Esneklik Sunar?

Büyük belgeler oluştururken veya çok sayıda PDF'yi eşzamanlı olarak işlerken performans kritik hale gelir. IronPDF'in Chrome rendering engine'i üretim iş yükleri için çeşitli avantajlar sağlar:

  1. Görselleştirme Performansı: IronPDF, sayfa başlıkları ve alt bilgilerini önbelleğe alarak çok sayfalı belgeler için verimi artırır
  2. Hafıza Verimliliği: Kütüphane, hafıza yönetimini otomatik olarak yönetir, elle PdfContentByte manipülasyonu sırasında meydana gelen sızıntılardan kaçınır.
  3. Paralel İşleme: async işlemleri için destek, Task.WhenAll desenlerini kullanarak verimli toplu üretim sağlar
using IronPdf;

public async Task GenerateReportsAsync(List<ReportData> reports)
{
    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "Monthly Report",
        DrawDividerLine = true
    };

    renderer.RenderingOptions.TextFooter = new TextHeaderFooter
    {
        RightText = "Page {page} of {total-pages}",
        DrawDividerLine = true
    };

    // Disable JavaScript if not required for faster rendering
    renderer.RenderingOptions.EnableJavaScript = false;
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

    var tasks = reports.Select(async report =>
    {
        string html = await GenerateHtmlAsync(report);
        return await renderer.RenderHtmlAsPdfAsync(html);
    });

    PdfDocument[] pdfs = await Task.WhenAll(tasks);
}
using IronPdf;

public async Task GenerateReportsAsync(List<ReportData> reports)
{
    var renderer = new ChromePdfRenderer();

    renderer.RenderingOptions.TextHeader = new TextHeaderFooter
    {
        CenterText = "Monthly Report",
        DrawDividerLine = true
    };

    renderer.RenderingOptions.TextFooter = new TextHeaderFooter
    {
        RightText = "Page {page} of {total-pages}",
        DrawDividerLine = true
    };

    // Disable JavaScript if not required for faster rendering
    renderer.RenderingOptions.EnableJavaScript = false;
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

    var tasks = reports.Select(async report =>
    {
        string html = await GenerateHtmlAsync(report);
        return await renderer.RenderHtmlAsPdfAsync(html);
    });

    PdfDocument[] pdfs = await Task.WhenAll(tasks);
}
Imports IronPdf

Public Async Function GenerateReportsAsync(reports As List(Of ReportData)) As Task
    Dim renderer As New ChromePdfRenderer()

    renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
        .CenterText = "Monthly Report",
        .DrawDividerLine = True
    }

    renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
        .RightText = "Page {page} of {total-pages}",
        .DrawDividerLine = True
    }

    ' Disable JavaScript if not required for faster rendering
    renderer.RenderingOptions.EnableJavaScript = False
    renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print

    Dim tasks = reports.Select(Async Function(report)
                                   Dim html As String = Await GenerateHtmlAsync(report)
                                   Return Await renderer.RenderHtmlAsPdfAsync(html)
                               End Function)

    Dim pdfs As PdfDocument() = Await Task.WhenAll(tasks)
End Function
$vbLabelText   $csharpLabel

Üretim Kullanımı İçin Lisans Düşünceleri Neler Olmalı?

IronPDF'nin lisans modeli, iText'in AGPL lisansına göre ticari dostu şartlar sunar, bu da ayrı bir ticari iText lisansı satın almadıkça uygulama kodunuzu açık kaynak yapmanızı gerektirir. Üretim sistemleri için IronPDF şu özellikleri sağlar:

Süresiz lisanslar, tekrar eden ücretler olmadan Windows, Linux, macOS ve Azure üzerinde dağıtım desteği

Ekipler İçin Öğrenme Eğrisi Ne Kadar Dik?

iText'in sayfa etkinlik sistemine aşina olan geliştiriciler için bir ayarlama süreci vardır, ancak IronPDF'nin belgeleri ve örnekleri bunu yönetilebilir kılar. CSS'i stil vermek ve HTML'i düzen için kullanma yeteneği, iText'te kapsamlı özel kod gerektirecek olasılıklar açar. Belgeler içeriği:

Kenar Boşluğu ve Aralık Hesaplamaları Nasıl Farklılık Gösterir?

Profesyonel belge düzenleri, hassas kenar boşluğu kontrolü gerektirir. IronPDF, milimetre cinsinden ölçümlerle bu süreci basitleştirir -- baskı düzenleri için doğal bir birim:

using IronPdf;

var renderer = new ChromePdfRenderer();

// Set margins in millimeters
renderer.RenderingOptions.MarginTop = 25.4;    // 1 inch
renderer.RenderingOptions.MarginBottom = 25.4;
renderer.RenderingOptions.MarginLeft = 19.05;  // 0.75 inch
renderer.RenderingOptions.MarginRight = 19.05;

renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
    CenterText = "Internal Report",
    DrawDividerLine = true,
    Spacing = 5
};

// Use print CSS media type for accurate page layout
// See MDN reference: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/print
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("margin-report.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

// Set margins in millimeters
renderer.RenderingOptions.MarginTop = 25.4;    // 1 inch
renderer.RenderingOptions.MarginBottom = 25.4;
renderer.RenderingOptions.MarginLeft = 19.05;  // 0.75 inch
renderer.RenderingOptions.MarginRight = 19.05;

renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
    CenterText = "Internal Report",
    DrawDividerLine = true,
    Spacing = 5
};

// Use print CSS media type for accurate page layout
// See MDN reference: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/print
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("margin-report.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Set margins in millimeters
renderer.RenderingOptions.MarginTop = 25.4 ' 1 inch
renderer.RenderingOptions.MarginBottom = 25.4
renderer.RenderingOptions.MarginLeft = 19.05 ' 0.75 inch
renderer.RenderingOptions.MarginRight = 19.05

renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
    .CenterText = "Internal Report",
    .DrawDividerLine = True,
    .Spacing = 5
}

' Use print CSS media type for accurate page layout
' See MDN reference: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/print
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print

Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("margin-report.pdf")
$vbLabelText   $csharpLabel

Bu, iText'in koordinat tabanlı yaklaşımı ile karşılaştırıldığında, pozisyonları sayfa sınırlarına göre hesaplamak ve içeriğin başlık veya altbilgilerle çakışmadığını elle doğrulamak zorundasınız.

Sonraki Adımlarınız Neler?

PDF belgelerine başlıklar ve alt bilgi eklemek, karmaşık olay işlemleri ve koordinat hesaplamalarını içermek zorunda değildir. iText'in yaklaşımı, sayfa olayları ve doğrudan içerik manipülasyonu yoluyla ayrıntılı kontrol sunsa da, IronPDF yerel HTML desteği ve mülk tabanlı yapılandırmaları ile daha sezgisel bir çözüm sağlar.

Geliştirme hızı, sürdürülebilirliği ve profesyonel görünen belgeler üretmenin kolaylığı düşünüldüğünde seçim netleşir. .NET'nin üstbilgi ve altbilgi yaklaşımı, modern PDF oluşturmanın güçlü fakat erişilebilir bir örneği. Temiz mimari ve sürdürülebilir kodu önceliklendiren ekipler için, .NET'in API'si .NET geliştirme uygulamalarıyla iyi uyum sağlar.

Üretim sistemleri için başlıca avantajlar şunlardır:

Azaltılmış Geliştirme Süresi: Özelllik tabanlı yapılandırma ile karmaşık olay işleyicileri

  • Daha İyi Bakım Kolaylığı: Koordinat hesaplamaları yerine düzenler için HTML/CSS kullanımı
  • Geliştirilmiş Esneklik: duyarlı tasarımlar ve web yazı tipleri için doğal destek
  • Yüksek Performans: Önbellekleme ve paralel işlem desteği ile optimize edilmiş işleme Profesyonel Sonuçlar: Modern web standartlarına uygun, piksel mükemmelliğinde çıktı

Öncelikle IronPDF'i NuGet aracılığıyla yükleyin, ardından ilk başlık ve altbilginizi dakikalar içinde oluşturmak için hızlı başlangıç kılavuzunu inceleyin. Üretime geçmeye hazır olduğunuzda, lisanslama seçeneklerini inceleyerek dağıtım gereksinimlerinize uygun planı bulun. Entegrasyon sırasında herhangi bir sorunla karşılaşırsanız, destek ekibi size yardımcı olmak için hazır.

Lütfen dikkate alıniText, ilgili sahibinin tescilli markasıdır. Bu site, iText ile ilişkili, onaylanmış veya sponsor olunmuş değildir. 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

IronPDF ve iTextSharp arasında başlık ve alt bilgi ekleme konusunda başlıca farklar nelerdir?

IronPDF yerel HTML desteği ile özellik tabanlı bir API kullanırken, iTextSharp manuel koordinat hesaplamaları ile PdfPageEventHelper uygulamayı gerektirir. IronPDF ayrıca sayfa numaraları, tarihler ve URL'ler için yerleşik yer tutucuları sağlar.

IronPDF sayfa başlıklarını eklemeyi nasıl basitleştirir?

IronPDF, ChromePdfRenderer.RenderingOptions üzerinde TextHeaderFooter veya HtmlHeaderFooter özellikleri aracılığıyla başlıkları yapılandırmanıza olanak tanır, bu da sayfa etkinliklerini ele almayı veya piksel pozisyonlarını hesaplamayı gerektirmez.

IronPDF'de başlıkları özelleştirmek için HTML kullanmak mümkün mü?

Evet, IronPDF, Css stili, resimler ve {page} ve {total-pages} gibi dinamik yer tutucularla tam CSS stilini etkinleştiren HtmlHeaderFooter sınıfı aracılığıyla HTML tabanlı başlık ve alt bilgileri destekler.

IronPDF'un iş raporları için kullanımının avantajları nelerdir?

IronPDF, özellik tabanlı yapılandırma ile uygulama süresini azaltır, sayfa numaraları ve tarihler için dinamik yer tutucuları destekler ve Chromium motoru kullanarak başlığı piksel mükemmel doğrulukla oluşturur.

IronPDF başlık ve alt bilgilerde sayfa numaralandırmayı yönetebilir mi?

Evet, IronPDF, {page} ve {total-pages} gibi yerleşik yer tutucular aracılığıyla sayfa numaralandırmayı otomatik olarak yönetir, iki geçişli rendera gerek kalmaz.

Kullanım kolaylığı açısından IronPDF, iTextSharp ile nasıl karşılaştırılır?

IronPDF, düşük seviyeli koordinat tabanlı olay işlemlerini deklaratif bir özellik API'si ile değiştirdiği ve düzen için HTML/CSS'yi desteklediği için genellikle daha kolay kullanılır.

IronPDF başlıklarda dinamik içerik destekliyor mu?

Evet, IronPDF, metin ve HTML başlıklarda yerleşik yer tutucular ({page}, {total-pages}, {date}, {time}, {html-title}, {url}) aracılığıyla dinamik içerik destekler.

IronPDF'u belge projeleri için daha uygun yapan nedir?

IronPDF'un HTML başlık desteği, tutarlı stil, şirket markalaması ve güncellemelerin kolaylığı önemli olduğunda belgeler için idealdir. Değişiklikler koordinat sabitlerini yerine sayısal olarak değil, HTML'yi düzenlemeyi gerektirir.

Özel başlıklı faturalar için IronPDF'u kullanabilir miyim?

Evet, IronPDF logolar, stillendirilmiş metin ve dinamik alanlarla özel HTML başlıkları destekler, bu da fatura oluşturma için çok uygundur.

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