Zmniejsz rozmiar pliku używając nagłówków i stopek obrazów Base64

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

Dodanie obrazu Base64 do nagłówka lub stopki w dużym wielostronicowym pliku PDF może znacznie zwiększyć rozmiar wyjściowego pliku. Rozwiązanie polega na osadzeniu obrazu raz zamiast na każdej stronie, jednocześnie umożliwiając normalne renderowanie tekstu na stronę, takiego jak {page}.

Nadmierny rozrost rozmiaru występuje ze względu na to, jak renderer obsługuje połączony fragment. Gdy pojedynczy fragment zawiera zarówno obraz, jak i dynamiczną zawartość, taką jak {page}, silnik traktuje cały kod HTML jako dynamiczny i ponownie osadza obraz Base64 na każdej stronie. Podzielenie pracy na dwa etapy utrzymuje obraz statyczny, a warstwę numeracji stron małą.

Rozwiązanie

1. Podziel nagłówek lub stopkę na dwa fragmenty

Podziel zawartość na fragment statyczny i dynamiczny. Umieść obraz i wszelki tekst, który nigdy się nie zmienia, w fragmencie statycznym. Umieść zawartość na stronę, taką jak {page}, w fragmencie dynamicznym. Nadaj obu fragmentom ten sam układ tabeli i szerokości komórek, aby dynamiczny tekst dobrze pasował do warstwy statycznej.

2. Najpierw dodaj fragment statyczny

Wywołaj AddHtmlHeadersAndFooters jedynie z fragmentem statycznym. Obraz Base64 jest renderowany i osadzany tylko raz.

3. Dodaj fragment dynamiczny w drugim przebiegu

Wywołaj AddHtmlHeadersAndFooters ponownie jedynie z fragmentem dynamicznym. Ponieważ ten przebieg nie zawiera obrazu, zawartość na stronę pozostaje mała.

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")
$vbLabelText   $csharpLabel

Oba fragmenty table-layout:fixed mają identyczne szerokości komórek, więc numer strony w drugim przebiegu znajduje się dokładnie tam, gdzie pusta komórka była w pierwszym. Ta sama technika dotyczy nagłówków: trzymaj obraz w statycznym przebiegu i umieść dynamiczny tekst nagłówka w drugim przebiegu.

OstrzeżenieJeśli oba fragmenty nie mają tej samej struktury tabeli i szerokości komórek, dynamiczny tekst, taki jak numer strony, nie będzie się pokrywał z warstwą statyczną.

Opcja: Odwołaj się do zewnętrznego obrazu lub SVG

Jeśli nie potrzebujesz obrazu w formacie Base64, wskazanie <img> na zewnętrzny plik lub użycie SVG może jeszcze bardziej zmniejszyć rozmiar wyjściowy niż ciąg Base64.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 20,296,129 | Wersja: 2026.7 właśnie wydany
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package IronPdf
Uruchom przykład i zobacz, jak Twój kod HTML zamienia się w plik PDF.