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

ASP.NETでのサーバー側 PDF レンダリングはどのように機能しますか?
IronPDFは、PDF のレンダリングをヘッドレス Chrome エンジンを使用して完全にサーバーに移します。コントローラーが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を検索してインストールします。 または、パッケージ マネージャー コンソールで次のコマンドを実行します。
.NET CLIを使用してdotnet add package IronPdfを行うこともできます。 インストールが完了したら、ライブラリの名前空間にアクセスするため、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();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 ヘッダーを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");
}
}
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>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 });
}
}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 FunctionRenderingOptionsブロックは、レンダリング前に用紙サイズ、マージン、および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;
}
});
このパターンはRazor PagesとMVCビューの両方に適しています。高度なユースケースの場合、IronPDFは非同期レンダリングもサポートしているため、Task.Runの代わりに直接使用できます。
さまざまな 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>";
}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 FunctionCssMediaType.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");
}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 FunctionViewPortWidth設定は、PDFに変換する前にヘッドレスブラウザがページをどのくらいの広さでレンダリングするかを決定します。 1920 ピクセルのビューポートは、デスクトップ解像度で最新のレスポンシブ レイアウトをキャプチャします。 レンダリング遅延により、スクリーンショットが撮られる前に、JavaScript を多用するシングルページ アプリケーションに初期化を完了する時間が与えられます。
より高度なキャプチャ シナリオの場合、 IronPDF はJavaScript実行制御、認証されたページへのCookie の受け渡し、ビューポートのズーム調整をサポートします。
メモリとパフォーマンスをどのように管理しますか?
PDFの生成はリソースを大量に消費します。PdfDocumentオブジェクトはメモリにレンダリングされたバイトを保持します。 適切な廃棄により、リソースのリークを防ぎ、負荷がかかった状態でもメモリ消費を予測可能に保つことができます。
常に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");
}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 ClassPdfDocumentオブジェクトが直ちに破棄されることを保証します。 PDF を頻繁に生成するアプリケーションの場合は、次の追加戦略を検討してください。
-キャッシュ: 頻繁に要求される PDF をメモリ キャッシュまたはディスクに保存します。 IMemoryCacheを使用して、ドキュメント識別子とタイムスタンプをキーとしてバイト配列をキャッシュします。
-ストリーミング: 非常に大きなドキュメントの場合、大きな連続したメモリ ブロックの割り当てを回避するために、バイト配列ではなくPDF メモリ ストリームを使用します。
-線形化:線形化された (高速 Web ビュー) 出力を有効にして、ファイル全体がダウンロードされる前にブラウザーがレンダリングを開始できるようにします。
-圧縮: 制約のあるネットワーク接続を介してドキュメントを提供するときに、 PDF 圧縮を適用してファイル サイズを縮小します。
IronPDFパフォーマンス ガイドでは、高スループット シナリオ向けの追加の最適化戦略について説明します。
最適化された PDF 出力では何が生成されますか?
セキュリティとブラウザ間の互換性をどのように確保しますか?
PDF パネル ディスプレイを本番環境に導入する前に、セキュリティと信頼性の両方に注意を払う必要があります。
入力検証: 動的コンテンツを HTML テンプレートに挿入する前に、必ずサニタイズします。 Chrome エンジンを通じてレンダリングされたサニタイズされていないユーザー入力により、サーバーが SSRF 攻撃や XSS 攻撃にさらされる可能性があります。 確立された HTML エンコーディング ライブラリを使用するか、受け入れられる文字を安全な許可リストに制限します。
アクセス制御:認証および承認ミドルウェアの背後で PDF エンドポイントを保護します。 呼び出し側の身元を確認せずにドキュメントを返す/api/PdfPanel/display/12345のようなURLは、データ露出のリスクがあります。 [Authorize]属性を適用し、認証されたユーザーが要求されたドキュメントIDにアクセスする権限があることを確認してください。
MIME タイプの構成: 常にapplication/pdfをコンテンツタイプとして返します。 不正なMIMEタイプを受信したブラウザはダイアログをトリガーするか、インラインでのレンダリングを拒否する可能性があります。静的PDFファイルをwwwrootからも提供している場合は、アプリケーションの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を生成し<iframe>にエンドポイントを埋め込みます。 そこから、AJAX パターンを使用すると、ページを再読み込みせずに、ユーザーのアクションに応じてドキュメントを動的に読み込むことができます。
これらのパターンを独自のプロジェクトでテストするには、 IronPDFの無料トライアルを開始してください。クレジットカードは必要ありません。 試用版には、HTML から PDF へのレンダリング、URL キャプチャ、高度な PDF 操作など、すべての機能へのフルアクセスが含まれています。
基本的な表示が機能したら、次のような自然な拡張を検討してください。
- ドキュメントアセンブリワークフローのためにPDFファイルを結合または分割します
- HTMLフォームから入力可能なPDFフォームを作成する
- ドキュメント認証用のデジタル署名を追加する -既存のPDFを編集して、コンテンツにスタンプ、注釈、または編集を加える
- 複雑なレポートレイアウトのための完全な CSS とJavaScriptサポートを使用してHTML を PDF に変換します
IronPDF のドキュメントでは、完全なコード例と構成リファレンスとともに、これらの各機能について詳細に説明しています。

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


