Büyük PDF'lerde Daha Hızlı Üstbilgi ve Altbilgi
Ç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);
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.
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.MaxIdleTabsveMaxDynamicHFPagesPerBatchile ayarlamak yardımcı olabilir.

Curtis Chau holds a Bachelor’s degree in Computer Science (Carleton University) and specializes in front-end development with expertise in Node.js, TypeScript, JavaScript, and React. Passionate about crafting intuitive and aesthetically pleasing user interfaces, Curtis enjoys working with modern frameworks and creating well-structured, visually appealing manuals.