Base64画像ヘッダーとフッターでファイルサイズを削減する

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

大きな複数ページのPDFにBase64画像をヘッダーやフッターに追加すると、出力ファイルが劇的に増加することがあります。 解決策は、ページごとのテキストのように{page}が通常通りレンダリングされる間、画像を毎ページではなく一度だけ埋め込むことです。

肥大化は、レンダラーが結合されたフラグメントをどのように処理するかによって発生します。 単一のフラグメントが画像と{page}などの動的コンテンツの両方を保持すると、エンジンはすべてのHTMLを動的と見なし、Base64画像を各ページに再埋込します。 作業を2回に分けることで、画像を静的に保ち、ページ番号のレイヤーを小さくすることができます。

解決策

1. ヘッダーまたはフッターを2つのフラグメントに分割する

コンテンツを静的フラグメントと動的フラグメントに分けます。 画像と常に変わらないテキストを静的フラグメントに入れます。 {page}のようなページごとのコンテンツを動的フラグメントに入れます。 動的テキストが静的レイヤーの上に正しく配置されるように、両フラグメントに同じテーブルレイアウトとセル幅を持たせます。

2. まず静的フラグメントを追加する

静的フラグメントのみでAddHtmlHeadersAndFootersを呼び出します。 Base64画像は一度だけレンダリングされ、埋め込まれます。

3. 2回目のパスで動的フラグメントを追加する

動的フラグメントのみでAddHtmlHeadersAndFootersを再び呼び出します。 このパスには画像が含まれていないため、ページごとのコンテンツは小さく保たれます。

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

2つのtable-layout:fixedフラグメントは同一のセル幅を共有しているため、2回目のパスのページ番号は空のセルがあった場所に正確に配置されます。同じ技術がヘッダーにも適用されます:静的パスで画像を保ち、動的ヘッダーテキストを2回目のパスに配置します。

もし両方のフラグメントが同じテーブル構造とセル幅を共有していない場合には、ページ番号のような動的テキストは静的レイヤーの上に揃いません。

オプション: 外部の画像またはSVGを参照する

画像をBase64としてインライン化する必要がない場合、<img>を外部ファイルに向けるかSVGを使用することで、Base64文字列よりさらに出力サイズを縮小できます。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

準備はできましたか?
Nuget ダウンロード 20,296,129 | バージョン: 2026.7 リリースされたばかり
Still Scrolling Icon

まだスクロールしていますか?

すぐに証拠が欲しいですか? PM > Install-Package IronPdf
サンプルを実行するHTML が PDF に変換されるのを確認します。