Büyük PDF'lerde Daha Hızlı Üstbilgi ve Altbilgi

This article was translated from English: Does it need improvement?
Translated
View the article in English

Çok büyük bir PDF'ye tek geçişte üstbilgi ve altbilgi eklemek yavaştır. Dokümanı sabit boyutlu sayfa parçaları halinde işleyin, her partiyi render edin, ardından parçaları yeniden birleştirerek sayfa numaralarını tüm doküman boyunca sürekli tutarken toplam render süresini azaltın.

Çözüm

1. Sayfa dizinlerini partilere ayırın

Bir parça boyutu seçin ve dokümanın sayfa dizinlerini sabit boyutlu partilere ayırın, örneğin her biri 300 sayfa olacak şekilde. Daha küçük parçalar bireysel olarak daha hızlı işlenir ancak sona daha fazla birleştirme işi ekler.

2. Her partiyi kendi dokümanına kopyalayın

CopyPages kullanarak mevcut partinin sayfalarını çıkarın, böylece render için bağımsız bir doküman elde edin.

3. Kesintisiz numaralandırma ile üstbilgi ve altbilgi işleyin

FirstPageNumber değerini parçanın başlangıç sayfası olarak ayarlayın, böylece numaralandırma her parçada 1'den başlamak yerine tüm doküman boyunca devam etsin.

4. Her parçayı kaydedin ve dispose edin

Her parçayı geçici bir dosyaya yazın ve dispose edin. Bir sonraki parti öncesinde parçayı serbest bırakmak, çalışmanın bellek kullanımını artmasını önler.

5. Parçaları nihai PDF içine birleştirin

Geçici dosyaları tekrar açın, sırayla AppendPdf ile ekleyin, sonucu kaydedin, ardından geçici dosyaları silin.

using IronPdf;
var pdf = PdfDocument.FromFile("input.pdf");
string headerHtml = "<div style='font-size:10px;'>Header</div>";
string footerHtml = "<div style='text-align:right;font-size:10px;'>Page {page} of {total-pages}</div>";
int chunkSize = 300;
var pageChunks = Enumerable.Range(0, pdf.PageCount)
    .GroupBy(i => i / chunkSize)
    .Select(g => g.ToArray())
    .ToList();
var tempFiles = new List<string>();
foreach (var indexes in pageChunks)
{
    var chunkPdf = pdf.CopyPages(indexes);
    int globalStartPage = indexes.First() + 1;
    chunkPdf.AddHtmlHeadersAndFooters(new ChromePdfRenderOptions
    {
        FirstPageNumber = globalStartPage,          // keeps numbering continuous
        HtmlHeader = new HtmlHeaderFooter { HtmlFragment = headerHtml, MaxHeight = 40 },
        HtmlFooter = new HtmlHeaderFooter { HtmlFragment = footerHtml, MaxHeight = 40 }
    });
    string tempFile = Path.GetTempFileName() + ".pdf";
    chunkPdf.SaveAs(tempFile);
    chunkPdf.Dispose();
    tempFiles.Add(tempFile);
}
// Merge the chunks back into one document.
var finalPdf = new PdfDocument(tempFiles.First());
foreach (var file in tempFiles.Skip(1))
{
    using var part = new PdfDocument(file);
    finalPdf.AppendPdf(part);
}
finalPdf.SaveAs("output.pdf");
finalPdf.Dispose();
// Clean up temp files.
foreach (var file in tempFiles)
    File.Delete(file);
using IronPdf;
var pdf = PdfDocument.FromFile("input.pdf");
string headerHtml = "<div style='font-size:10px;'>Header</div>";
string footerHtml = "<div style='text-align:right;font-size:10px;'>Page {page} of {total-pages}</div>";
int chunkSize = 300;
var pageChunks = Enumerable.Range(0, pdf.PageCount)
    .GroupBy(i => i / chunkSize)
    .Select(g => g.ToArray())
    .ToList();
var tempFiles = new List<string>();
foreach (var indexes in pageChunks)
{
    var chunkPdf = pdf.CopyPages(indexes);
    int globalStartPage = indexes.First() + 1;
    chunkPdf.AddHtmlHeadersAndFooters(new ChromePdfRenderOptions
    {
        FirstPageNumber = globalStartPage,          // keeps numbering continuous
        HtmlHeader = new HtmlHeaderFooter { HtmlFragment = headerHtml, MaxHeight = 40 },
        HtmlFooter = new HtmlHeaderFooter { HtmlFragment = footerHtml, MaxHeight = 40 }
    });
    string tempFile = Path.GetTempFileName() + ".pdf";
    chunkPdf.SaveAs(tempFile);
    chunkPdf.Dispose();
    tempFiles.Add(tempFile);
}
// Merge the chunks back into one document.
var finalPdf = new PdfDocument(tempFiles.First());
foreach (var file in tempFiles.Skip(1))
{
    using var part = new PdfDocument(file);
    finalPdf.AppendPdf(part);
}
finalPdf.SaveAs("output.pdf");
finalPdf.Dispose();
// Clean up temp files.
foreach (var file in tempFiles)
    File.Delete(file);
Imports IronPdf
Imports System.IO
Imports System.Linq

Dim pdf = PdfDocument.FromFile("input.pdf")
Dim headerHtml As String = "<div style='font-size:10px;'>Header</div>"
Dim footerHtml As String = "<div style='text-align:right;font-size:10px;'>Page {page} of {total-pages}</div>"
Dim chunkSize As Integer = 300
Dim pageChunks = Enumerable.Range(0, pdf.PageCount) _
    .GroupBy(Function(i) i \ chunkSize) _
    .Select(Function(g) g.ToArray()) _
    .ToList()
Dim tempFiles = New List(Of String)()

For Each indexes In pageChunks
    Dim chunkPdf = pdf.CopyPages(indexes)
    Dim globalStartPage As Integer = indexes.First() + 1
    chunkPdf.AddHtmlHeadersAndFooters(New ChromePdfRenderOptions With {
        .FirstPageNumber = globalStartPage,
        .HtmlHeader = New HtmlHeaderFooter With {.HtmlFragment = headerHtml, .MaxHeight = 40},
        .HtmlFooter = New HtmlHeaderFooter With {.HtmlFragment = footerHtml, .MaxHeight = 40}
    })
    Dim tempFile As String = Path.GetTempFileName() & ".pdf"
    chunkPdf.SaveAs(tempFile)
    chunkPdf.Dispose()
    tempFiles.Add(tempFile)
Next

' Merge the chunks back into one document.
Dim finalPdf = New PdfDocument(tempFiles.First())
For Each file In tempFiles.Skip(1)
    Using part = New PdfDocument(file)
        finalPdf.AppendPdf(part)
    End Using
Next
finalPdf.SaveAs("output.pdf")
finalPdf.Dispose()

' Clean up temp files.
For Each file In tempFiles
    File.Delete(file)
Next
$vbLabelText   $csharpLabel

FirstPageNumber anahtardır: her bir parçanın küresel başlangıç sayfasına ayarlanır, böylece Page {page} of {total-pages} gibi bir altbilgi ilk parçadan son parçaya kadar tutarlılığını korur.

Lütfen dikkate alınFirstPageNumber olmadan, her parça sayımını sayfa 1'inci sayfadan başlatır.

Hata Ayıklama İpuçları

  • Parça boyutunu ayarlayın: yukarıdaki değer (300) ayarlanabilir ve parçalama sürecinin avantaj sağlamaya başladığı nokta iş yükünüze bağlıdır.
  • Birleştirme için hesaba katın: toplam süre, parça başı render süresi ile nihai birleştirmedir, bu yüzden bu ek geçişi herhangi bir karşılaştırmaya dahil edin.
  • Çok büyük işlerde belleği kontrol altında tutun: birleştirme sırasında çöp toplama işlemini düzenli olarak zorlamak ve tarayıcı havuzunu BrowserPool.MaxIdleTabs ve MaxDynamicHFPagesPerBatch ile ayarlamak yardımcı olabilir.
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
Başlamaya Hazır mısınız?
Nuget İndirmeler 20,296,129 | Sürüm: 2026.7 yeni yayınlandı
Still Scrolling Icon

Hâlâ Kaydırıyor Musunuz?

Hızlıca kanıt ister misiniz? PM > Install-Package IronPdf
bir örnek çalıştır HTML'nizi bir PDF'ye dönüştüğünü izleyin.