Blazorで新しいタブにPDFを開く方法
BlazorでPDFを新しいタブで開く方法
Blazor Server アプリケーションから新しいブラウザー タブで PDF を開くには、サーバー側での PDF 生成にIronPDFを使用し、クライアント側でのウィンドウ管理にはJavaScript相互運用性を組み合わせて、境界を越えた通信の課題を解決します。
ブラウザーの新しいタブでPDFドキュメントを開くことは、Blazor webアプリケーションでよくある要件です。 このチュートリアルでは、 IronPDFを使用して PDF を生成し、 JavaScript相互運用性を使用して新しいタブに表示し、ユーザーにシームレスなドキュメント表示エクスペリエンスを提供する方法を説明します。 この例では、Blazor Serverバージョンに焦点を当てています。
Blazorプロジェクトに必要な前提条件は何ですか?
まず、Visual Studio 2022で新しいBlazor Serverプロジェクトを作成します。NuGetパッケージマネージャーコンソールを介してIronPDFをインストールします。
Install-Package IronPdf
すべての機能を有効にするには、Program.cs でIronPDFライセンスを設定します。
License.LicenseKey = "YOUR-LICENSE-KEY";
License.LicenseKey = "YOUR-LICENSE-KEY";
License.LicenseKey = "YOUR-LICENSE-KEY"
すべての機能のロックを解除するには、ライセンス キーを適用する必要があります。 IronPDF はBlazor Server アプリケーションとシームレスに連携し、最新の Web アプリケーションに強力なPDF 生成機能を提供します。 IronPDFを初めて使用する場合は、クイックスタート ガイドを参照して基本を理解してください。
Blazor が新しいタブで PDF を直接開けないのはなぜですか?
Blazor Serverアプリケーションはサーバー上のC#コードから直接ブラウザーのタブを操作できません。 Blazorから新しいタブで PDF を開くには、サーバー側の PDF 生成とクライアント側のウィンドウ管理を橋渡しするJavaScript相互運用 (JS 相互運用) が必要です。
IronPDF を使用すると、開発者はサーバー上で高品質の PDF ドキュメントを生成し、JavaScript の window.open() 機能を使用して表示できるようになります。 このアプローチは、 .NETアプリケーションにおける一般的なクライアント サーバー境界の問題を解決します。 ライブラリのChrome レンダリング エンジンにより、ドキュメントの視覚的な整合性を維持しながら、ピクセル単位で完璧な HTML から PDF への変換が保証されます。
BlazorとIronPDFを使用する場合、PDF 生成はサーバー側で行われるのに対し、 JavaScript の実行はクライアント側で行われるということを理解することが重要です。 この分離により、ウィンドウ管理タスクにJavaScript相互運用機能を使用する必要があります。
Blazor Web アプリにJavaScript関数を実装するにはどうすればよいですか?
新しいブラウザ タブでの PDF 表示を処理するには、こ for JavaScriptコードを _Host.cshtml ファイルに追加します。 このモジュールは、クライアント側のウィンドウ操作を管理します。
<script>
window.openPdfInNewTab = function (pdfData, fileName) {
// Convert base64 to blob
const byteCharacters = atob(pdfData);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
// The type is 'application/pdf', not 'image/png' or 'image/jpg'
const blob = new Blob([byteArray], { type: 'application/pdf' });
// Create URL and open in new tab
const blobUrl = URL.createObjectURL(blob);
const newWindow = window.open(blobUrl, '_blank');
if (newWindow) {
newWindow.document.title = fileName || 'PDF Document';
}
// Clean up
setTimeout(() => URL.revokeObjectURL(blobUrl), 100);
return newWindow !== null;
};
</script>
<script>
window.openPdfInNewTab = function (pdfData, fileName) {
// Convert base64 to blob
const byteCharacters = atob(pdfData);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
// The type is 'application/pdf', not 'image/png' or 'image/jpg'
const blob = new Blob([byteArray], { type: 'application/pdf' });
// Create URL and open in new tab
const blobUrl = URL.createObjectURL(blob);
const newWindow = window.open(blobUrl, '_blank');
if (newWindow) {
newWindow.document.title = fileName || 'PDF Document';
}
// Clean up
setTimeout(() => URL.revokeObjectURL(blobUrl), 100);
return newWindow !== null;
};
</script>
window.openPdfInNewTab JavaScript関数は、サーバーから新しいタブを開くために不可欠です。 Blazorサーバーから PDF データを Base64 文字列として受け入れ、クライアント側のコードによってバイナリ Blob オブジェクトに変換されます。 このアプローチはPDF を Base64 に変換するのと似ていますが、逆であり、ブラウザーで PDF コンテンツを表示できるようになります。
この BLOB は、一時的な URL を作成するために使用され、最終的に window.open(blobUrl, '_blank') に渡されて、ブラウザーが PDF を新しいタブで開くように強制します。 BLOB URL テクニックは、サーバー側のファイル ストレージを必要とせずにメモリから PDF を読み込むときによく使用されます。
強化されたセキュリティを必要とするアプリケーションの場合は、ドキュメントをクライアントに送信する前に、 PDF の権限とパスワードを実装することを検討してください。 ドキュメントの信頼性を確保するためにデジタル署名を調べることもできます。
Blazorコンポーネントを作成するにはどうすればよいですか?
PDFを生成し、新しいタブで開くRazorコンポーネントを新しく作成します。 これはソリューションのメインテンプレートとして機能します:
@page "/pdf-viewer"
@using IronPdf
@inject IJSRuntime JS
<h3>Open PDF in New Tab</h3>
<div class="mb-3">
<label>Enter URL:</label>
<input @bind="targetUrl" class="form-control" />
</div>
<button class="btn btn-primary" @onclick="GenerateAndOpenPdf"
disabled="@isProcessing">
@if (isProcessing)
{
<span>Generating PDF...</span>
}
else
{
<span>Generate and Open PDF</span>
}
</button>
@if (!string.IsNullOrEmpty(errorMessage))
{
<div class="alert alert-danger mt-3">@errorMessage</div>
}
@code {
private string targetUrl = "___PROTECTED_URL_69___";
private bool isProcessing = false;
private string errorMessage = "";
private async Task GenerateAndOpenPdf()
{
isProcessing = true;
errorMessage = "";
try
{
// Configure Chrome PDF renderer. Note the rendering details
var renderer = new ChromePdfRenderer
{
RenderingOptions = new ChromePdfRenderOptions
{
MarginTop = 10,
MarginBottom = 10,
MarginLeft = 10,
MarginRight = 10,
EnableJavaScript = true,
RenderDelay = 500
}
};
// Generate PDF from URL
var pdfDocument = await Task.Run(() =>
renderer.RenderUrlAsPdf(targetUrl));
// Convert to base64
byte[] pdfBytes = pdfDocument.BinaryData;
string base64Pdf = Convert.ToBase64String(pdfBytes);
// Open in new tab via JS interop
bool success = await JS.InvokeAsync<bool>("openPdfInNewTab",
base64Pdf, $"Document_{DateTime.Now:yyyyMMdd_HHmmss}.pdf");
if (!success)
{
// Giving the user an understandable error is key
errorMessage = "Pop-up blocked. Please allow pop-ups for this site.";
}
}
catch (Exception ex)
{
errorMessage = $"Error: {ex.Message}";
}
finally
{
isProcessing = false;
}
}
}
このコードブロックはメインのインタラクティブページを定義します。 Razorマークアップは、URL入力フィールドとボタンを持つ簡単なユーザーインターフェイスを作成します。 C# の @code ブロックはロジックを処理します。ボタンがクリックされると、ChromePdfRenderer インスタンスを使用して、ユーザーが指定した URL から PDF を生成します。 レンダリング オプションを使用すると、余白をカスタマイズしたり、 JavaScriptレンダリングを有効にしたり、動的コンテンツのレンダリング遅延を設定したりできます。
次に、結果の PDF バイト配列を Base64 文字列に変換し、@inject IJSRuntime JS を使用してJavaScript関数を呼び出し、ユーザー向けにドキュメントを開きます。 このパターンは、Web アプリケーションでURL を PDF に変換するときに特に便利です。 より複雑なシナリオでは、パフォーマンスを向上させるために非同期 PDF 生成を実装する必要がある場合があります。
PDF 生成アクティビティを追跡し、問題をトラブルシューティングするには、カスタム ログを実装することを検討してください。 透かしやヘッダー、フッターを追加して PDF を強化することもできます。
UI はどのように見えますか?
<img src="/static-assets/pdf/blog/blazor-open-pdf-new-tab/blazor-open-pdf-new-tab-1.webp" alt=""https:// IronPDF.com"が事前に入力された URL 入力フィールドと、新しいタブで PDF を開くための"PDF を生成して開く"ボタンを備えたシンプルな Web フォーム">
PDF は新しいタブにどのように表示されますか?

動的 HTML コンテンツを操作するにはどうすればよいですか?
URL ではなく動的コンテンツから PDF を生成するには、RenderHtmlAsPdf を使用するようにアプローチを変更します。
private async Task GenerateFromHtml()
{
// Define CSS styles inside the HTML string for structure and appearance.
string htmlContent = $@"
<!DOCTYPE html>
<html>
<head>
<style>
body {{ font-family: Arial; padding: 20px; }}
h1 {{ color: #2c3e50; }}
table {{ border-collapse: collapse; width: 100%; }}
th, td {{ border: 1px solid #ddd; padding: 8px; }}
</style>
</head>
<body>
<h1>{documentTitle}</h1>
<p>{documentContent}</p>
<table>
<tr>
<th>Item</th>
<th>Value</th>
</tr>
<tr>
<td>Generated</td>
<td>{DateTime.Now}</td>
</tr>
</table>
</body>
</html>";
var renderer = new ChromePdfRenderer();
var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
byte[] pdfBytes = pdfDocument.BinaryData;
await JS.InvokeVoidAsync("openPdfInNewTab",
Convert.ToBase64String(pdfBytes), "dynamic.pdf");
}
private async Task GenerateFromHtml()
{
// Define CSS styles inside the HTML string for structure and appearance.
string htmlContent = $@"
<!DOCTYPE html>
<html>
<head>
<style>
body {{ font-family: Arial; padding: 20px; }}
h1 {{ color: #2c3e50; }}
table {{ border-collapse: collapse; width: 100%; }}
th, td {{ border: 1px solid #ddd; padding: 8px; }}
</style>
</head>
<body>
<h1>{documentTitle}</h1>
<p>{documentContent}</p>
<table>
<tr>
<th>Item</th>
<th>Value</th>
</tr>
<tr>
<td>Generated</td>
<td>{DateTime.Now}</td>
</tr>
</table>
</body>
</html>";
var renderer = new ChromePdfRenderer();
var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
byte[] pdfBytes = pdfDocument.BinaryData;
await JS.InvokeVoidAsync("openPdfInNewTab",
Convert.ToBase64String(pdfBytes), "dynamic.pdf");
}
Private Async Function GenerateFromHtml() As Task
' Define CSS styles inside the HTML string for structure and appearance.
Dim htmlContent As String = $"
<!DOCTYPE html>
<html>
<head>
<style>
body {{ font-family: Arial; padding: 20px; }}
h1 {{ color: #2c3e50; }}
table {{ border-collapse: collapse; width: 100%; }}
th, td {{ border: 1px solid #ddd; padding: 8px; }}
</style>
</head>
<body>
<h1>{documentTitle}</h1>
<p>{documentContent}</p>
<table>
<tr>
<th>Item</th>
<th>Value</th>
</tr>
<tr>
<td>Generated</td>
<td>{DateTime.Now}</td>
</tr>
</table>
</body>
</html>"
Dim renderer = New ChromePdfRenderer()
Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
Dim pdfBytes As Byte() = pdfDocument.BinaryData
Await JS.InvokeVoidAsync("openPdfInNewTab", Convert.ToBase64String(pdfBytes), "dynamic.pdf")
End Function
GenerateFromHtml メソッドは、 IronPDF が既存の URL ではなく動的に生成された HTML マークアップから PDF を生成する方法を示しています。 それは、見出し、コンテンツ、および動的データを含む完全なHTML文字列を構築します。 RenderHtmlAsPdfメソッドは変換をシームレスに処理します。 このアプローチは、データベースまたは API からの動的なデータを使用してPDF レポートを作成するのに最適です。
カスタム フォント、レスポンシブ CSS 、さらにはDataURI を使用した埋め込み画像を使用して、HTML コンテンツを強化できます。 複雑なレイアウトの場合は、一貫したレンダリングを確保するために、 Bootstrap と Flexbox の使用を検討してください。
国際言語を扱う場合、 IronPDFは優れたUnicodeサポートを提供し、異なる言語やスクリプト間での文字の適切なレンダリングを保証します。また、改ページを制御したり、特殊なドキュメント要件に合わせてカスタム用紙サイズを実装したりすることも可能です。
更新された UI はどのように見えますか?

ダイナミック PDF はどのように表示されますか?

どのような一般的な問題に対処すべきでしょうか?
ブラウザ間の互換性がなぜ重要なのか?
異なるブラウザーはBlob URLを異なる方法で処理します。 実装がChrome、Firefox、Edge、Safariで一貫した動作をすることをテストしてください。 一部のブラウザでは、ポップアップの処理やセキュリティ制限に関して特定の要件がある場合があります。 デフォルトでポップアップをブロックするブラウザにフォールバック メカニズムを実装することを検討してください。
Azure デプロイメントを扱うときに、 502 Bad Gateway エラーやその他のホスティング固有の問題が発生する可能性があります。 常にターゲット環境で PDF 生成をテストし、適切なエラー処理を実装してください。
大きな PDF ファイルをどのように処理すればよいですか?
大きなPDFドキュメントの場合、パフォーマンスを向上させるためにサーバー側のキャッシングを実装することを検討してください:
services.AddMemoryCache();
// Cache generated PDFs to avoid regeneration
private readonly IMemoryCache _cache;
public async Task<byte[]> GetCachedPdf(string cacheKey)
{
if (!_cache.TryGetValue(cacheKey, out byte[] pdfBytes))
{
// Generate PDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("___PROTECTED_URL_70___");
pdfBytes = pdf.BinaryData;
// Cache for 10 minutes
_cache.Set(cacheKey, pdfBytes, TimeSpan.FromMinutes(10));
}
return pdfBytes;
}
services.AddMemoryCache();
// Cache generated PDFs to avoid regeneration
private readonly IMemoryCache _cache;
public async Task<byte[]> GetCachedPdf(string cacheKey)
{
if (!_cache.TryGetValue(cacheKey, out byte[] pdfBytes))
{
// Generate PDF
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("___PROTECTED_URL_70___");
pdfBytes = pdf.BinaryData;
// Cache for 10 minutes
_cache.Set(cacheKey, pdfBytes, TimeSpan.FromMinutes(10));
}
return pdfBytes;
}
Imports System
Imports System.Threading.Tasks
Imports Microsoft.Extensions.Caching.Memory
' Cache generated PDFs to avoid regeneration
Private ReadOnly _cache As IMemoryCache
Public Async Function GetCachedPdf(cacheKey As String) As Task(Of Byte())
Dim pdfBytes As Byte() = Nothing
If Not _cache.TryGetValue(cacheKey, pdfBytes) Then
' Generate PDF
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("___PROTECTED_URL_70___")
pdfBytes = pdf.BinaryData
' Cache for 10 minutes
_cache.Set(cacheKey, pdfBytes, TimeSpan.FromMinutes(10))
End If
Return pdfBytes
End Function
大きなファイルで最適なパフォーマンスを得るには、 PDF 圧縮技術と線形化による高速 Web 表示を検討してください。 バッチ処理シナリオでの並列 PDF 生成を検討することもできます。
どのようなナビゲーションの代替手段を使用できますか?
JavaScript相互運用性に加えて、静的ファイル ミドルウェアを通じて PDF を提供し、代替ナビゲーションに標準の HTML アンカー タグを使用することもできます。
<a href="/pdfs/document.pdf" target="_blank">Open PDF</a>
<a href="/pdfs/document.pdf" target="_blank">Open PDF</a>
このアプローチは事前に生成されたPDFにはうまく機能しますが、JSインターオップメソッドの動的生成機能を欠いています。 より高度なシナリオでは、専用のPDF 表示コンポーネントを実装するか、 MemoryStreamを使用してディスクに保存せずに PDF を提供することを検討してください。
スケーラビリティを向上させるために、 PDF を Azure Blob Storage などのクラウド ストレージに保存することも検討してください。 オフライン アクセスが必要なアプリケーションの場合は、新しいタブ機能とともにPDF ダウンロード機能を実装することを検討してください。
どのようなベストプラクティスに従うべきでしょうか?
1.エラー処理: PDF 生成を、意味のあるエラー メッセージを含む try-catch ブロックで囲みます。 カスタム エラー ログを使用して問題を追跡します。
2.パフォーマンス: UI のブロックを防ぐために async/await を使用します。 JavaScript を多用するページにレンダリング遅延を実装します。 最初のレンダリングを高速化するために、エンジンを事前にウォームアップします。
3.ユーザー エクスペリエンス:読み込みインジケーターを表示し、ポップアップ ブロッカーを適切に処理します。 複数ページの PDFの進行状況を追跡します。 ネットワークの問題に関する明確なフィードバックを提供します。
- DOM 操作:サーバー側の C# はクライアントの DOM を直接操作できないことに注意してください。 複雑なやり取りにはJavaScriptメッセージ リスナーを使用します。
5.セキュリティ: PDF を生成する前にすべてのユーザー入力を検証します。 必要に応じて、 PDF サニタイズ、デジタル署名、暗号化を適用します。 安全な送信のために HTTPS を使用します。
6.リソース管理: PDF ドキュメントを適切に破棄し、メモリ リークを防止します。 最適化されたコンテナ化されたデプロイメントのためにパッケージ サイズを監視します。
結論
IronPDF の強力な PDF 生成機能と Blazor for JavaScript相互運用性を組み合わせることで、新しいブラウザ タブで PDF を開くための強力なソリューションが提供されます。 このアプローチにより、開発者は最新のBlazorアプリケーションとシームレスに統合される、動的でプロフェッショナルな PDF ドキュメントを作成できます。 HTML を PDF に変換する場合、フォームを作成する場合、複雑なドキュメントを整理する場合など、 IronPDF はエンタープライズ グレードの PDF 処理に必要なツールを提供します。
BlazorプロジェクトでPDF機能を実装する準備はできましたか? 無料のIronPDFトライアルを今日開始してください。 トライアルには透かしのないフル機能と成功を確実にするための包括的なサポートが含まれています。 実稼働環境への展開については、 Windows 、 Linux 、 Azureなどのさまざまなプラットフォームのライセンス オプションと展開ガイドをご覧ください。
よくある質問
Blazorを使用して新しいタブでPDFを開くにはどうすればよいですか?
Blazorでは、IronPDFを使用してPDFを生成し、JavaScriptインターロップを使用して新しいブラウザタブに表示することで、新しいタブにPDFを開くことができます。
BlazorアプリケーションにおけるIronPDFの役割は何ですか?
IronPDFはBlazorアプリケーションでPDFドキュメントを生成するために使用され、開発者がアプリケーション内でPDFをプログラムで作成および操作できます。
BlazorでPDFを開くためにJavaScriptインターロップが使用される理由は何ですか?
JavaScriptインターロップは、ブラウザ機能(新しいタブを開くなど)とやり取りするためにBlazorで使用され、IronPDFによって生成されたPDFをユーザーフレンドリーな方法で表示するために必要です。
Blazor ServerアプリケーションでPDFビューイングを実装できますか?
はい、IronPDFでPDFを生成し、JavaScriptインターロップで新しいタブを開くことで、BlazorサーバーアプリケーションでPDFビューイングを実装できます。
BlazorアプリでPDFを新しいタブで開くメリットは何ですか?
新しいタブにPDFを開くことは、現在のページから離れずにドキュメントを表示できるため、ユーザーエクスペリエンスを向上させ、アプリケーションの状態を保持します。
BlazorでIronPDFを使用してPDFの出力をカスタマイズすることは可能ですか?
はい、IronPDFを使用すると、BlazorアプリケーションでPDFの出力をカスタマイズできます。ヘッダーやフッターを設定したり、特定のデザイン要件を満たすためのスタイルを適用できます。
PDFを開くためのチュートリアルで使用されるBlazorのバージョンは?
このチュートリアルは、IronPDFとJavaScriptインターロップを使用して新しいタブにPDFを開く方法を示すためにBlazorサーバーバージョンに焦点を当てています。
IronPDFの使用がBlazorにおける文書処理をどのように改善しますか?
BlazorでIronPDFを使用すると、強力なPDF生成と操作の機能が提供され、アプリケーションから直接プロフェッショナル品質のPDFを簡単に作成できます。


