Dateigröße mit Base64-Bildkopf- und Fußzeilen reduzieren
Das Hinzufügen eines Base64-Bildes zu einer Kopf- oder Fußzeile in einem großen mehrseitigen PDF kann die Ausgabedatei erheblich aufblähen. Die Lösung besteht darin, das Bild nur einmal einzubetten, anstatt auf jeder Seite, während Seitentext wie {page} weiterhin normal gerendert wird.
Die Aufblähung tritt auf, weil der Renderer einen kombinierten Fragment behandelt. Wenn ein einzelnes Fragment sowohl das Bild als auch dynamische Inhalte wie {page} enthält, behandelt die Engine das gesamte HTML als dynamisch und bettet das Base64-Bild auf jeder Seite erneut ein. Das Aufteilen der Arbeit in zwei Durchgänge hält das Bild statisch und die Seitennummer-Schicht klein.
Lösung
1. Teilen Sie die Kopf- oder Fußzeile in zwei Fragmente
Trennen Sie den Inhalt in ein statisches Fragment und ein dynamisches. Legen Sie das Bild und jeden nicht veränderlichen Text in das statische Fragment. Legen Sie Seitentexte wie {page} in das dynamische Fragment. Geben Sie beiden Fragmenten das gleiche Tabellenlayout und die gleiche Zellbreite, sodass der dynamische Text korrekt über der statischen Schicht landet.
2. Fügen Sie zuerst das statische Fragment hinzu
Rufen Sie AddHtmlHeadersAndFooters nur mit dem statischen Fragment auf. Das Base64-Bild wird einmalig gerendert und eingebettet.
3. Fügen Sie das dynamische Fragment in einem zweiten Durchgang hinzu
Rufen Sie AddHtmlHeadersAndFooters erneut nur mit dem dynamischen Fragment auf. Da dieser Durchgang kein Bild enthält, bleibt der Seitentext klein.
using IronPdf;
var pdf = PdfDocument.FromFile("input.pdf");
// Static layer: holds the Base64 image. The page-number cell is left empty.
string staticFooter = @"
<table style='width:100%; table-layout:fixed;'>
<tr>
<td style='width:20%;'>
<img src='data:image/png;base64,iVBORw0KGg...' style='width:150px;' />
</td>
<td style='width:80%; text-align:right;'></td>
</tr>
</table>";
// Dynamic layer: holds only {page}. Same layout, but no image.
string dynamicFooter = $@"
<table style='width:100%; table-layout:fixed;'>
<tr>
<td style='width:20%;'></td>
<td style='width:80%; text-align:right; font-size:10px;'>Page {{page}} of {pdf.PageCount}</td>
</tr>
</table>";
// Pass 1: add the static image footer (image embedded once).
pdf.AddHtmlHeadersAndFooters(new ChromePdfRenderOptions
{
HtmlFooter = new HtmlHeaderFooter { HtmlFragment = staticFooter, MaxHeight = 40 }
});
// Pass 2: add the dynamic page-number footer (no image, stays small).
pdf.AddHtmlHeadersAndFooters(new ChromePdfRenderOptions
{
HtmlFooter = new HtmlHeaderFooter { HtmlFragment = dynamicFooter, MaxHeight = 40 }
});
pdf.SaveAs("output.pdf");
using IronPdf;
var pdf = PdfDocument.FromFile("input.pdf");
// Static layer: holds the Base64 image. The page-number cell is left empty.
string staticFooter = @"
<table style='width:100%; table-layout:fixed;'>
<tr>
<td style='width:20%;'>
<img src='data:image/png;base64,iVBORw0KGg...' style='width:150px;' />
</td>
<td style='width:80%; text-align:right;'></td>
</tr>
</table>";
// Dynamic layer: holds only {page}. Same layout, but no image.
string dynamicFooter = $@"
<table style='width:100%; table-layout:fixed;'>
<tr>
<td style='width:20%;'></td>
<td style='width:80%; text-align:right; font-size:10px;'>Page {{page}} of {pdf.PageCount}</td>
</tr>
</table>";
// Pass 1: add the static image footer (image embedded once).
pdf.AddHtmlHeadersAndFooters(new ChromePdfRenderOptions
{
HtmlFooter = new HtmlHeaderFooter { HtmlFragment = staticFooter, MaxHeight = 40 }
});
// Pass 2: add the dynamic page-number footer (no image, stays small).
pdf.AddHtmlHeadersAndFooters(new ChromePdfRenderOptions
{
HtmlFooter = new HtmlHeaderFooter { HtmlFragment = dynamicFooter, MaxHeight = 40 }
});
pdf.SaveAs("output.pdf");
Imports IronPdf
Dim pdf = PdfDocument.FromFile("input.pdf")
' Static layer: holds the Base64 image. The page-number cell is left empty.
Dim staticFooter As String = "
<table style='width:100%; table-layout:fixed;'>
<tr>
<td style='width:20%;'>
<img src='data:image/png;base64,iVBORw0KGg...' style='width:150px;' />
</td>
<td style='width:80%; text-align:right;'></td>
</tr>
</table>"
' Dynamic layer: holds only {page}. Same layout, but no image.
Dim dynamicFooter As String = $"
<table style='width:100%; table-layout:fixed;'>
<tr>
<td style='width:20%;'></td>
<td style='width:80%; text-align:right; font-size:10px;'>Page {{page}} of {pdf.PageCount}</td>
</tr>
</table>"
' Pass 1: add the static image footer (image embedded once).
pdf.AddHtmlHeadersAndFooters(New ChromePdfRenderOptions With {
.HtmlFooter = New HtmlHeaderFooter With {.HtmlFragment = staticFooter, .MaxHeight = 40}
})
' Pass 2: add the dynamic page-number footer (no image, stays small).
pdf.AddHtmlHeadersAndFooters(New ChromePdfRenderOptions With {
.HtmlFooter = New HtmlHeaderFooter With {.HtmlFragment = dynamicFooter, .MaxHeight = 40}
})
pdf.SaveAs("output.pdf")
Die beiden table-layout:fixed-Fragmente haben identische Zellbreiten, sodass die Seitennummer im zweiten Durchgang genau dort sitzt, wo die leere Zelle im ersten war. Die gleiche Technik gilt für Kopfzeilen: Halten Sie das Bild im statischen Durchgang und platzieren Sie jeden dynamischen Kopfzeilentext im zweiten Durchgang.
Wenn beide Fragmente nicht die gleiche Tabellenstruktur und Zellbreiten haben, wird der dynamische Text wie die Seitennummer nicht über der statischen Schicht ausgerichtet.
Option: Referenzieren Sie ein externes Bild oder SVG
Wenn das Bild nicht als Base64 eingebettet werden muss, kann das Verweisen von <img> auf eine externe Datei oder die Verwendung eines SVG die Ausgabegröße weiter als ein Base64-String verringern.

