Schnellere Kopf- und Fußzeilen bei großen PDFs
Das Hinzufügen von Kopf- und Fußzeilen zu einem sehr großen PDF in einem Durchgang ist langsam. Verarbeiten Sie das Dokument in Seitenabschnitten fester Größe, rendern Sie jede Charge und fügen Sie dann die Teile wieder zusammen, um die gesamte Renderzeit zu verkürzen, während die Seitennummerierung im gesamten Dokument durchgehend bleibt.
Lösung
1. Teilen Sie die Seitenindizes in Chargen auf
Wählen Sie eine Abschnittsgröße und gruppieren Sie die Seitenindizes des Dokuments in Chargen fester Größe, zum Beispiel 300 Seiten pro Charge. Kleinere Abschnitte rendern individuell schneller, erfordern jedoch am Ende mehr Zusammenführungsarbeit.
2. Kopieren Sie jede Charge in ein eigenes Dokument
Extrahieren Sie die Seiten für die aktuelle Charge mit CopyPages, um ein eigenständiges Dokument zum Rendern zu erhalten.
3. Rendern Sie Kopf- und Fußzeilen mit durchgehender Nummerierung
Setzen Sie FirstPageNumber auf die Startseite des Abschnitts, sodass die Nummerierung im gesamten Dokument fortgesetzt wird anstatt bei jedem Abschnitt bei 1 zu beginnen.
4. Speichern Sie jeden Abschnitt und setzen Sie ihn frei
Schreiben Sie jeden Abschnitt in eine temporäre Datei und setzen Sie es frei. Das Freigeben des Abschnitts vor der nächsten Charge verhindert, dass der Speicher während des Ablaufs steigt.
5. Fügen Sie die Abschnitte zum endgültigen PDF zusammen
Öffnen Sie die temporären Dateien erneut, fügen Sie sie in der Reihenfolge mit AppendPdf hinzu, speichern Sie das Ergebnis und löschen Sie dann die temporären Dateien.
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 ist der Schlüssel: Es ist auf die globale Startseite jedes Abschnitts gesetzt, sodass eine Fußzeile wie Page {page} of {total-pages} vom ersten Abschnitt bis zum letzten konsistent bleibt.
Debug-Tipps
- Optimieren Sie die Abschnittsgröße: Der oben genannte Wert (300) ist anpassbar und der Punkt, an dem sich die Abschnittbildung lohnt, hängt von Ihrer Arbeitslast ab.
- Berücksichtigen Sie den Zusammenführungsdurchgang: Die Gesamtzeit ist die Rendering-Zeit pro Abschnitt plus die finale Zusammenführung, daher berücksichtigen Sie diesen zusätzlichen Durchgang bei jedem Vergleich.
- Halten Sie den Speicher bei sehr großen Aufgaben im Griff: Das periodische Erzwingen der Garbage Collection während der Zusammenführung und das Abstimmen des Browserpools mit
BrowserPool.MaxIdleTabsundMaxDynamicHFPagesPerBatchkann helfen.

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender Handbücher.