IronPDFを使用してASP.NETパネルでPDFを表示する方法
ASP.NETパネル コントロール内で PDF ドキュメントを表示することは、ドキュメント管理システム、レポート ビューアー、請求書表示などの一般的な要件です。 IronPDF は、クライアント側の依存関係を排除し、すべてのブラウザーとプラットフォームで一貫して動作するサーバー側レンダリングを通じてこの問題を解決します。
ASP.NET Core Web アプリケーション内に PDF を埋め込む必要がある場合、ブラウザー プラグインまたはクライアント側ライブラリに依存する標準的なアプローチでは脆弱性が生じます。 エンタープライズ環境でのプラグインの制限、ブラウザの動作の一貫性の欠如、モバイル サポートの不足などにより、ユーザー エクスペリエンスが損なわれます。 サーバー側のアプローチにより、これらの問題点がすべて解消されます。
IronPDF はPDF の生成と配信をすべてサーバー上で処理するため、ブラウザは正しい MIME タイプを持つ標準の PDF バイト ストリームを受信します。プラグインは必要なく、ブラウザ固有の回避策も必要ありません。

ASP.NETでのサーバー側 PDF レンダリングはどのように機能しますか?
IronPDFは、ヘッドレスChromeエンジンを使用してPDFレンダリングを完全にサーバー側で実行します。コントローラはPDFドキュメントを生成または取得し、バイト配列に変換して、inline Content-Dispositionヘッダーを使用してブラウザにストリーミングします。 ブラウザに組み込まれている PDF ビューアは、パネルに埋め込まれた <iframe> 内にドキュメントを表示します。
この根本的な変化により、従来の問題点が解消されます。
- クライアントマシンにAdobe Readerやブラウザ拡張機能は必要ありません
- ユーザーのオペレーティング システムやブラウザのバージョンに関係なく、一貫したレンダリング
- ドキュメントのコンテンツ、レイアウト、スタイルを完全にプログラムで制御
- ITポリシーによってプラグインのインストールがブロックされるエンタープライズ環境でも動作します
ライブラリのChrome レンダリング エンジンは、 HTML、URL、および生のコンテンツ ソースからピクセル単位の完璧な出力を生成します。 PDF がクライアントに届く前に、用紙サイズ、余白、ヘッダー、フッター、CSS メディア タイプなど、出力のあらゆる側面を制御できます。
IronPDF は、Windows、Linux、macOS サーバーでのクロスプラットフォーム展開もサポートしているため、 AzureまたはAWSで実行されるクラウドホスト型ASP.NETアプリケーションや、 Dockerを使用したコンテナー化された環境にも適しています。

NuGetパッケージをどのようにセットアップしますか?
Visual Studio を開き、ソリューション エクスプローラーでプロジェクトを右クリックし、 NuGetパッケージの管理を選択します。 IronPdf を検索してインストールしてください。 または、パッケージ マネージャー コンソールで次のコマンドを実行します。
Install-Package IronPdf
dotnet add package IronPdf を使用して.NET CLI を使用することもできます。 インストールしたら、コントローラーまたはサービス クラスの先頭に using IronPdf; を追加して、ライブラリの名前空間にアクセスします。
PDF 配信を最適化するには、静的ファイルを提供するように Program.cs を構成し、ルーティングを設定します。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();
var app = builder.Build();
app.UseStaticFiles();
app.UseRouting();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();
var app = builder.Build();
app.UseStaticFiles();
app.UseRouting();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.Extensions.DependencyInjection
Dim builder = WebApplication.CreateBuilder(args)
builder.Services.AddControllersWithViews()
builder.Services.AddRazorPages()
Dim app = builder.Build()
app.UseStaticFiles()
app.UseRouting()
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}")
app.Run()
AddControllersWithViews() 登録により、API エンドポイントとビュー レンダリングの両方が有効になります。専用のコントローラー アクションを通じて PDF コンテンツを提供し、それをRazorビュー パネル内に表示する場合には、両方とも必要です。 完全な構成の詳細については、 IronPDF API ドキュメントを参照してください。
PDF ファイルをパネル内に直接表示するにはどうすればよいですか?
コア パターンは簡単です。コントローラー アクションは PDF を生成し、それをバイトに変換し、Content-Disposition ヘッダーを inline に設定し、File 結果を返します。 Razorビューの <iframe> はそのエンドポイントを指します。
完全なコントローラーの実装は次のとおりです。
[ApiController]
[Route("api/[controller]")]
public class PdfPanelController : ControllerBase
{
[HttpGet("display/{documentId}")]
public IActionResult DisplayPdfInPanel(string documentId)
{
var renderer = new ChromePdfRenderer();
string filename = $"document_{documentId}.pdf";
var htmlContent = $@"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; margin: 40px; }}
h1 {{ color: #333; }}
.content {{ line-height: 1.6; }}
</style>
</head>
<body>
<h1>Document #{documentId}</h1>
<div class='content'>
<p>This PDF is generated dynamically and displayed inline in your panel.</p>
<p>Generated at: {DateTime.Now:yyyy-MM-dd HH:mm:ss}</p>
</div>
</body>
</html>";
using var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
byte[] pdfBytes = pdfDocument.BinaryData;
Response.Headers.Append("Content-Disposition", $"inline; filename={filename}");
return File(pdfBytes, "application/pdf");
}
}
[ApiController]
[Route("api/[controller]")]
public class PdfPanelController : ControllerBase
{
[HttpGet("display/{documentId}")]
public IActionResult DisplayPdfInPanel(string documentId)
{
var renderer = new ChromePdfRenderer();
string filename = $"document_{documentId}.pdf";
var htmlContent = $@"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; margin: 40px; }}
h1 {{ color: #333; }}
.content {{ line-height: 1.6; }}
</style>
</head>
<body>
<h1>Document #{documentId}</h1>
<div class='content'>
<p>This PDF is generated dynamically and displayed inline in your panel.</p>
<p>Generated at: {DateTime.Now:yyyy-MM-dd HH:mm:ss}</p>
</div>
</body>
</html>";
using var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
byte[] pdfBytes = pdfDocument.BinaryData;
Response.Headers.Append("Content-Disposition", $"inline; filename={filename}");
return File(pdfBytes, "application/pdf");
}
}
Imports Microsoft.AspNetCore.Mvc
Imports System
<ApiController>
<Route("api/[controller]")>
Public Class PdfPanelController
Inherits ControllerBase
<HttpGet("display/{documentId}")>
Public Function DisplayPdfInPanel(documentId As String) As IActionResult
Dim renderer = New ChromePdfRenderer()
Dim filename As String = $"document_{documentId}.pdf"
Dim htmlContent As String = $"
<html>
<head>
<style>
body {{ font-family: Arial, sans-serif; margin: 40px; }}
h1 {{ color: #333; }}
.content {{ line-height: 1.6; }}
</style>
</head>
<body>
<h1>Document #{documentId}</h1>
<div class='content'>
<p>This PDF is generated dynamically and displayed inline in your panel.</p>
<p>Generated at: {DateTime.Now:yyyy-MM-dd HH:mm:ss}</p>
</div>
</body>
</html>"
Using pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
Dim pdfBytes As Byte() = pdfDocument.BinaryData
Response.Headers.Append("Content-Disposition", $"inline; filename={filename}")
Return File(pdfBytes, "application/pdf")
End Using
End Function
End Class
ChromePdfRenderer クラスは、サーバー側レンダリングの主要なエントリ ポイントです。 HTML コンテンツを受け入れ、ヘッドレス Chrome ブラウザを使用して変換し、PdfDocument オブジェクトを返します。 BinaryData プロパティは、ストリーミング用の生のバイトを公開します。
Content-Disposition を inline に設定することは、パネル表示にとって重要なステップです。 これがないと、ブラウザは <iframe> 内でレンダリングするのではなく、ダウンロードを要求します。 また、すべてのページにヘッダーとフッターを追加したり、RenderingOptions を使用してページの向きやカスタム余白を制御したりすることもできます。
このエンドポイントをRazorパネルに埋め込むには、コントローラー ルートを指す <iframe> を作成します。
@page
@model IndexModel
<div class="container mt-4">
<div class="card">
<div class="card-header">
<h3>PDF Display Panel</h3>
</div>
<div class="card-body">
<div class="pdf-panel" style="height: 600px;">
<iframe src="/api/PdfPanel/display/12345"
width="100%"
height="100%"
frameborder="0">
</iframe>
</div>
</div>
</div>
</div>
@page
@model IndexModel
<div class="container mt-4">
<div class="card">
<div class="card-header">
<h3>PDF Display Panel</h3>
</div>
<div class="card-body">
<div class="pdf-panel" style="height: 600px;">
<iframe src="/api/PdfPanel/display/12345"
width="100%"
height="100%"
frameborder="0">
</iframe>
</div>
</div>
</div>
</div>
The provided code is a Razor page markup, which is not directly translatable to VB.NET as it is not C# code. Razor pages are used in ASP.NET Core for creating dynamic web pages and are written in a combination of HTML and C#.
If you need to convert the C# logic within a Razor page to VB.NET, you would typically focus on the code-behind file or any C# code embedded within the Razor markup. However, the provided snippet contains only HTML and Razor directives without any C# logic to convert.
If you have a specific C# code-behind logic or embedded C# code within a Razor page that you need to convert to VB.NET, please provide that portion, and I can assist with the conversion.
<iframe> はコントローラーのエンドポイントから PDF を要求します。 そこからブラウザの組み込み PDF ビューアが引き継ぎ、クライアント側のライブラリやプラグインを使用せずに、ドキュメントをパネル全体の幅と高さで表示します。
生成されたPDFはどのように見えますか?

AJAX を使用して PDF を動的に読み込むにはどうすればよいでしょうか?
静的な <iframe> ソースは固定コンテンツには適していますが、多くのアプリケーションでは、データ グリッド内のレコードのクリック、フォームの送信、レポート タイプの選択などのユーザー アクションに基づいて PDF を読み込む必要があります。 AJAX を活用したアプローチでは、ページ全体を再読み込みすることなくこれらのシナリオを処理します。
コントローラー アクションはリクエスト ボディを受け入れ、PDF を base64 文字列として返します。
[HttpPost("generate")]
public async Task<IActionResult> GenerateDynamicPdf([FromBody] PdfRequestModel request)
{
try
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var htmlBuilder = new StringBuilder();
htmlBuilder.Append("<html><body>");
htmlBuilder.Append($"<h2>{request.Title}</h2>");
htmlBuilder.Append($"<div>{request.Content}</div>");
if (request.IncludeData)
{
htmlBuilder.Append("<table border='1' style='width:100%;'>");
foreach (var item in request.DataItems)
{
htmlBuilder.Append($"<tr><td>{item.Key}</td><td>{item.Value}</td></tr>");
}
htmlBuilder.Append("</table>");
}
htmlBuilder.Append("</body></html>");
var pdfDocument = await Task.Run(() =>
renderer.RenderHtmlAsPdf(htmlBuilder.ToString()));
var base64Pdf = Convert.ToBase64String(pdfDocument.BinaryData);
return Ok(new { success = true, pdfData = base64Pdf });
}
catch (Exception ex)
{
return BadRequest(new { success = false, error = ex.Message });
}
}
[HttpPost("generate")]
public async Task<IActionResult> GenerateDynamicPdf([FromBody] PdfRequestModel request)
{
try
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var htmlBuilder = new StringBuilder();
htmlBuilder.Append("<html><body>");
htmlBuilder.Append($"<h2>{request.Title}</h2>");
htmlBuilder.Append($"<div>{request.Content}</div>");
if (request.IncludeData)
{
htmlBuilder.Append("<table border='1' style='width:100%;'>");
foreach (var item in request.DataItems)
{
htmlBuilder.Append($"<tr><td>{item.Key}</td><td>{item.Value}</td></tr>");
}
htmlBuilder.Append("</table>");
}
htmlBuilder.Append("</body></html>");
var pdfDocument = await Task.Run(() =>
renderer.RenderHtmlAsPdf(htmlBuilder.ToString()));
var base64Pdf = Convert.ToBase64String(pdfDocument.BinaryData);
return Ok(new { success = true, pdfData = base64Pdf });
}
catch (Exception ex)
{
return BadRequest(new { success = false, error = ex.Message });
}
}
Imports System.Text
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
<HttpPost("generate")>
Public Async Function GenerateDynamicPdf(<FromBody> request As PdfRequestModel) As Task(Of IActionResult)
Try
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 20
renderer.RenderingOptions.MarginRight = 20
Dim htmlBuilder = New StringBuilder()
htmlBuilder.Append("<html><body>")
htmlBuilder.Append($"<h2>{request.Title}</h2>")
htmlBuilder.Append($"<div>{request.Content}</div>")
If request.IncludeData Then
htmlBuilder.Append("<table border='1' style='width:100%;'>")
For Each item In request.DataItems
htmlBuilder.Append($"<tr><td>{item.Key}</td><td>{item.Value}</td></tr>")
Next
htmlBuilder.Append("</table>")
End If
htmlBuilder.Append("</body></html>")
Dim pdfDocument = Await Task.Run(Function() renderer.RenderHtmlAsPdf(htmlBuilder.ToString()))
Dim base64Pdf = Convert.ToBase64String(pdfDocument.BinaryData)
Return Ok(New With {Key .success = True, Key .pdfData = base64Pdf})
Catch ex As Exception
Return BadRequest(New With {Key .success = False, Key .error = ex.Message})
End Try
End Function
RenderingOptions ブロックを使用すると、レンダリング前に用紙サイズ、余白、 CSS メディア タイプを設定できます。 Microsoft のASP.NET Coreドキュメントによると、非同期パターンは負荷がかかった状態でも応答性の高いインターフェイスを維持するために不可欠です。 同期レンダリング呼び出しを Task.Run でラップすると、Chrome エンジンが HTML を処理している間、リクエスト スレッドが解放された状態になります。
base64 応答により、 JavaScriptクライアントはページをリロードせずに <iframe> ソースを直接更新できます。
fetch('/api/PdfPanel/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(requestData)
})
.then(response => response.json())
.then(result => {
if (result.success) {
const iframe = document.getElementById('pdf-frame');
iframe.src = 'data:application/pdf;base64,' + result.pdfData;
}
});
fetch('/api/PdfPanel/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(requestData)
})
.then(response => response.json())
.then(result => {
if (result.success) {
const iframe = document.getElementById('pdf-frame');
iframe.src = 'data:application/pdf;base64,' + result.pdfData;
}
});
このパターンは、 Razor Pagesと MVC ビューの両方でうまく機能します。高度なユースケースでは、 IronPDF はネイティブで非同期レンダリングもサポートしているため、Task.Run の代わりに RenderHtmlAsPdfAsync を直接使用できます。
さまざまな PDF ソース タイプをどのように処理しますか?
IronPDF は、HTML 文字列、ローカル HTML ファイル、外部 URL という 3 つの主要ソースから PDF を生成できます。 それぞれ異なるシナリオに適しています。
HTML テンプレートを PDF に変換するにはどうすればよいでしょうか?
テンプレートベースの生成は、エンタープライズASP.NETアプリケーションで最も一般的なパターンです。 プレースホルダー トークンを使用して HTML テンプレートを維持し、実行時にデータを挿入して、結果をレンダリングします。
[HttpGet("from-html")]
public IActionResult GenerateFromHtmlString(string reportType)
{
var renderer = new ChromePdfRenderer();
var htmlTemplate = GetHtmlTemplate(reportType);
var userName = User?.Identity?.Name ?? "Unknown";
var processedHtml = htmlTemplate
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd"))
.Replace("{{USER}}", userName)
.Replace("{{REPORT_TYPE}}", reportType);
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
using var pdf = renderer.RenderHtmlAsPdf(processedHtml);
pdf.SaveAs(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", $"{reportType}.pdf"));
return File(pdf.BinaryData, "application/pdf");
}
private string GetHtmlTemplate(string reportType)
{
return @"
<html>
<head><title>{{REPORT_TYPE}} Report</title></head>
<body>
<h1>{{REPORT_TYPE}} Report</h1>
<p>Date: {{DATE}}</p>
<p>User: {{USER}}</p>
<div>Report content goes here.</div>
</body>
</html>";
}
[HttpGet("from-html")]
public IActionResult GenerateFromHtmlString(string reportType)
{
var renderer = new ChromePdfRenderer();
var htmlTemplate = GetHtmlTemplate(reportType);
var userName = User?.Identity?.Name ?? "Unknown";
var processedHtml = htmlTemplate
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd"))
.Replace("{{USER}}", userName)
.Replace("{{REPORT_TYPE}}", reportType);
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
using var pdf = renderer.RenderHtmlAsPdf(processedHtml);
pdf.SaveAs(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", $"{reportType}.pdf"));
return File(pdf.BinaryData, "application/pdf");
}
private string GetHtmlTemplate(string reportType)
{
return @"
<html>
<head><title>{{REPORT_TYPE}} Report</title></head>
<body>
<h1>{{REPORT_TYPE}} Report</h1>
<p>Date: {{DATE}}</p>
<p>User: {{USER}}</p>
<div>Report content goes here.</div>
</body>
</html>";
}
Imports System
Imports Microsoft.AspNetCore.Mvc
Imports IronPdf
Imports System.IO
<HttpGet("from-html")>
Public Function GenerateFromHtmlString(reportType As String) As IActionResult
Dim renderer As New ChromePdfRenderer()
Dim htmlTemplate As String = GetHtmlTemplate(reportType)
Dim userName As String = If(User?.Identity?.Name, "Unknown")
Dim processedHtml As String = htmlTemplate _
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd")) _
.Replace("{{USER}}", userName) _
.Replace("{{REPORT_TYPE}}", reportType)
renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
Using pdf = renderer.RenderHtmlAsPdf(processedHtml)
pdf.SaveAs(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", $"{reportType}.pdf"))
Return File(pdf.BinaryData, "application/pdf")
End Using
End Function
Private Function GetHtmlTemplate(reportType As String) As String
Return "
<html>
<head><title>{{REPORT_TYPE}} Report</title></head>
<body>
<h1>{{REPORT_TYPE}} Report</h1>
<p>Date: {{DATE}}</p>
<p>User: {{USER}}</p>
<div>Report content goes here.</div>
</body>
</html>"
End Function
CssMediaType.Print は、PDF で印刷固有の CSS ルールが使用されるようにします。これにより、通常、ナビゲーション バー、サイドバー、およびその他の画面のみの要素が削除されます。 これにより、HTML テンプレートが Web ビューと PDF 生成間で共有されるときに、よりクリーンな出力が生成されます。 ブランド化のためにカスタムの透かしや背景画像を適用することもできます。 複雑なレイアウトの場合、改ページコントロールを使用すると、新しいページがどこから始まるかを正確に指定できます。
HTML テンプレートの PDF 出力はどのようになりますか?

外部 URL から PDF を生成するにはどうすればよいでしょうか?
競合他社の分析、規制関連の提出書類、サードパーティのサービスからのコンテンツなど、外部の Web ページをキャプチャする場合、 IronPDF は公開されている URL をレンダリングできます。
[HttpGet("from-url")]
public async Task<IActionResult> GenerateFromUrl(string encodedUrl)
{
var url = HttpUtility.UrlDecode(encodedUrl);
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.ViewPortWidth = 1920;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(2000);
using var pdf = await renderer.RenderUrlAsPdfAsync(url);
Response.Headers.Append("Content-Disposition", "inline; filename=webpage.pdf");
return File(pdf.BinaryData, "application/pdf");
}
[HttpGet("from-url")]
public async Task<IActionResult> GenerateFromUrl(string encodedUrl)
{
var url = HttpUtility.UrlDecode(encodedUrl);
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.ViewPortWidth = 1920;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(2000);
using var pdf = await renderer.RenderUrlAsPdfAsync(url);
Response.Headers.Append("Content-Disposition", "inline; filename=webpage.pdf");
return File(pdf.BinaryData, "application/pdf");
}
Imports System.Web
Imports Microsoft.AspNetCore.Mvc
<HttpGet("from-url")>
Public Async Function GenerateFromUrl(encodedUrl As String) As Task(Of IActionResult)
Dim url = HttpUtility.UrlDecode(encodedUrl)
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.ViewPortWidth = 1920
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.WaitFor.RenderDelay(2000)
Using pdf = Await renderer.RenderUrlAsPdfAsync(url)
Response.Headers.Append("Content-Disposition", "inline; filename=webpage.pdf")
Return File(pdf.BinaryData, "application/pdf")
End Using
End Function
ViewPortWidth 設定は、PDF に変換する前にヘッドレス ブラウザーがページをレンダリングする幅を決定します。 1920 ピクセルのビューポートは、デスクトップ解像度で最新のレスポンシブ レイアウトをキャプチャします。 レンダリング遅延により、スクリーンショットが撮られる前に、JavaScript を多用するシングルページ アプリケーションに初期化を完了する時間が与えられます。
より高度なキャプチャ シナリオの場合、 IronPDF はJavaScript実行制御、認証されたページへのCookie の受け渡し、ビューポートのズーム調整をサポートします。
メモリとパフォーマンスをどのように管理しますか?
PDF生成はリソースを大量に消費します。ChromePdfRenderer を呼び出すたびにヘッドレス Chrome プロセスが作成され、各 PdfDocument オブジェクトはレンダリングされたバイトをメモリに保持します。 適切な廃棄により、リソースのリークを防ぎ、負荷がかかった状態でもメモリ消費を予測可能に保つことができます。
常に using ステートメントを PdfDocument と一緒に使用してください。
public IActionResult OptimizedPdfGeneration()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = false;
var processedHtml = GetHtmlTemplate("report")
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd"))
.Replace("{{USER}}", "Test")
.Replace("{{REPORT_TYPE}}", "Report");
using var pdf = renderer.RenderHtmlAsPdf(processedHtml);
byte[] pdfBytes = pdf.BinaryData;
pdf.SaveAs("output.pdf");
return File(pdfBytes, "application/pdf");
}
public IActionResult OptimizedPdfGeneration()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CreatePdfFormsFromHtml = false;
var processedHtml = GetHtmlTemplate("report")
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd"))
.Replace("{{USER}}", "Test")
.Replace("{{REPORT_TYPE}}", "Report");
using var pdf = renderer.RenderHtmlAsPdf(processedHtml);
byte[] pdfBytes = pdf.BinaryData;
pdf.SaveAs("output.pdf");
return File(pdfBytes, "application/pdf");
}
Imports System
Imports Microsoft.AspNetCore.Mvc
Public Class PdfController
Inherits Controller
Public Function OptimizedPdfGeneration() As IActionResult
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.CreatePdfFormsFromHtml = False
Dim processedHtml = GetHtmlTemplate("report") _
.Replace("{{DATE}}", DateTime.Now.ToString("yyyy-MM-dd")) _
.Replace("{{USER}}", "Test") _
.Replace("{{REPORT_TYPE}}", "Report")
Using pdf = renderer.RenderHtmlAsPdf(processedHtml)
Dim pdfBytes As Byte() = pdf.BinaryData
pdf.SaveAs("output.pdf")
Return File(pdfBytes, "application/pdf")
End Using
End Function
Private Function GetHtmlTemplate(templateName As String) As String
' Placeholder for the actual implementation
Return String.Empty
End Function
End Class
using ステートメントは、下流で例外が発生した場合でも、バイト配列を抽出した直後に PdfDocument オブジェクトが破棄されることを保証します。 PDF を頻繁に生成するアプリケーションの場合は、次の追加戦略を検討してください。
-キャッシュ: 頻繁に要求される PDF をメモリ キャッシュまたはディスクに保存します。 ドキュメント識別子とタイムスタンプをキーとするバイト配列をキャッシュするには、IMemoryCache を使用します。
-ストリーミング: 非常に大きなドキュメントの場合、大きな連続したメモリ ブロックの割り当てを回避するために、バイト配列ではなくPDF メモリ ストリームを使用します。
-線形化:線形化された (高速 Web ビュー) 出力を有効にして、ファイル全体がダウンロードされる前にブラウザーがレンダリングを開始できるようにします。
-圧縮: 制約のあるネットワーク接続を介してドキュメントを提供するときに、 PDF 圧縮を適用してファイル サイズを縮小します。
IronPDFパフォーマンス ガイドでは、高スループット シナリオ向けの追加の最適化戦略について説明します。
最適化された PDF 出力では何が生成されますか?

セキュリティとブラウザ間の互換性をどのように確保しますか?
PDF パネル ディスプレイを本番環境に導入する前に、セキュリティと信頼性の両方に注意を払う必要があります。
入力検証: 動的コンテンツを HTML テンプレートに挿入する前に、必ずサニタイズします。 Chrome エンジンを通じてレンダリングされたサニタイズされていないユーザー入力により、サーバーが SSRF 攻撃や XSS 攻撃にさらされる可能性があります。 確立された HTML エンコーディング ライブラリを使用するか、受け入れられる文字を安全な許可リストに制限します。
アクセス制御:認証および承認ミドルウェアの背後で PDF エンドポイントを保護します。 呼び出し元の ID を確認せずにドキュメントを返す /api/PdfPanel/display/12345 のような URL は、データ漏洩のリスクがあります。 [Authorize] 属性を適用し、認証されたユーザーが要求されたドキュメント ID にアクセスする権限を持っていることを確認します。
MIME タイプの構成: コンテンツ タイプとして常に application/pdf を返します。 ブラウザが誤ったMIMEタイプを受信すると、ダウンロードダイアログが表示されたり、インラインレンダリングが拒否されたりすることがあります。wwwrootから静的PDFファイルも提供している場合は、アプリケーションのMIMEタイプマッピングにPDFが含まれていることを確認してください。
クロスブラウザのインライン表示: 最新のブラウザ (Chrome、Firefox、Edge、Safari) はすべて、Content-Disposition: inline ヘッダーを通じてインライン PDF 表示をサポートしています。 W3C コンテンツ セキュリティ ポリシー仕様では、パネルに異なるオリジンの PDF を埋め込む場合の frame-ancestors ディレクティブに関するガイダンスが提供されています。 IronPDF のサーバー側レンダリングでは、PDF 生成がクライアントとは独立して行われるため、ほとんどのブラウザ レンダリングの不整合が解消されます。
エラー処理: PDF 生成を try-catch ブロックでラップし、意味のある HTTP ステータス コードを返します。 本文のない 500 応答は診断が困難です。 構造化されたエラー オブジェクトを返すので、クライアント側のコードでは壊れた <iframe> ではなく、ユーザーフレンドリなメッセージを表示できます。
ドキュメントのセキュリティについては、 IronPDF はパスワード保護と権限、デジタル署名、およびアーカイブ要件に対するPDF/A 準拠をサポートしています。

次のステップは何ですか?
これで、 ASP.NETパネルに PDF を表示するための実用的なパターンができました。IronPDFをインストールし、PDF を生成して Content-Disposition: inline でそれを返すコントローラー アクションを作成し、エンドポイントをRazorパネル内の <iframe> に埋め込みます。 そこから、AJAX パターンを使用すると、ページを再読み込みせずに、ユーザーのアクションに応じてドキュメントを動的に読み込むことができます。
これらのパターンを独自のプロジェクトでテストするには、 IronPDFの無料トライアルを開始してください。クレジットカードは必要ありません。 試用版には、HTML から PDF へのレンダリング、URL キャプチャ、高度な PDF 操作など、すべての機能へのフルアクセスが含まれています。
基本的な表示が機能したら、次のような自然な拡張を検討してください。
- ドキュメントアセンブリワークフローのためにPDFファイルを結合または分割します
- HTMLフォームから入力可能なPDFフォームを作成する
- ドキュメント認証用のデジタル署名を追加する -既存のPDFを編集して、コンテンツにスタンプ、注釈、または編集を加える
- 複雑なレポートレイアウトのための完全な CSS とJavaScriptサポートを使用してHTML を PDF に変換します
IronPDF のドキュメントでは、完全なコード例と構成リファレンスとともに、これらの各機能について詳細に説明しています。
よくある質問
ASP.NETパネルでPDFを表示する目的は何ですか?
ASP.NETパネルでPDFを表示することで、開発者はPDFドキュメントをWebアプリケーションに直接統合することができ、ドキュメント管理、レポート表示、請求書表示のためのシームレスなユーザーエクスペリエンスを作成することができます。
IronPDFはASP.NETでPDFを表示する際にどのように役立ちますか?
IronPDFは、開発者がASP.NETパネル内でPDFドキュメントを簡単にレンダリング、表示できるツールを提供し、スムーズな統合とまとまりのあるユーザーインターフェイスを保証します。
ASP.NETアプリケーションでPDFを表示するためにIronPDFを使う利点は何ですか?
IronPDFを使用することで、簡単にPDFを統合し、開発時間を短縮し、UIコントロール内に高品質のPDFレンダリングを提供することでASP.NETアプリケーションの機能を強化することができます。
IronPDF はASP.NETでドキュメント管理システムを構築するために使用できますか?
IronPDFはASP.NETパネル内でのシームレスなPDF表示をサポートし、ウェブ上で直接ドキュメントを管理・閲覧する機能を強化するため、ドキュメント管理システムの構築に最適です。
IronPDFはPDF表示用のASP.NET Coreと互換性がありますか?
IronPDFはASP.NET Coreと完全に互換性があり、開発者はパネルコントロールを使用してPDFドキュメントをWebアプリケーション内に表示することができます。


