2025年にMac用のベストPDFエディターを発見する
Full Comparison
Looking for a detailed feature-by-feature breakdown? See how IronPDF stacks up against Itext on pricing, HTML support, and licensing.
IronPDFはプロパティベースの設定とネイティブHTMLサポートによりPDFヘッダーとフッターの作成を簡素化しますが、iTextでは正確な位置決めのためにPdfPageEventHelperを実装し、手動で座標計算を行う必要があります。
ビジネス レポート、請求書、技術文書などのプロフェッショナルな PDF ドキュメントを作成する場合、一貫したヘッダーとフッターによって品質が示され、ブランドが強化されます。 iTextを使ったことのある開発者は知っている通り、ヘッダーやフッターを追加するということは、ページイベントハンドラを書き、座標を計算し、フォントを低レベルで管理することを意味します。 IronPDF は根本的に異なるアプローチを採用しており、すべてのピクセルを指定するのではなく、必要なものを記述できます。 このガイドでは、両方のライブラリを並べて説明しているので、次のプロジェクトで十分な情報に基づいた決定を下すことができます。
IronPDF はどのようにインストールしますか?
比較に入る前に、 IronPDF を.NET 10 プロジェクトに追加する方法を説明します。 Visual Studio で.NET CLI またはNuGetパッケージ マネージャー コンソールを使用します。
dotnet add package IronPdf
# Or in the NuGet Package Manager Console:
# Install-Package IronPdf
dotnet add package IronPdf
# Or in the NuGet Package Manager Console:
# Install-Package IronPdf
インストール後、アプリケーションの起動時に 1 回限りのライセンス キー呼び出しを追加します。
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE"
IronPDF NuGetパッケージは.NET 8+ を対象としており、バンドルされた Chromium エンジンが付属しているため、追加のランタイム依存関係は必要ありません。 無料の試用ライセンスが用意されているので、コミットする前に自分の環境でIronPDF を評価することができます。
iTextのヘッダーとフッター実装の課題は何ですか?
iTextを使用するには、OnEndPageメソッドをオーバーライドしてヘッダーとフッターを追加する必要があります。 このアプローチはPdfContentByteオブジェクトの直接操作と精密な座標計算を伴います。 現代のHTML to PDFソリューションとは異なり、iTextのイベント駆動型アーキテクチャはPDFの構造や座標系の深い理解を必要とします。
座標系はページの左下隅から始まりますが、これはほとんどの開発者がレイアウトについて考える方法とは逆です。 これは、 PDF 仕様がページ座標空間を定義する方法の直接的な結果です。 ページ サイズが変更されるたびに (たとえば、A4 から Letter に切り替える場合)、すべての座標値を再計算する必要があります。 ヘッダーの下に下線を追加したり、テキストを中央揃えにしたり、フッターを右余白に揃えたりするには、明示的な数値オフセットが必要です。
public class HeaderFooterEvent : PdfPageEventHelper
{
private readonly Font headerFont = new Font(Font.FontFamily.HELVETICA, 12, Font.BOLD);
private readonly Font footerFont = new Font(Font.FontFamily.HELVETICA, 10);
public override void OnEndPage(PdfWriter writer, Document document)
{
PdfContentByte cb = writer.DirectContent;
// Add header text -- requires precise Y coordinate calculation
float headerY = document.PageSize.Height - 30;
ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER,
new Phrase("Company Report", headerFont),
document.PageSize.Width / 2, headerY, 0);
// Draw underline manually
cb.MoveTo(40, headerY - 5);
cb.LineTo(document.PageSize.Width - 40, headerY - 5);
cb.Stroke();
// Add footer with page number
string footerText = $"Page {writer.PageNumber}";
ColumnText.ShowTextAligned(cb, Element.ALIGN_RIGHT,
new Phrase(footerText, footerFont),
document.PageSize.Width - 40, 30, 0);
// Add date on left side
ColumnText.ShowTextAligned(cb, Element.ALIGN_LEFT,
new Phrase(DateTime.Now.ToString("MM/dd/yyyy"), footerFont),
40, 30, 0);
}
}
// Usage
PdfWriter writer = PdfWriter.GetInstance(document, stream);
writer.PageEvent = new HeaderFooterEvent();
public class HeaderFooterEvent : PdfPageEventHelper
{
private readonly Font headerFont = new Font(Font.FontFamily.HELVETICA, 12, Font.BOLD);
private readonly Font footerFont = new Font(Font.FontFamily.HELVETICA, 10);
public override void OnEndPage(PdfWriter writer, Document document)
{
PdfContentByte cb = writer.DirectContent;
// Add header text -- requires precise Y coordinate calculation
float headerY = document.PageSize.Height - 30;
ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER,
new Phrase("Company Report", headerFont),
document.PageSize.Width / 2, headerY, 0);
// Draw underline manually
cb.MoveTo(40, headerY - 5);
cb.LineTo(document.PageSize.Width - 40, headerY - 5);
cb.Stroke();
// Add footer with page number
string footerText = $"Page {writer.PageNumber}";
ColumnText.ShowTextAligned(cb, Element.ALIGN_RIGHT,
new Phrase(footerText, footerFont),
document.PageSize.Width - 40, 30, 0);
// Add date on left side
ColumnText.ShowTextAligned(cb, Element.ALIGN_LEFT,
new Phrase(DateTime.Now.ToString("MM/dd/yyyy"), footerFont),
40, 30, 0);
}
}
// Usage
PdfWriter writer = PdfWriter.GetInstance(document, stream);
writer.PageEvent = new HeaderFooterEvent();
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Public Class HeaderFooterEvent
Inherits PdfPageEventHelper
Private ReadOnly headerFont As Font = New Font(Font.FontFamily.HELVETICA, 12, Font.BOLD)
Private ReadOnly footerFont As Font = New Font(Font.FontFamily.HELVETICA, 10)
Public Overrides Sub OnEndPage(writer As PdfWriter, document As Document)
Dim cb As PdfContentByte = writer.DirectContent
' Add header text -- requires precise Y coordinate calculation
Dim headerY As Single = document.PageSize.Height - 30
ColumnText.ShowTextAligned(cb, Element.ALIGN_CENTER,
New Phrase("Company Report", headerFont),
document.PageSize.Width / 2, headerY, 0)
' Draw underline manually
cb.MoveTo(40, headerY - 5)
cb.LineTo(document.PageSize.Width - 40, headerY - 5)
cb.Stroke()
' Add footer with page number
Dim footerText As String = $"Page {writer.PageNumber}"
ColumnText.ShowTextAligned(cb, Element.ALIGN_RIGHT,
New Phrase(footerText, footerFont),
document.PageSize.Width - 40, 30, 0)
' Add date on left side
ColumnText.ShowTextAligned(cb, Element.ALIGN_LEFT,
New Phrase(DateTime.Now.ToString("MM/dd/yyyy"), footerFont),
40, 30, 0)
End Sub
End Class
' Usage
Dim writer As PdfWriter = PdfWriter.GetInstance(document, stream)
writer.PageEvent = New HeaderFooterEvent()
この手動による位置決め方法は、さまざまなページの向き、カスタム用紙サイズ、またはさまざまな余白要件を処理する場合には、より複雑になります。 PDF/A 準拠またはデジタル署名を必要とする運用システムの場合、手動アプローチではメンテナンスのオーバーヘッドが大幅に増加します。
基本ヘッダーを使用した場合の出力はどのようになりますか?

上記のコードは、手動で作業が必要であることを示しています。正確な座標を計算し、フォントを別々に管理し、DirectContentを通じてレンダリングを処理します。 すべての設計変更は、イベント ハンドラー全体に散在する数値定数を編集することを意味します。
座標ベースのレイアウトでメンテナンスの問題が発生するのはなぜですか?
デザインの変更 (ロゴの移動、フォント サイズの調整、日付の中央への移動など) が発生すると、開発者はピクセル オフセットをトレースして何を変更すればよいかを把握する必要があります。 視覚的なレイヤーはありません。 コード自体がレイアウトの唯一の仕様です。 これにより、開発者間の引き継ぎでエラーが発生しやすくなり、小さなビジュアル修正を行うのにも時間がかかるようになります。
IronPDFはどのようにヘッダーとフッターの作成を簡素化しますか?
IronPDF は、直感的な API を使用してヘッダーとフッターの作成プロセスを変革します。 イベントハンドラを実装する代わりに、ChromePdfRendererの簡単なプロパティ設定を通じてヘッダーとフッターを設定します。 このアプローチは、最新 for .NET開発手法と一致しており、学習曲線が大幅に短縮されます。
using IronPdf;
var renderer = new ChromePdfRenderer();
// Configure text header with multiple properties
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Company Report",
LeftText = "CONFIDENTIAL",
RightText = DateTime.Now.ToString("MMMM yyyy"),
DrawDividerLine = true,
FontSize = 12,
FontFamily = "Arial",
Spacing = 5
};
// Configure text footer with dynamic placeholders
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
LeftText = "{date} {time}",
CenterText = "© 2024 Company Name",
RightText = "Page {page} of {total-pages}",
DrawDividerLine = true,
FontSize = 10,
Spacing = 10
};
// Set margins to ensure proper spacing
renderer.RenderingOptions.MarginTop = 30;
renderer.RenderingOptions.MarginBottom = 25;
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// Configure text header with multiple properties
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Company Report",
LeftText = "CONFIDENTIAL",
RightText = DateTime.Now.ToString("MMMM yyyy"),
DrawDividerLine = true,
FontSize = 12,
FontFamily = "Arial",
Spacing = 5
};
// Configure text footer with dynamic placeholders
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
LeftText = "{date} {time}",
CenterText = "© 2024 Company Name",
RightText = "Page {page} of {total-pages}",
DrawDividerLine = true,
FontSize = 10,
Spacing = 10
};
// Set margins to ensure proper spacing
renderer.RenderingOptions.MarginTop = 30;
renderer.RenderingOptions.MarginBottom = 25;
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' Configure text header with multiple properties
renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
.CenterText = "Company Report",
.LeftText = "CONFIDENTIAL",
.RightText = DateTime.Now.ToString("MMMM yyyy"),
.DrawDividerLine = True,
.FontSize = 12,
.FontFamily = "Arial",
.Spacing = 5
}
' Configure text footer with dynamic placeholders
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.LeftText = "{date} {time}",
.CenterText = "© 2024 Company Name",
.RightText = "Page {page} of {total-pages}",
.DrawDividerLine = True,
.FontSize = 10,
.Spacing = 10
}
' Set margins to ensure proper spacing
renderer.RenderingOptions.MarginTop = 30
renderer.RenderingOptions.MarginBottom = 25
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("report.pdf")
IronPDFのレンダリング オプションを使用すると、コードを読みやすく保ちながら PDF 生成を細かく制御できます。 このプロパティベースのアプローチにより、低レベルの PDF 操作を行わなくても、ヘッダーとフッターを簡単に維持および変更できます。
IronPDF はプロフェッショナルなフォーマットをどのように処理しますか?

違いはすぐに明らかです。IronPDFは、動的なコンテンツ用の組み込みプレースホルダーを提供しながら、配置、余白、レンダリングを自動的に処理します。 ライブラリのChrome レンダリング エンジンにより、 HTML プレビューと一致するピクセルパーフェクトな出力が保証されます。
生産システムにとって最も重要な機能はどれですか?
| 特徴 | iText | IronPDF |
|---|---|---|
| 実施方法 | PdfPageEventHelperクラス |
RenderingOptionsプロパティ |
| コードの複雑さ | 手動座標計算 | 単純なプロパティの割り当て |
| ページ番号 | writer.PageNumberによる手動追跡 |
組み込みの{page}プレースホルダー |
| HTML サポート | 制限あり、XMLWorkerが必要 | ネイティブ HTML ヘッダーのサポート |
| マージン管理 | 手動計算 | 自動調整 |
| 動的コンテンツ | カスタム実装が必要 | 定義済みのプレースホルダー |
| 最初のページが異なる | 複雑な条件付きロジック | FirstPageNumberプロパティ |
| 学習曲線 | 急な | 徐々に |
ページ番号付きのヘッダーとフッターを追加するにはどうすればよいですか?
ページ番号付けは PDF ドキュメントの標準要件です。 iTextを使用すると、現在のページ番号と総ページ数を手動で追跡しなければならず、正確な総ページ数を取得するために2パスアプローチがしばしば必要です。
// iTextSharp approach with complete page numbering
public class CompleteHeaderFooterEvent : PdfPageEventHelper
{
private readonly PdfTemplate totalPageCount;
private readonly Font normalFont = new Font(Font.FontFamily.HELVETICA, 10);
public CompleteHeaderFooterEvent(PdfWriter writer)
{
// Create placeholder for total page count
totalPageCount = writer.DirectContent.CreateTemplate(30, 16);
}
public override void OnEndPage(PdfWriter writer, Document document)
{
PdfPTable footerTable = new PdfPTable(3);
footerTable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
footerTable.SetWidths(new float[] { 1, 1, 1 });
PdfPCell leftCell = new PdfPCell(new Phrase(DateTime.Now.ToString("dd/MM/yyyy"), normalFont));
leftCell.Border = Rectangle.NO_BORDER;
leftCell.HorizontalAlignment = Element.ALIGN_LEFT;
PdfPCell centerCell = new PdfPCell(new Phrase("Confidential", normalFont));
centerCell.Border = Rectangle.NO_BORDER;
centerCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfPCell rightCell = new PdfPCell();
rightCell.Border = Rectangle.NO_BORDER;
rightCell.HorizontalAlignment = Element.ALIGN_RIGHT;
Chunk pageNum = new Chunk($"Page {writer.PageNumber} of ", normalFont);
rightCell.AddElement(pageNum);
rightCell.AddElement(Image.GetInstance(totalPageCount));
footerTable.AddCell(leftCell);
footerTable.AddCell(centerCell);
footerTable.AddCell(rightCell);
footerTable.WriteSelectedRows(0, -1, document.LeftMargin,
document.PageSize.GetBottom(document.BottomMargin), writer.DirectContent);
}
public override void OnCloseDocument(PdfWriter writer, Document document)
{
ColumnText.ShowTextAligned(totalPageCount, Element.ALIGN_LEFT,
new Phrase(writer.PageNumber.ToString(), normalFont), 0, 0, 0);
}
}
// iTextSharp approach with complete page numbering
public class CompleteHeaderFooterEvent : PdfPageEventHelper
{
private readonly PdfTemplate totalPageCount;
private readonly Font normalFont = new Font(Font.FontFamily.HELVETICA, 10);
public CompleteHeaderFooterEvent(PdfWriter writer)
{
// Create placeholder for total page count
totalPageCount = writer.DirectContent.CreateTemplate(30, 16);
}
public override void OnEndPage(PdfWriter writer, Document document)
{
PdfPTable footerTable = new PdfPTable(3);
footerTable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin;
footerTable.SetWidths(new float[] { 1, 1, 1 });
PdfPCell leftCell = new PdfPCell(new Phrase(DateTime.Now.ToString("dd/MM/yyyy"), normalFont));
leftCell.Border = Rectangle.NO_BORDER;
leftCell.HorizontalAlignment = Element.ALIGN_LEFT;
PdfPCell centerCell = new PdfPCell(new Phrase("Confidential", normalFont));
centerCell.Border = Rectangle.NO_BORDER;
centerCell.HorizontalAlignment = Element.ALIGN_CENTER;
PdfPCell rightCell = new PdfPCell();
rightCell.Border = Rectangle.NO_BORDER;
rightCell.HorizontalAlignment = Element.ALIGN_RIGHT;
Chunk pageNum = new Chunk($"Page {writer.PageNumber} of ", normalFont);
rightCell.AddElement(pageNum);
rightCell.AddElement(Image.GetInstance(totalPageCount));
footerTable.AddCell(leftCell);
footerTable.AddCell(centerCell);
footerTable.AddCell(rightCell);
footerTable.WriteSelectedRows(0, -1, document.LeftMargin,
document.PageSize.GetBottom(document.BottomMargin), writer.DirectContent);
}
public override void OnCloseDocument(PdfWriter writer, Document document)
{
ColumnText.ShowTextAligned(totalPageCount, Element.ALIGN_LEFT,
new Phrase(writer.PageNumber.ToString(), normalFont), 0, 0, 0);
}
}
Imports System
Imports iTextSharp.text
Imports iTextSharp.text.pdf
' iTextSharp approach with complete page numbering
Public Class CompleteHeaderFooterEvent
Inherits PdfPageEventHelper
Private ReadOnly totalPageCount As PdfTemplate
Private ReadOnly normalFont As Font = New Font(Font.FontFamily.HELVETICA, 10)
Public Sub New(writer As PdfWriter)
' Create placeholder for total page count
totalPageCount = writer.DirectContent.CreateTemplate(30, 16)
End Sub
Public Overrides Sub OnEndPage(writer As PdfWriter, document As Document)
Dim footerTable As New PdfPTable(3)
footerTable.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin
footerTable.SetWidths(New Single() {1, 1, 1})
Dim leftCell As New PdfPCell(New Phrase(DateTime.Now.ToString("dd/MM/yyyy"), normalFont))
leftCell.Border = Rectangle.NO_BORDER
leftCell.HorizontalAlignment = Element.ALIGN_LEFT
Dim centerCell As New PdfPCell(New Phrase("Confidential", normalFont))
centerCell.Border = Rectangle.NO_BORDER
centerCell.HorizontalAlignment = Element.ALIGN_CENTER
Dim rightCell As New PdfPCell()
rightCell.Border = Rectangle.NO_BORDER
rightCell.HorizontalAlignment = Element.ALIGN_RIGHT
Dim pageNum As New Chunk($"Page {writer.PageNumber} of ", normalFont)
rightCell.AddElement(pageNum)
rightCell.AddElement(Image.GetInstance(totalPageCount))
footerTable.AddCell(leftCell)
footerTable.AddCell(centerCell)
footerTable.AddCell(rightCell)
footerTable.WriteSelectedRows(0, -1, document.LeftMargin, document.PageSize.GetBottom(document.BottomMargin), writer.DirectContent)
End Sub
Public Overrides Sub OnCloseDocument(writer As PdfWriter, document As Document)
ColumnText.ShowTextAligned(totalPageCount, Element.ALIGN_LEFT, New Phrase(writer.PageNumber.ToString(), normalFont), 0, 0, 0)
End Sub
End Class
このパターンでは、PDF テンプレート オブジェクトをプレースホルダーとして作成し、ドキュメントが閉じられた後に合計ページ数を入力する必要があります。 この2パス性はiTextの内部に詳しくない人には明白ではなく、間違えると最終PDFでページ数が間違ってしまいます。
IronPDF のアプローチがより保守しやすいのはなぜですか?
IronPDF は、組み込みのプレースホルダーと自動ページ番号処理を使用してページ番号を処理します。
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
LeftText = "{date} {time}",
CenterText = "Confidential -- Internal Use Only",
RightText = "Page {page} of {total-pages}",
DrawDividerLine = true,
FontSize = 10,
FontFamily = "Calibri",
Spacing = 8
};
// Skip numbering on cover page
renderer.RenderingOptions.FirstPageNumber = 0;
renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.MarginTop = 30;
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
LeftText = "{date} {time}",
CenterText = "Confidential -- Internal Use Only",
RightText = "Page {page} of {total-pages}",
DrawDividerLine = true,
FontSize = 10,
FontFamily = "Calibri",
Spacing = 8
};
// Skip numbering on cover page
renderer.RenderingOptions.FirstPageNumber = 0;
renderer.RenderingOptions.MarginBottom = 25;
renderer.RenderingOptions.MarginTop = 30;
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.LeftText = "{date} {time}",
.CenterText = "Confidential -- Internal Use Only",
.RightText = "Page {page} of {total-pages}",
.DrawDividerLine = True,
.FontSize = 10,
.FontFamily = "Calibri",
.Spacing = 8
}
' Skip numbering on cover page
renderer.RenderingOptions.FirstPageNumber = 0
renderer.RenderingOptions.MarginBottom = 25
renderer.RenderingOptions.MarginTop = 30
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
組み込みのプレースホルダーは、{page}, {total-pages}, {date}, {time}, {html-title}, {pdf-title}, そして{url}をサポートします。 複雑な後処理や 2 パス レンダリングは必要ありません。 ライブラリは合計ページ数を内部的に解決し、すべてのプレースホルダー サイトに自動的に挿入します。
動的コンテンツで HTML ヘッダーを作成できますか?
会社のロゴ、スタイル設定されたタイポグラフィ、構造化されたテーブルを含むレイアウトの場合、HTML ヘッダーはテキストベースのヘッダーよりもはるかに高い柔軟性を提供します。 IronPDF はネイティブHTML ヘッダーとフッターのサポートにより優れています。
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 10px 0;'>
<img src='logo.png' style='height: 40px;'>
<div style='text-align: center;'>
<h2 style='margin: 0; color: #2c3e50;'>Annual Report 2024</h2>
<p style='margin: 0; font-size: 12px; color: #7f8c8d;'>Financial Performance & Strategic Overview</p>
</div>
<div style='text-align: right; font-size: 11px; color: #95a5a6;'>
Document ID: AR-2024-001<br>
Classification: Public
</div>
</div>",
MaxHeight = 80,
DrawDividerLine = true,
BaseUrl = new Uri(System.IO.Path.GetFullPath("assets/")).AbsoluteUri
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<table style='width: 100%; font-size: 10px; color: #34495e;'>
<tr>
<td style='width: 33%; text-align: left;'>Generated: {date} at {time}</td>
<td style='width: 34%; text-align: center;'>Page {page} of {total-pages}</td>
<td style='width: 33%; text-align: right;'>Annual Report 2024</td>
</tr>
</table>",
MaxHeight = 30,
DrawDividerLine = true
};
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("annual-report.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 10px 0;'>
<img src='logo.png' style='height: 40px;'>
<div style='text-align: center;'>
<h2 style='margin: 0; color: #2c3e50;'>Annual Report 2024</h2>
<p style='margin: 0; font-size: 12px; color: #7f8c8d;'>Financial Performance & Strategic Overview</p>
</div>
<div style='text-align: right; font-size: 11px; color: #95a5a6;'>
Document ID: AR-2024-001<br>
Classification: Public
</div>
</div>",
MaxHeight = 80,
DrawDividerLine = true,
BaseUrl = new Uri(System.IO.Path.GetFullPath("assets/")).AbsoluteUri
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<table style='width: 100%; font-size: 10px; color: #34495e;'>
<tr>
<td style='width: 33%; text-align: left;'>Generated: {date} at {time}</td>
<td style='width: 34%; text-align: center;'>Page {page} of {total-pages}</td>
<td style='width: 33%; text-align: right;'>Annual Report 2024</td>
</tr>
</table>",
MaxHeight = 30,
DrawDividerLine = true
};
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("annual-report.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='width: 100%; display: flex; justify-content: space-between; align-items: center; padding: 10px 0;'>
<img src='logo.png' style='height: 40px;'>
<div style='text-align: center;'>
<h2 style='margin: 0; color: #2c3e50;'>Annual Report 2024</h2>
<p style='margin: 0; font-size: 12px; color: #7f8c8d;'>Financial Performance & Strategic Overview</p>
</div>
<div style='text-align: right; font-size: 11px; color: #95a5a6;'>
Document ID: AR-2024-001<br>
Classification: Public
</div>
</div>",
.MaxHeight = 80,
.DrawDividerLine = True,
.BaseUrl = New Uri(System.IO.Path.GetFullPath("assets/")).AbsoluteUri
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "
<table style='width: 100%; font-size: 10px; color: #34495e;'>
<tr>
<td style='width: 33%; text-align: left;'>Generated: {date} at {time}</td>
<td style='width: 34%; text-align: center;'>Page {page} of {total-pages}</td>
<td style='width: 33%; text-align: right;'>Annual Report 2024</td>
</tr>
</table>",
.MaxHeight = 30,
.DrawDividerLine = True
}
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("annual-report.pdf")
複雑なヘッダーは実際にはどのようにレンダリングされるのでしょうか?

iTextを使用してHTMLヘッダーを実現するには、XMLWorker拡張機能を追加し、複雑な解析コードを書く必要があります。 ライブラリの CSS サポートが限られているため、さまざまな用紙サイズで確実に機能する最新のレイアウトを作成することは困難です。 画像、フレックス レイアウト、Web フォントでは、コードの複雑さが大幅に増加する回避策が必要になります。
最初のページのヘッダーをどのように処理しますか?
多くの専門的な文書では、表紙に異なるヘッダーが必要です。タイトル ページには大きなロゴ、後続のページにはコンパクトなヘッダーです。 IronPDF は条件付き HTML と CSS を通じてこのパターンをサポートします。
using IronPdf;
var renderer = new ChromePdfRenderer();
string firstPageHeader = @"
<div style='text-align: center; padding: 20px 0;'>
<img src='logo-large.png' style='height: 80px; margin-bottom: 10px;'>
<h1 style='margin: 0; color: #2c3e50;'>2024 Annual Report</h1>
<h3 style='margin: 5px 0; color: #7f8c8d;'>Fiscal Year Ending December 31, 2024</h3>
</div>";
string subsequentPageHeader = @"
<div style='display: flex; justify-content: space-between; align-items: center;'>
<img src='logo-small.png' style='height: 30px;'>
<span>Annual Report 2024</span>
<span>Page {page}</span>
</div>";
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = $@"
<style>
.first-page {{display: none;}}
.other-pages {{display: block;}}
@page:first {{
.first-page {{display: block;}}
.other-pages {{display: none;}}
}}
</style>
<div class='first-page'>{firstPageHeader}</div>
<div class='other-pages'>{subsequentPageHeader}</div>",
MaxHeight = 100
};
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report-with-cover.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
string firstPageHeader = @"
<div style='text-align: center; padding: 20px 0;'>
<img src='logo-large.png' style='height: 80px; margin-bottom: 10px;'>
<h1 style='margin: 0; color: #2c3e50;'>2024 Annual Report</h1>
<h3 style='margin: 5px 0; color: #7f8c8d;'>Fiscal Year Ending December 31, 2024</h3>
</div>";
string subsequentPageHeader = @"
<div style='display: flex; justify-content: space-between; align-items: center;'>
<img src='logo-small.png' style='height: 30px;'>
<span>Annual Report 2024</span>
<span>Page {page}</span>
</div>";
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = $@"
<style>
.first-page {{display: none;}}
.other-pages {{display: block;}}
@page:first {{
.first-page {{display: block;}}
.other-pages {{display: none;}}
}}
</style>
<div class='first-page'>{firstPageHeader}</div>
<div class='other-pages'>{subsequentPageHeader}</div>",
MaxHeight = 100
};
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report-with-cover.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim firstPageHeader As String = "
<div style='text-align: center; padding: 20px 0;'>
<img src='logo-large.png' style='height: 80px; margin-bottom: 10px;'>
<h1 style='margin: 0; color: #2c3e50;'>2024 Annual Report</h1>
<h3 style='margin: 5px 0; color: #7f8c8d;'>Fiscal Year Ending December 31, 2024</h3>
</div>"
Dim subsequentPageHeader As String = "
<div style='display: flex; justify-content: space-between; align-items: center;'>
<img src='logo-small.png' style='height: 30px;'>
<span>Annual Report 2024</span>
<span>Page {page}</span>
</div>"
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = $"
<style>
.first-page {{display: none;}}
.other-pages {{display: block;}}
@page:first {{
.first-page {{display: block;}}
.other-pages {{display: none;}}
}}
</style>
<div class='first-page'>{firstPageHeader}</div>
<div class='other-pages'>{subsequentPageHeader}</div>",
.MaxHeight = 100
}
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("report-with-cover.pdf")
このアプローチにより、ヘッダー定義が 1 か所に保持されるため、カバー ヘッダーと内部ヘッダーの両方を同時に更新することが容易になります。 高スループットのシナリオでは、非同期 PDF レンダリングを検討することもできます。
どのアプローチがより良いパフォーマンスと柔軟性を提供しますか?
大きなドキュメントを生成したり、多数の PDF を同時に処理したりする場合には、パフォーマンスが重要になります。 IronPDF のChrome レンダリング エンジンは、本番環境のワークロードにいくつかの利点をもたらします。
1.レンダリングパフォーマンス: IronPDFはレンダリングされたヘッダーとフッターをキャッシュし、複数ページのドキュメントのスループットを向上させます。
- メモリ効率: ライブラリはメモリ管理を自動的に処理し、手動の
PdfContentByte操作で発生する可能性のあるリークを回避します。 3.並列処理:非同期操作のサポートにより、 Task.WhenAllパターンを使用した効率的なバッチ生成が可能になります。
using IronPdf;
public async Task GenerateReportsAsync(List<ReportData> reports)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Monthly Report",
DrawDividerLine = true
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
RightText = "Page {page} of {total-pages}",
DrawDividerLine = true
};
// Disable JavaScript if not required for faster rendering
renderer.RenderingOptions.EnableJavaScript = false;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
var tasks = reports.Select(async report =>
{
string html = await GenerateHtmlAsync(report);
return await renderer.RenderHtmlAsPdfAsync(html);
});
PdfDocument[] pdfs = await Task.WhenAll(tasks);
}
using IronPdf;
public async Task GenerateReportsAsync(List<ReportData> reports)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Monthly Report",
DrawDividerLine = true
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
RightText = "Page {page} of {total-pages}",
DrawDividerLine = true
};
// Disable JavaScript if not required for faster rendering
renderer.RenderingOptions.EnableJavaScript = false;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
var tasks = reports.Select(async report =>
{
string html = await GenerateHtmlAsync(report);
return await renderer.RenderHtmlAsPdfAsync(html);
});
PdfDocument[] pdfs = await Task.WhenAll(tasks);
}
Imports IronPdf
Public Async Function GenerateReportsAsync(reports As List(Of ReportData)) As Task
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
.CenterText = "Monthly Report",
.DrawDividerLine = True
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.RightText = "Page {page} of {total-pages}",
.DrawDividerLine = True
}
' Disable JavaScript if not required for faster rendering
renderer.RenderingOptions.EnableJavaScript = False
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
Dim tasks = reports.Select(Async Function(report)
Dim html As String = Await GenerateHtmlAsync(report)
Return Await renderer.RenderHtmlAsPdfAsync(html)
End Function)
Dim pdfs As PdfDocument() = Await Task.WhenAll(tasks)
End Function
実稼働環境での使用におけるライセンスの考慮事項について教えてください
IronPDFのライセンスモデルは、iTextのAGPLライセンスとは異なり商用に優しい条件を提供しており、別の商用iTextライセンスを購入しない限り、アプリケーションコードをオープンソースにする必要があります。 実稼働システム向けに、 IronPDF は以下を提供します。
チームの学習曲線はどれくらい急ですか?
iTextのページイベントシステムに慣れている開発者にとっては調整期間がありますが、IronPDFのドキュメントと例によりこれを管理可能にしています。 スタイリングにCSSを使用し、レイアウトにHTMLを使用することができるため、iTextでは広範なカスタムコードが必要となります。 ドキュメントには以下が含まれます:
- 迅速なオンボーディングのためのクイックスタートガイド
- 一般的なシナリオを網羅したコード例
- 生産上の問題に関するトラブルシューティングガイド
- 完全なIntelliSenseサポートを備えたAPIリファレンス
マージンと間隔の計算はどのように異なりますか?
プロフェッショナルなドキュメントレイアウトでは、正確な余白制御が必要です。 IronPDF、印刷レイアウトの自然な単位であるミリメートルでの測定でこれを簡素化します。
using IronPdf;
var renderer = new ChromePdfRenderer();
// Set margins in millimeters
renderer.RenderingOptions.MarginTop = 25.4; // 1 inch
renderer.RenderingOptions.MarginBottom = 25.4;
renderer.RenderingOptions.MarginLeft = 19.05; // 0.75 inch
renderer.RenderingOptions.MarginRight = 19.05;
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Internal Report",
DrawDividerLine = true,
Spacing = 5
};
// Use print CSS media type for accurate page layout
// See MDN reference: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/print
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("margin-report.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// Set margins in millimeters
renderer.RenderingOptions.MarginTop = 25.4; // 1 inch
renderer.RenderingOptions.MarginBottom = 25.4;
renderer.RenderingOptions.MarginLeft = 19.05; // 0.75 inch
renderer.RenderingOptions.MarginRight = 19.05;
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Internal Report",
DrawDividerLine = true,
Spacing = 5
};
// Use print CSS media type for accurate page layout
// See MDN reference: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/print
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("margin-report.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' Set margins in millimeters
renderer.RenderingOptions.MarginTop = 25.4 ' 1 inch
renderer.RenderingOptions.MarginBottom = 25.4
renderer.RenderingOptions.MarginLeft = 19.05 ' 0.75 inch
renderer.RenderingOptions.MarginRight = 19.05
renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
.CenterText = "Internal Report",
.DrawDividerLine = True,
.Spacing = 5
}
' Use print CSS media type for accurate page layout
' See MDN reference: https://developer.mozilla.org/en-US/docs/Web/CSS/@media/print
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("margin-report.pdf")
ページ境界に対する位置を計算し、ヘッダーやフッターとコンテンツが重ならないことを手動で確認する必要があるiTextの座標ベースのアプローチとこれを比較してください。
次のステップは何ですか?
PDF ドキュメントにヘッダーとフッターを追加する場合、複雑なイベント処理や座標計算を行う必要はありません。 iTextのアプローチはページイベントと直接コンテンツ操作による詳細な制御を提供しますが、IronPDFはプロパティベースの設定とネイティブHTMLサポートを使ってより直感的なソリューションを提供します。
開発速度、保守性、プロフェッショナルな外観のドキュメントを簡単に作成できることを考慮すると、選択は明らかになります。 IronPDF のヘッダーとフッターへのアプローチは、強力でありながらアクセスしやすい最新の PDF 生成を例示しています。 クリーンなアーキテクチャと保守可能なコードを優先するチームにとって、IronPDF の API は.NET開発プラクティスに適合します。
生産システムの主な利点は次のとおりです。
-開発時間の短縮: プロパティベースの構成と複雑なイベントハンドラー -メンテナンス性の向上: 座標計算の代わりにレイアウト用の HTML/CSS を使用 -柔軟性の向上:レスポンシブデザインとウェブフォントのネイティブサポート
- 高性能: キャッシングと並列処理サポートを用いた最適化レンダリング -プロフェッショナルな結果: 最新のWeb標準に準拠したピクセルパーフェクトな出力
まずNuGet経由でIronPDFをインストールし、次にクイックスタート ガイドに従って最初のヘッダーとフッターを数分で構築します。 実稼働環境に移行する準備ができたら、ライセンス オプションを確認して、展開要件に適したプランを見つけます。 統合中に何か問題が発生した場合には、サポート チームがお手伝いします。
[[i: (iTextはその所有者の登録商標です。 このサイトは、iTextと提携しておらず、承認されてもおらず、後援されてもいません。 すべての製品名、ロゴ、およびブランドは各所有者の所有物です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。)]]
よくある質問
ヘッダーとフッターを追加するためのIronPDFとiTextSharpの主な違いは何ですか?
IronPDFはネイティブのHTMLサポートを備えたプロパティベースのAPIを使用し、iTextSharpは手動の座標計算を伴うPdfPageEventHelperの実装を必要とします。IronPDFはまた、ページ番号、日付、URLのための組み込みプレースホルダーを提供します。
IronPDFはどのようにページヘッダーの追加を簡素化しますか?
IronPDFはTextHeaderFooterまたはHtmlHeaderFooterプロパティを通じてChromePdfRenderer.RenderingOptionsでヘッダーを設定でき、ページイベントを処理したりピクセル位置を計算する必要がありません。
HTMLを使ってIronPDFのヘッダーをカスタマイズすることは可能ですか?
はい、IronPDFはHTMLベースのヘッダーとフッターをHtmlHeaderFooterクラスを通じてサポートしており、フルCSSスタイリング、画像、および{page}や{total-pages}のような動的プレースホルダーを可能にします。
ビジネスレポートにIronPDFを使うメリットは何ですか?
IronPDFはプロパティベースの設定で実装時間を短縮し、ページ番号と日付のための動的プレースホルダーをサポートし、Chromiumエンジンを使用してピクセル単位で正確なヘッダーをレンダリングします。
IronPDFはヘッダーやフッターのページ番号を扱うことができますか?
はい、IronPDFは{page}や{total-pages}などの組み込みプレースホルダーを通じてページ番号を自動で処理し、二段階のレンダリングは不要です。
使いやすさの点で、IronPDFはiTextSharpと比べてどうですか?
IronPDFは低レベルの座標ベースのイベントハンドラを声明的プロパティAPIに置き換え、レイアウト用にHTML/CSSをサポートしているため、一般的に使用しやすいです。
IronPDFはヘッダー内のダイナミックコンテンツをサポートしていますか?
はい、IronPDFはテキストおよびHTMLヘッダーの両方で{page}、{total-pages}、{date}、{time}、{html-title}、{url}などの組み込みプレースホルダーを通じて動的コンテンツをサポートします。
IronPDFがドキュメントプロジェクトに適している理由は何ですか?
IronPDFのHTMLヘッダーサポートにより、一貫したスタイル、会社のブランド化、更新のしやすさが重要なドキュメントに最適です。変更は数字の座標定数を編集するのではなくHTMLを編集することで行います。
カスタムヘッダー付きの請求書にIronPDFを使用できますか?
はい、IronPDFはロゴ付きのカスタムHTMLヘッダー、スタイル付きテキスト、動的フィールドをサポートしており、請求書の生成に適しています。



