HTML要素やページの一部のセクションをC#でPDFに変換する方法

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

IronPDFには特定のHTML要素をターゲットにするための組み込みのSelectCssメソッドがありません。 ChromePdfRendererは完全なHTMLドキュメントをレンダリングします—ページ全体、URL全体、HTML文字列全体。 ページの特定のセクションからPDFを生成するために、JavaScript DOM操作、CSSインジェクション、サーバーサイドのHTMLフラグメント抽出、URLレンダリングとJSターゲティングの4つのアプローチの1つを使用してレンダリング前にターゲット要素を分離します。

各アプローチは異なる制約に適しています。 JavaScript DOMの分離は、ターゲットを除いて全てを削除する必要がある場合に、URLや完全なページをレンダリングする際に機能します。 CSSインジェクションは、DOMを変更せずに不要なコンテンツを隠します。 サーバーサイドの抽出は、生のHTMLにアクセスできる場合に最もクリーンな結果を提供します。 URLレンダリングとJSターゲティングは、ソースHTMLが利用できないライブダッシュボードやサードパーティーページを処理します。

無料の30日間トライアルを開始して、全てのアプローチをテストしてください。

クイックスタート: 特定のHTML要素をPDFとして抽出

JavaScript DOM分離とWaitForを使用してCSSセレクタで任意の要素をターゲットし、そのフラグメントだけをPDFにレンダリングします。

  1. IronPDF をNuGetパッケージマネージャでインストール

    PM > Install-Package IronPdf
  2. このコード スニペットをコピーして実行します。

    using IronPdf;
    
    var renderer = new ChromePdfRenderer();
    renderer.RenderingOptions.EnableJavaScript = true;
    renderer.RenderingOptions.JavaScript = @"
        var target = document.querySelector('#invoice-summary');
        document.body.innerHTML = target.outerHTML;
    ";
    renderer.RenderingOptions.WaitFor.HtmlQuerySelector("#invoice-summary", 10000);
    
    var pdf = renderer.RenderHtmlAsPdf(fullPageHtml);
    pdf.SaveAs("invoice-summary.pdf");
  3. 実際の環境でテストするためにデプロイする

    今日プロジェクトで IronPDF を使い始めましょう無料トライアル

    arrow pointer

最小のワークフロー (3つのステップ)

  1. NuGetを介してIronPdfをインストールします: Install-Package IronPdf
  2. ChromePdfRenderOptions.JavaScriptを設定してターゲット要素を分離し、WaitForを設定してその存在を確認します
  3. RenderHtmlAsPdf()またはRenderUrlAsPdf()を呼び出します—PDFには分離されたコンテンツのみが含まれます

JavaScript DOM操作で要素を分離する方法は?

ChromePdfRenderOptions.JavaScriptプロパティは、HTMLがロードされた後、PDFがレンダリングされる前に実行されるJavaScriptの文字列を受け取ります。 ターゲット要素のdocument.body.innerHTMLを置換することにより、レンダリングされたページから他のすべてを削除します。 これは最も柔軟なアプローチで、RenderUrlAsPdf()の両方で機能します。

WaitFor.HtmlQuerySelector()メソッドは、JavaScriptが実行される前にターゲット要素がDOMに存在することを確認します。 これは非同期コンテンツを含むページでは重要です — Reactコンポーネント、Angularテンプレート、API駆動のデータが初期ページ読み込み後に入力されます。

:path=/static-assets/pdf/content-code-examples/how-to/html-element-to-pdf-2.cs
using IronPdf;

string fullPageHtml = @"
<html>
<body>
    <header><h1>Acme Corp Invoice</h1></header>
    <nav>Navigation links...</nav>
    <div id='invoice-summary'>
        <h2>Invoice #12345</h2>
        <table>
            <tr><td>Widget A</td><td>$49.99</td></tr>
            <tr><td>Widget B</td><td>$29.99</td></tr>
            <tr><td><strong>Total</strong></td><td><strong>$79.98</strong></td></tr>
        </table>
    </div>
    <footer>Footer content...</footer>
</body>
</html>";

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;

// Replace the body with only the target element
renderer.RenderingOptions.Javascript = @"
    var el = document.querySelector('#invoice-summary');
    if (el) {
        document.body.innerHTML = el.outerHTML;
    }
";

// Wait for the target element to exist before JS executes
renderer.RenderingOptions.WaitFor.HtmlQuerySelector("#invoice-summary", 10000);

PdfDocument pdf = renderer.RenderHtmlAsPdf(fullPageHtml);
pdf.SaveAs("invoice-summary-only.pdf");
Imports IronPdf

Dim fullPageHtml As String = "
<html>
<body>
    <header><h1>Acme Corp Invoice</h1></header>
    <nav>Navigation links...</nav>
    <div id='invoice-summary'>
        <h2>Invoice #12345</h2>
        <table>
            <tr><td>Widget A</td><td>$49.99</td></tr>
            <tr><td>Widget B</td><td>$29.99</td></tr>
            <tr><td><strong>Total</strong></td><td><strong>$79.98</strong></td></tr>
        </table>
    </div>
    <footer>Footer content...</footer>
</body>
</html>"

Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = True

' Replace the body with only the target element
renderer.RenderingOptions.Javascript = "
    var el = document.querySelector('#invoice-summary');
    if (el) {
        document.body.innerHTML = el.outerHTML;
    }
"

' Wait for the target element to exist before JS executes
renderer.RenderingOptions.WaitFor.HtmlQuerySelector("#invoice-summary", 10000)

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(fullPageHtml)
pdf.SaveAs("invoice-summary-only.pdf")
$vbLabelText   $csharpLabel

JavaScriptは、#invoice-summary divのouterHTMLでボディ全体を置換します。 結果のPDFには請求書テーブルのみが含まれます — ヘッダー、ナビゲーション、フッターはありません。 WaitFor.HtmlElementById()メソッドは、IDでターゲティングする場合により簡単な代替手段を提供します:

// Alternative: wait by ID directly
renderer.RenderingOptions.WaitFor.HtmlElementById("invoice-summary", 10000);
// Alternative: wait by ID directly
renderer.RenderingOptions.WaitFor.HtmlElementById("invoice-summary", 10000);
' Alternative: wait by ID directly
renderer.RenderingOptions.WaitFor.HtmlElementById("invoice-summary", 10000)
$vbLabelText   $csharpLabel

複雑なセレクター(クラス名、データ属性、ネストされた要素)の場合、document.querySelector()が受け入れるどんなCSSセレクタ文字列も受け入れます。 追加のHtmlElementByClassName(), HtmlElementByName(), HtmlQuerySelector()にデリゲートしますが、コードではより明確な意図を提供します。

ターゲット要素が親コンテナから継承されたスタイルに依存する場合、outerHTML置換は祖先セレクターに依存するCSSルールを失うことがあります(例: .dashboard .widget table { ... })。 これを保つために、該当する<head>からJS分離にコピーします:

renderer.RenderingOptions.JavaScript = @"
    var el = document.querySelector('#invoice-summary');
    if (el) {
        var head = document.head.innerHTML;
        document.body.innerHTML = el.outerHTML;
        document.head.innerHTML = head;
    }
";
renderer.RenderingOptions.JavaScript = @"
    var el = document.querySelector('#invoice-summary');
    if (el) {
        var head = document.head.innerHTML;
        document.body.innerHTML = el.outerHTML;
        document.head.innerHTML = head;
    }
";
renderer.RenderingOptions.JavaScript = "
    var el = document.querySelector('#invoice-summary');
    if (el) {
        var head = document.head.innerHTML;
        document.body.innerHTML = el.outerHTML;
        document.head.innerHTML = head;
    }
"
$vbLabelText   $csharpLabel

これにより、元の<head>のコンテンツ(スタイルシート、フォント、メタタグ)を保持しながら、ボディだけを置き換えます。 JavaScriptからPDFへの方法およびWaitForの方法は、複数の非同期データソースを持つページの追加設定オプションをカバーします。

CSSインジェクションで要素を分離する方法は?

ChromePdfRenderOptions.CustomCssUrlプロパティは、IronPDFがレンダリングの前に適用するスタイルシートへのファイルパスまたはURLを受け取ります。 DOMを操作する代わりに、CSS display: noneを使用してターゲット要素以外のすべてを非表示にします。 これにより、元のDOM構造が保持され、JavaScriptの実行を完全に避けることができます。

:path=/static-assets/pdf/content-code-examples/how-to/html-element-to-pdf-5.cs
using IronPdf;

// Create a CSS file that hides everything except #invoice-summary
string cssContent = @"
body > *:not(#invoice-summary) {
    display: none !important;
}
#invoice-summary {
    display: block !important;
    margin: 0;
    padding: 20px;
}
";
File.WriteAllText("isolate-element.css", cssContent);

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CustomCssUrl = "isolate-element.css";

PdfDocument pdf = renderer.RenderHtmlAsPdf(fullPageHtml);
pdf.SaveAs("invoice-css-isolated.pdf");
Imports IronPdf

' Create a CSS file that hides everything except #invoice-summary
Dim cssContent As String = "
body > *:not(#invoice-summary) {
    display: none !important;
}
#invoice-summary {
    display: block !important;
    margin: 0;
    padding: 20px;
}
"
File.WriteAllText("isolate-element.css", cssContent)

Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.CustomCssUrl = "isolate-element.css"

Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(fullPageHtml)
pdf.SaveAs("invoice-css-isolated.pdf")
$vbLabelText   $csharpLabel

注意: RenderHtmlAsPdf()と一緒にHTML文字列のレンダリングでのみ動作します。 URLレンダリングの場合、CSSの注入をJavaScriptプロパティに埋め込んでください:

renderer.RenderingOptions.JavaScript = @"
    var style = document.createElement('style');
    style.textContent = 'body > *:not(#invoice-summary) { display: none !important; }';
    document.head.appendChild(style);
";
renderer.RenderingOptions.JavaScript = @"
    var style = document.createElement('style');
    style.textContent = 'body > *:not(#invoice-summary) { display: none !important; }';
    document.head.appendChild(style);
";
renderer.RenderingOptions.JavaScript = "
    var style = document.createElement('style');
    style.textContent = 'body > *:not(#invoice-summary) { display: none !important; }';
    document.head.appendChild(style);
"
$vbLabelText   $csharpLabel

ソースHTMLを制御する場合、@media printルールは最も軽量な代替手段を提供します—外部依存関係もランタイム注入もありません:

@media print {
    header, nav, footer, .sidebar { display: none !important; }
    #invoice-summary { width: 100%; margin: 0; }
}

PdfCssMediaType.Printに設定して、これらのルールをアクティブにします:

:path=/static-assets/pdf/content-code-examples/how-to/html-element-to-pdf-8.cs
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
Imports IronPdf.Rendering

renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
$vbLabelText   $csharpLabel

これは、アプリケーションがすでに@media printルールを定義しているフォームセクション印刷シナリオに最適です。またはフォームHTMLがサーバー側で構築されている場合、アプローチ3でも最適です。

CSSアプローチは一つの重要な制限があります: display: noneが誤った具体性レベルで使用されると、隠された要素は依然としてドキュメントフローでスペースを占有します。 特定のブレークポイントで要素を再表示する可能性のあるフレームワークスタイル(Bootstrap, Tailwind)を上書きするには、常に!importantを使用してください。 深くネストされたターゲットの場合、より正確なセレクタがコラテラルな隠れを回避します。

body > *:not(#target),
body > *:not(#target) ~ * {
    display: none !important;
}
Icon Quote related to CSSインジェクションで要素を分離する方法は?

私のお気に入りのこの種のライブラリはIronPDFです。PDFファイルの迅速で効率的な操作が可能です。また、PDF/A形式へのエクスポートやPDF文書へのデジタル署名といった多くの貴重な機能も備えています。

Milan Jovanovic related to CSSインジェクションで要素を分離する方法は?

Milan Jovanovic

Microsoft MVP

ケーススタディを見る
Icon Quote related to CSSインジェクションで要素を分離する方法は?

IronOCRのおかげで私たちは年間$40,000を手作業の処理から節約し、生産性を向上させ、高影響のタスクにリソースを充てることができます。非常にお勧めします。

Brent Matzelle related to CSSインジェクションで要素を分離する方法は?

Brent Matzelle

最高技術責任者, OPYN

ケーススタディを見る
Icon Quote related to CSSインジェクションで要素を分離する方法は?

IronSuiteは私たちの業務において重要な役割を果たしています。これらは、フロアプランの作成や在庫管理の改善を含め、ビジネス全体の効率を向上させるツールです。

David Jones related to CSSインジェクションで要素を分離する方法は?

David Jones

リードソフトウェアエンジニア、Agorus Build

ケーススタディを見る

サーバーサイドでHTMLフラグメントを抽出する方法は?

生のHTMLにアクセスできる場合 — ファイル、データベース、CMS、またはHTTPレスポンスから読み取る — 最もクリーンなアプローチは、HTMLパーサーを使用してサーバーサイドでターゲット要素を抽出し、そのフラグメントをRenderHtmlAsPdf()に渡すことです。 JavaScriptもCSSインジェクションも実行時DOM操作もありません。

AngleSharpは、このパターンの標準的な.NET HTMLパーサーです。

:path=/static-assets/pdf/content-code-examples/how-to/html-element-to-pdf-10.cs
using IronPdf;
using AngleSharp;
using AngleSharp.Html.Parser;

string fullPageHtml = @"
<html>
<head>
    <style>
        table { border-collapse: collapse; width: 100%; }
        td, th { border: 1px solid #ddd; padding: 8px; text-align: left; }
    </style>
</head>
<body>
    <header><h1>Dashboard</h1></header>
    <div id='revenue-widget'>
        <h3>Q4 Revenue</h3>
        <table>
            <tr><th>Month</th><th>Revenue</th></tr>
            <tr><td>October</td><td>$1.2M</td></tr>
            <tr><td>November</td><td>$1.5M</td></tr>
            <tr><td>December</td><td>$1.8M</td></tr>
        </table>
    </div>
    <div id='other-content'>Other widgets...</div>
</body>
</html>";

// Parse and extract the target element
var parser = new HtmlParser();
var document = parser.ParseDocument(fullPageHtml);
var targetElement = document.QuerySelector("#revenue-widget");

if (targetElement is null)
{
    Console.WriteLine("Target element not found.");
    return;
}

// Wrap the fragment in a minimal HTML document to preserve styles
string fragmentHtml = $@"
<html>
<head>
    <style>
        table {{ border-collapse: collapse; width: 100%; }}
        td, th {{ border: 1px solid #ddd; padding: 8px; text-align: left; }}
    </style>
</head>
<body>
    {targetElement.OuterHtml}
</body>
</html>";

var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf(fragmentHtml);
pdf.SaveAs("revenue-widget.pdf");
Imports IronPdf
Imports AngleSharp
Imports AngleSharp.Html.Parser

Dim fullPageHtml As String = "
<html>
<head>
    <style>
        table { border-collapse: collapse; width: 100%; }
        td, th { border: 1px solid #ddd; padding: 8px; text-align: left; }
    </style>
</head>
<body>
    <header><h1>Dashboard</h1></header>
    <div id='revenue-widget'>
        <h3>Q4 Revenue</h3>
        <table>
            <tr><th>Month</th><th>Revenue</th></tr>
            <tr><td>October</td><td>$1.2M</td></tr>
            <tr><td>November</td><td>$1.5M</td></tr>
            <tr><td>December</td><td>$1.8M</td></tr>
        </table>
    </div>
    <div id='other-content'>Other widgets...</div>
</body>
</html>"

' Parse and extract the target element
Dim parser As New HtmlParser()
Dim document = parser.ParseDocument(fullPageHtml)
Dim targetElement = document.QuerySelector("#revenue-widget")

If targetElement Is Nothing Then
    Console.WriteLine("Target element not found.")
    Return
End If

' Wrap the fragment in a minimal HTML document to preserve styles
Dim fragmentHtml As String = $"
<html>
<head>
    <style>
        table {{ border-collapse: collapse; width: 100%; }}
        td, th {{ border: 1px solid #ddd; padding: 8px; text-align: left; }}
    </style>
</head>
<body>
    {targetElement.OuterHtml}
</body>
</html>"

Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(fragmentHtml)
pdf.SaveAs("revenue-widget.pdf")
$vbLabelText   $csharpLabel

重要な詳細は、抽出されたフラグメントを関連する<link>タグを持つ完全なHTMLドキュメントでラッピングすることです。 このラッパーがないと、インラインスタイルは正しくレンダリングされるが、外部スタイルシートと継承されたCSSルールは失われます。メールテンプレートプレビューのレンダリングでは、すでに文字列として保存されているテンプレートHTMLは、この抽出パターンによってピクセル単位で完璧な結果を得ることができます。

同様のパターンは、代替パーサーとしてHtmlAgilityPackで機能します。

:path=/static-assets/pdf/content-code-examples/how-to/html-element-to-pdf-11.cs
using HtmlAgilityPack;
using IronPdf;

var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(fullPageHtml);

var targetNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@id='revenue-widget']");
if (targetNode is null)
{
    Console.WriteLine("Target element not found.");
    return;
}

string fragmentHtml = $"<html><body>{targetNode.OuterHtml}</body></html>";

var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf(fragmentHtml);
pdf.SaveAs("revenue-widget-hap.pdf");
Imports HtmlAgilityPack
Imports IronPdf

Dim htmlDoc As New HtmlDocument()
htmlDoc.LoadHtml(fullPageHtml)

Dim targetNode = htmlDoc.DocumentNode.SelectSingleNode("//*[@id='revenue-widget']")
If targetNode Is Nothing Then
    Console.WriteLine("Target element not found.")
    Return
End If

Dim fragmentHtml As String = $"<html><body>{targetNode.OuterHtml}</body></html>"

Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(fragmentHtml)
pdf.SaveAs("revenue-widget-hap.pdf")
$vbLabelText   $csharpLabel
:path=/static-assets/pdf/content-code-examples/how-to/html-element-to-pdf-12.cs
PdfDocument pdf = renderer.RenderHtmlAsPdf(fragmentHtml, @"C:\templates\assets\");
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(fragmentHtml, "C:\templates\assets\")
$vbLabelText   $csharpLabel

AngleSharpとHtmlAgilityPackの選択は主に好みの問題です。 AngleSharpはCSSセレクタ(QuerySelector)を使用し、フロントエンド開発者のメンタルモデルと一致します。 HtmlAgilityPackはXPath(SelectSingleNode)を使用し、XMLを多用する.NETコードベースではより親しみやすいです。

メールテンプレートプレビューのレンダリング-送信前にHTMLメールテンプレートのPDFプレビューを生成-は純粋なアプローチ3シナリオです。 テンプレートHTMLは保存された文字列であり、外部リソース(画像、フォント)は既知のURLにホストされており、RenderHtmlAsPdf(string Html, string BaseUrlOrPath)のパラメーターがすべての相対パスを解決します。

HTMLにReactまたはVueアプリケーションが実行時にポピュレートする<div id="app"></div>が含まれている場合、抽出されたフラグメントは空になります。 そのような場合は、アプローチ1または4を使用します。

ライブURLをレンダリングする際に要素をターゲットにする方法は?

ソースHTMLにアクセスできないライブURL—サードパーティのダッシュボード、外部レポート、ホストされたアプリケーション—の場合、WaitForと組み合わせて、ページ読み込み後に特定のセクションを分離します。

これは、ダッシュボードウィジェットをエクスポートするシナリオです: BIツールがウェブページ上でチャートやテーブルをレンダリングし、単一のウィジェットを利害関係者配信用のPDFとしてエクスポートする必要があります。

:path=/static-assets/pdf/content-code-examples/how-to/html-element-to-pdf-13.cs
using IronPdf;

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;

// Wait for the dashboard widget to render (async content)
renderer.RenderingOptions.WaitFor.HtmlQuerySelector("[data-widget='revenue-chart']", 15000);

// Isolate the widget after it renders
renderer.RenderingOptions.Javascript = @"
    var widget = document.querySelector('[data-widget=""revenue-chart""]');
    if (widget) {
        // Preserve computed styles by cloning into a clean body
        document.body.innerHTML = '';
        document.body.appendChild(widget);
    }
";

PdfDocument pdf = renderer.RenderUrlAsPdf("https://dashboard.example.com/q4-report");
pdf.SaveAs("revenue-chart-export.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = True

' Wait for the dashboard widget to render (async content)
renderer.RenderingOptions.WaitFor.HtmlQuerySelector("[data-widget='revenue-chart']", 15000)

' Isolate the widget after it renders
renderer.RenderingOptions.Javascript = "
    var widget = document.querySelector('[data-widget=""revenue-chart""]);
    if (widget) {
        // Preserve computed styles by cloning into a clean body
        document.body.innerHTML = '';
        document.body.appendChild(widget);
    }
"

Dim pdf As PdfDocument = renderer.RenderUrlAsPdf("https://dashboard.example.com/q4-report")
pdf.SaveAs("revenue-chart-export.pdf")
$vbLabelText   $csharpLabel

WaitFor.HtmlQuerySelector()呼び出しにより、JavaScript実行前にウィジェットがDOMに存在することを確認します。 15秒のタイムアウトは、ダッシュボードデータを入力するAPI呼び出しの遅さに対応しています。 JavaScriptはその後、ページを該当のウィジェットのみへと削減します。

複雑なCSS依存関係を持つページの場合、appendChildアプローチ(ノードをコピーする代わりに移動)により、要素がCSSOMにおける位置を保持するため、より多くの計算スタイルが保存されます。 アプローチ1のinnerHTML置換アプローチは簡単ですが、祖先セレクタに依存するスタイルを失うことがあります。

ターゲットページが認証を必要とする場合、RenderUrlAsPdf()を呼び出す前にレンダラでクッキーを設定してください:

renderer.RenderingOptions.CustomCookies = new Dictionary<string, string>
{
    { "session_id", "abc123" },
    { "auth_token", "bearer-xyz" }
};
renderer.RenderingOptions.CustomCookies = new Dictionary<string, string>
{
    { "session_id", "abc123" },
    { "auth_token", "bearer-xyz" }
};
Imports System.Collections.Generic

renderer.RenderingOptions.CustomCookies = New Dictionary(Of String, String) From {
    {"session_id", "abc123"},
    {"auth_token", "bearer-xyz"}
}
$vbLabelText   $csharpLabel

HtmlQuerySelector()を超える待機戦略を提供します。 NetworkIdle0()は、接続がゼロの間にすべてのネットワークリクエストが完了するまで待機します — 複数のAPIエンドポイントからデータをロードするダッシュボードに便利です。 NetworkIdle2() は、最大2つの未完了の接続を許容します。これにより、持続的なWebSocket接続やロングポーリングを持つページを処理します。 JavaScript() は、ページがwindow.ironpdf.notifyRender()をコールするのを待ちます — ターゲットページを制御し、データがすべてロードされ、アニメーションが完了した後、レンダリング準備完了を明示的に信号することができる最も精密なオプションです。

定期的なダッシュボードエクスポート(例:夜間のPDF生成を利害関係者メール配信用)では、タイムアウト例外をキャッチするリトライループにレンダリングをラップします。 もしWaitFor がそのmaxWaitTime を超えた場合、IronPDFは利用可能なコンテンツでレンダリングを進めます — これにより不完全な可能性があります。 タイムアウトを増やすかNetworkIdle0() に切り替えることにより、通常、遅いネットワークでの断続的な障害を解決します。

4つのアプローチの比較

アプローチ 最適 ソースHTMLが必要 JS依存 複雑
JavaScript DOMアイソレーション 任意のソースからの一般的な要素抽出 なし はい 中規模
CSSインジェクション DOMの変更なしにセクションを隠します; @media print レイアウト 部分的(CustomCssUrlがRenderHtmlAsPdfを必要とします) なし(URLのためにJSで注入しない限り) 低レベル
サーバーサイドフラグメント抽出 CMSコンテンツ、保存されたテンプレート、メールプレビュー はい なし 低–中
JSターゲティングによるURLレンダリング ライブダッシュボード、サードパーティーページ、SPAウィジェット なし はい 中 –高

正しいアプローチの選択

決定は2つの要素に依存します: 生のHTMLにアクセスできるかどうかと、ターゲットコンテンツがJavaScriptでレンダリングを必要としているかどうか。

Invoice ラインアイテムの抽出が最も一般的な使用ケースです。 請求書のHTMLがサーバーサイドで生成される場合(Razorビュー、Handlebarsテンプレート、保存されたHTML文字列)、アプローチ3(サーバーサイド抽出)はランタイムオーバーヘッドゼロで最もクリーンな結果を提供します。 #line-items テーブルを抽出し、それをスタイル付きHTMLシェルに包んでレンダリングします。

Dashboard ウィジェットエクスポートにはJavaScript実行が必要です - ウィジェットのコンテンツは初期ページ読み込み後にAPIコールによってポピュレートされるからです。 アプローチ1(JS DOMアイソレーション)は、ダッシュボードがローカルで実行されるか、認証の背後にある場合に処理します。 アプローチ4(JSターゲティングによるURLレンダリング)は、ダッシュボードがサードパーティのホストされたアプリケーションでURLしか持たない場合に必要です。

Form セクション印刷 — ユーザレビューまたはコンプライアンスアーカイバルのためのマルチステップフォームの特定のセクションの抽出 — は、アプリケーションがすでに@media printルールを定義している場合、自然にアプローチ2(CSSインジェクション)にマッピングされます。フォームHTMLがサーバー側で構築されている場合、アプローチ3でも適しています。

Email テンプレートプレビューのレンダリング — 送信前にHTMLメールテンプレートのPDFプレビューを生成 — は完全にアプローチ3のシナリオです。 テンプレートHTMLは保存された文字列で、外部リソース(画像、フォント)は既知のURLにホストされており、BaseUrlOrPathのパラメータがすべての相対パスを解決します。

複数のシナリオをサポートする必要があるアプリケーションでは、戦略パラメータを受け入れるサービスインターフェースの背後でレンダリングロジックをカプセル化します。

public enum ElementExtractionStrategy
{
    JavaScriptIsolation,
    CssInjection,
    ServerSideExtraction,
    UrlWithJsTargeting
}
public enum ElementExtractionStrategy
{
    JavaScriptIsolation,
    CssInjection,
    ServerSideExtraction,
    UrlWithJsTargeting
}
Public Enum ElementExtractionStrategy
    JavaScriptIsolation
    CssInjection
    ServerSideExtraction
    UrlWithJsTargeting
End Enum
$vbLabelText   $csharpLabel

これにより、レンダラー構成を重複させることなく、入力タイプに基づいて適切なアプローチを呼び出すコードが選択できます。

次のステップ

IronPDFでのHTML要素のアイソレーションはレンダリング時の課題であり、組み込みのAPI機能ではありません。 上記の4つのアプローチは全範囲をカバーしています - サーバーサイドテンプレート抽出(ゼロJS、最もクリーンな出力)からライブURLターゲティング(完全なJS実行、SPAと非同期コンテンツに対応)まで。 比較表は迅速な参照を提供し、実世界のシナリオは一般的なビジネス要件を適切な戦略にマップします。

プロダクション展開に関する追加の考慮事項がいくつかあります:

パフォーマンス: サーバーサイド抽出(アプローチ3)はJavaScriptの実行を完全にスキップするため最速です。 JavaScriptベースのアプローチ(1と4)は、ページの複雑さとWaitForのタイムアウトに比例したオーバーヘッドを追加します。 バッチ処理の場合(例、500の請求書PDFを生成)、ChromePdfRendererインスタンスにより、最高のスループットが得られます。

デバッグ: PDF出力がブランクまたはコンテンツが欠落している場合、WaitForのタイムアウトを増やします。 ターゲット要素が非同期データに依存している場合、RenderDelayよりも信頼性があります。 レンダリングオプションガイドは、レイアウトに影響を与えるビューポート幅とペーパーフィットの構成をカバーしています。

アプローチの組み合わせ: 戦略のミックスを防ぐものはありません。 複数のフラグメント(1つのソースからのヘッダー、別のソースからのデータテーブル、第三のソースからのチャートSVG)からコンポジットHTMLドキュメントを構築するためにサーバーサイド抽出を使用し、組み立てたドキュメントを単一のPDFとしてレンダリングすることができます。 RenderHtmlAsPdf(string Html, string BaseUrlOrPath)メソッドは、ベースURLから相対アセットパスを解決し、異種ソースから文書を組み立てるのを簡単にします。

JavaScriptからPDFへの方法で高度なJS実行パターンを、WaitForドキュメントで利用可能なすべての待機戦略を、レンダリングオプションガイドで完全なChromePdfRenderOptionsの表面を、カスタムJavaScriptコード例で実行可能なスニペットを探求してください。

ライセンスオプションを表示 $999から始まります。 ChromePdfRenderOptions APIリファレンスおよびWaitFor APIリファレンスがすべてのプロパティとメソッドを文書化しています。

よくある質問

C#でHTML要素をPDFに変換する主要なアプローチは何ですか?

JS分離、CSS隠し、サーバーサイド抽出、ライブURLターゲティングが主要なアプローチであり、すべてIronPDFを使用して実装できます。

HTMLからPDFへの変換でJSの分離はどのように機能しますか?

JS分離は、JavaScriptを実行してHTMLドキュメントを動的に操作し、それをPDFに変換します。IronPDFを使用して特定の要素のみがレンダリングされることを確保します。

PDF変換においてCSSの隠しはどのように使用されますか?

CSSの隠しは、PDFに現れてはならない要素を隠すためにCSSスタイルを使用します。IronPDFは、変換プロセス中にスタイルシートやスタイルルールを指定することでこれをサポートします。

IronPDFは特定のHTML要素をサーバーサイドで抽出してPDFを生成できますか?

はい、IronPDFは特定のHTML要素をサーバーサイドで抽出し、ウェブページのどの部分がPDFに変換されるかを正確に制御します。

HTMLからPDFへの変換におけるライブURLターゲティングの利点は何ですか?

ライブURLターゲティングにより、IronPDFはライブウェブページのURLから要素を直接PDFに変換し、ローカルHTMLファイルが不要なまま、最新のコンテンツをキャプチャします。

IronPDFを使用して、ウェブページのセクションのみをPDFに変換できますか?

はい、IronPDFはウェブページの特定のセクションや要素をPDFに変換する機能を提供しており、関連コンテンツに容易に焦点を当てることができます。

IronPDFは、HTMLからPDFへの変換中に動的コンテンツをどのように処理しますか?

IronPDFは変換中にJavaScriptを実行して動的コンテンツをレンダリングし、クライアントサイドのスクリプトに依存する要素がPDF内で正確に表現されることを確保します。

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 に変換されるのを確認します。