En-têtes et pieds de page plus rapides sur de grands PDFs
Ajouter des en-têtes et pieds de page à un PDF très volumineux en un seul passage est lent. Traitez le document en blocs de pages de taille fixe, rendez chaque lot, puis fusionnez les parties pour réduire le temps total de rendu tout en conservant une numérotation continue sur l'ensemble du document.
Solution
1. Diviser les index de pages en lots
Choisissez une taille de bloc et regroupez les index de pages du document en lots de taille fixe, par exemple 300 pages chacun. Les petits blocs se rendent plus rapidement individuellement mais ajoutent plus de travail de fusion à la fin.
2. Copiez chaque lot dans son propre document
Extrayez les pages pour le lot courant avec CopyPages, vous donnant un document autonome à rendre.
3. Rendez les en-têtes et pieds de page avec une numérotation continue
Réglez FirstPageNumber à la page de début du bloc pour que la numérotation s'étende sur tout le document au lieu de recommencer à 1 dans chaque bloc.
4. Enregistrez chaque bloc et disposez-le
Écrivez chaque bloc dans un fichier temporaire et disposez-le. Libérer le bloc avant le lot suivant empêche la mémoire de monter pendant l'exécution.
5. Fusionnez les blocs dans le PDF final
Rouvrez les fichiers temporaires, ajoutez-les dans l'ordre avec AppendPdf, enregistrez le résultat, puis supprimez les fichiers temporaires.
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 est la clé : il est réglé à la page de début globale de chaque bloc, donc un pied de page comme Page {page} of {total-pages} reste cohérent du premier bloc au dernier.
Conseils de débogage
- Réglez la taille du bloc : la valeur ci-dessus (300) est ajustable, et le point auquel le fractionnement commence à porter ses fruits dépend de votre charge de travail.
- Tenez compte de la fusion : le temps total est le rendu par bloc plus la fusion finale, donc intégrez ce passage supplémentaire dans toute comparaison.
- Gardez la mémoire sous contrôle lors de très gros travaux : forcer périodiquement la collecte des déchets pendant la fusion et régler la piscine du navigateur avec
BrowserPool.MaxIdleTabsetMaxDynamicHFPagesPerBatchpeut aider.

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes et créer des manuels bien structurés et visuellement attrayants.