IRONSOFTWAREHOME
PDF ツール

2025年にMac用のベストPDFエディターを発見する

Curtis Chau
Curtis Chau
Updated: 2026年7月19日

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
SHELL

インストール後、アプリケーションの起動時に 1 回限りのライセンス キー呼び出しを追加します。

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();

この手動による位置決め方法は、さまざまなページの向き、カスタム用紙サイズ、またはさまざまな余白要件を処理する場合には、より複雑になります。 PDF/A 準拠またはデジタル署名を必要とする運用システムの場合、手動アプローチではメンテナンスのオーバーヘッドが大幅に増加します。

基本ヘッダーを使用した場合の出力はどのようになりますか?

タイトルテキストを含むヘッダーとページ番号を示すフッターを含む会社レポートを表示する PDF ドキュメント。PDF 生成における基本的なヘッダーとフッターの実装を示しています。

上記のコードは、手動で作業が必要であることを示しています。正確な座標を計算し、フォントを別々に管理し、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");

IronPDFのレンダリング オプションを使用すると、コードを読みやすく保ちながら PDF 生成を細かく制御できます。 このプロパティベースのアプローチにより、低レベルの PDF 操作を行わなくても、ヘッダーとフッターを簡単に維持および変更できます。

IronPDF はプロフェッショナルなフォーマットをどのように処理しますか?

IronPDF のヘッダーとフッター機能を紹介する 2 ページの PDF ドキュメント。会社のブランド、ページ番号、およびタイムスタンプが複数のページにわたって一貫した書式で表示されます。

違いはすぐに明らかです。IronPDFは、動的なコンテンツ用の組み込みプレースホルダーを提供しながら、配置、余白、レンダリングを自動的に処理します。 ライブラリのChrome レンダリング エンジンにより、 HTML プレビューと一致するピクセルパーフェクトな出力が保証されます。

生産システムにとって最も重要な機能はどれですか?

フィーチャー比較:iText vs IronPDF for HeadersとFooters
特徴iTextIronPDF
実施方法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);
    }
}

このパターンでは、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);

組み込みのプレースホルダーは、{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 &amp; 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");

複雑なヘッダーは実際にはどのようにレンダリングされるのでしょうか?

会社ロゴと年次レポートのブランディングが入ったプロフェッショナルなヘッダーを備えた PDF ドキュメント。一貫性のある複数ページのフォーマットを備えた IronPDF の高度な HTML ヘッダー レンダリング機能を示しています。

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");
C#

このアプローチにより、ヘッダー定義が 1 か所に保持されるため、カバー ヘッダーと内部ヘッダーの両方を同時に更新することが容易になります。 高スループットのシナリオでは、非同期 PDF レンダリングを検討することもできます。

どのアプローチがより良いパフォーマンスと柔軟性を提供しますか?

大きなドキュメントを生成したり、多数の PDF を同時に処理したりする場合には、パフォーマンスが重要になります。 IronPDF のChrome レンダリング エンジンは、本番環境のワークロードにいくつかの利点をもたらします。

1.レンダリングパフォーマンス: IronPDFはレンダリングされたヘッダーとフッターをキャッシュし、複数ページのドキュメントのスループットを向上させます。 2. メモリ効率: ライブラリはメモリ管理を自動的に処理し、手動の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);
}

実稼働環境での使用におけるライセンスの考慮事項について教えてください

IronPDFのライセンスモデルは、iTextのAGPLライセンスとは異なり商用に優しい条件を提供しており、別の商用iTextライセンスを購入しない限り、アプリケーションコードをオープンソースにする必要があります。 実稼働システム向けに、 IronPDF は以下を提供します。

  • 継続的な料金が発生しない永久ライセンス
  • WindowsLinuxmacOSAzureでの展開サポート
  • ライセンスユーザー向けのサポート
  • 生産出力に透かしが入らない

チームの学習曲線はどれくらい急ですか?

iTextのページイベントシステムに慣れている開発者にとっては調整期間がありますが、IronPDFのドキュメントと例によりこれを管理可能にしています。 スタイリングにCSSを使用し、レイアウトにHTMLを使用することができるため、iTextでは広範なカスタムコードが必要となります。 ドキュメントには以下が含まれます:

マージンと間隔の計算はどのように異なりますか?

プロフェッショナルなドキュメントレイアウトでは、正確な余白制御が必要です。 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");

ページ境界に対する位置を計算し、ヘッダーやフッターとコンテンツが重ならないことを手動で確認する必要があるiTextの座標ベースのアプローチとこれを比較してください。

次のステップは何ですか?

PDF ドキュメントにヘッダーとフッターを追加する場合、複雑なイベント処理や座標計算を行う必要はありません。 iTextのアプローチはページイベントと直接コンテンツ操作による詳細な制御を提供しますが、IronPDFはプロパティベースの設定とネイティブHTMLサポートを使ってより直感的なソリューションを提供します。

開発速度、保守性、プロフェッショナルな外観のドキュメントを簡単に作成できることを考慮すると、選択は明らかになります。 IronPDF のヘッダーとフッターへのアプローチは、強力でありながらアクセスしやすい最新の PDF 生成を例示しています。 クリーンなアーキテクチャと保守可能なコードを優先するチームにとって、IronPDF の API は.NET開発プラクティスに適合します。

生産システムの主な利点は次のとおりです。

-開発時間の短縮: プロパティベースの構成と複雑なイベントハンドラー -メンテナンス性の向上: 座標計算の代わりにレイアウト用の HTML/CSS を使用 -柔軟性の向上レスポンシブデザインウェブフォントのネイティブサポート

  • 高性能: キャッシングと並列処理サポートを用いた最適化レンダリング -プロフェッショナルな結果: 最新のWeb標準に準拠したピクセルパーフェクトな出力

まずNuGet経由でIronPDFをインストールし、次にクイックスタート ガイドに従って最初のヘッダーとフッターを数分で構築します。 実稼働環境に移行する準備ができたら、ライセンス オプションを確認して、展開要件に適したプランを見つけます。 統合中に何か問題が発生した場合には、サポート チームがお手伝いします。

[[i: (iTextはその所有者の登録商標です。 このサイトは、iTextと提携しておらず、承認されてもおらず、後援されてもいません。 すべての製品名、ロゴ、およびブランドは各所有者の所有物です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。)]]

Curtis Chau
テクニカルライター

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

...
詳しく読む

関連する記事

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
無料のライブデモを予約する
Booking Badge

世界中の数百万人のエンジニアから信頼されています。

ライセンスはより安く
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。