跳過到頁腳內容
使用IRONPDF

如何在 Blazor 中在新標籤中打開 PDF

在新的瀏覽器標籤頁中開啟 PDF 文件是 Blazor Web 應用程式的常見需求。 本教學課程示範如何使用IronPDF產生 PDF 文件,並使用 JavaScript 互通在新分頁中顯示它們,從而為使用者提供無縫的文件檢視體驗。 本範例以 Blazor Server 版本為例。

前提條件和設置

首先在 Visual Studio 2022 中建立一個新的 Blazor Server 專案。透過 NuGet 套件管理器控制台安裝 IronPDF:

Install-Package IronPdf

Program.cs中設定您的 IronPDF 授權以啟用全部功能:

License.LicenseKey = "YOUR-LICENSE-KEY";
License.LicenseKey = "YOUR-LICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

理解挑戰

Blazor Server 應用程式無法透過伺服器上的 C# 程式碼直接操作瀏覽器標籤頁。 Blazor 在新分頁中開啟 PDF 的任務需要 JavaScript 互通(JS 互通)來連接伺服器端 PDF 產生和用戶端視窗管理。

IronPDF使開發人員能夠在伺服器上產生高品質的 PDF 文檔,然後可以使用 JavaScript 的window.open()功能顯示這些文檔。 這種方法意味著解決 .NET 應用程式中常見的客戶端-伺服器問題。

在 Blazor Web 應用程式中實作 JavaScript 函數

將此 JavaScript 程式碼新增至您的_Host.cshtml檔案中,以處理在新瀏覽器標籤頁中顯示 PDF 檔案。 這是負責客戶端視窗管理的模組:

<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>
HTML

window.openPdfInNewTab JavaScript 函數對於解決從伺服器開啟新標籤頁的難題至關重要。 它從 Blazor 伺服器接收 Base64 字串形式的 PDF 數據,客戶端程式碼將其轉換為二進位Blob物件。

然後使用此 blob 建立一個臨時 URL,最後將其傳遞給window.open(blobUrl, &#39;_blank&#39;)以強制瀏覽器在新標籤頁中開啟 PDF。

建立 Blazor 組件

建立一個新的 Razor 元件,用於產生 PDF 檔案並在新分頁中開啟它們。 這是解決方案的主要範本:

@page "/pdf-viewer"
@using IronPdf
@inject IJSRuntime JS
<h3>Open PDF in New Tab</h3>
<div class="mb-3">
    <label>Enter URL:</label>
</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 = "https://ironpdf.com";
    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。

然後,它將產生的 PDF 位元組陣列轉換為 Base64 字串,並使用@inject IJSRuntime JS呼叫 JavaScript 函數,從而為使用者開啟文件。

使用者介面輸出

如何在 Blazor 中於新標籤頁開啟 PDF 檔案:圖 1 - 基本 UI 範例

輸出結果以 PDF 格式在新分頁中開啟。

如何在 Blazor 中以新分頁形式開啟 PDF 檔案:圖 2 - 第一個 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; }}
            </style>
        </head>
        <body>
            <h1>{documentTitle}</h1>
            <p>{documentContent}</p>
            <div>Generated: {DateTime.Now}</div>
        </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; }}
            </style>
        </head>
        <body>
            <h1>{documentTitle}</h1>
            <p>{documentContent}</p>
            <div>Generated: {DateTime.Now}</div>
        </body>
        </html>";
    var renderer = new ChromePdfRenderer();
    var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
    byte[] pdfBytes = pdfDocument.BinaryData;
    await JS.InvokeVoidAsync("openPdfInNewTab", 
        Convert.ToBase64String(pdfBytes), "dynamic.pdf");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

GenerateFromHtml方法示範了IronPDF如何從動態產生的 HTML 標籤而不是現有 URL 產生 PDF。 它會建立一個完整的 HTML 字串,其中包含標題、內容和動態資料。 動態內容產生的解決方案是RenderHtmlAsPdf方法。

Blazor 伺服器使用者介面已更新

如何在 Blazor 中在新分頁中開啟 PDF:圖 3 - 伺服器專案的更新範例 UI

PDF檔案在新瀏覽器標籤頁中開啟

如何在 Blazor 中在新分頁中開啟 PDF:圖 4 - 建立並在新分頁中開啟的動態 PDF 範例

處理常見問題

跨瀏覽器相容性

不同的瀏覽器對 blob URL 的處理方式不同。 在 Chrome、Firefox、Edge 和 Safari 瀏覽器上測試您的實現,以確保行為一致。

大文件

對於大型PDF文檔,可以考慮實施伺服器端快取來提高效能:

services.AddMemoryCache();
// Cache generated PDFs to avoid regeneration
services.AddMemoryCache();
// Cache generated PDFs to avoid regeneration
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

導航替代方案

除了 JavaScript 互通之外,您還可以透過靜態文件中間件提供 PDF 文件,並使用標準的 HTML 錨點標籤作為另一種導覽方式:

<a href="/pdfs/document.pdf" target="_blank">Open PDF</a>
<a href="/pdfs/document.pdf" target="_blank">Open PDF</a>
HTML

這種方法對於預先產生的 PDF 檔案效果很好,但缺乏 JS 互通方法的動態產生功能。

最佳實務

1.錯誤處理:始終將 PDF 產生程式碼封裝在try-catch區塊中,並在出現問題時向使用者提供有意義的錯誤訊息。

2.效能:使用async/await模式防止在 PDF 產生期間 UI 阻塞。

3.使用者體驗:在生成過程中顯示載入指示器,並優雅地處理彈出視窗攔截器場景。

  1. DOM 操作:請記住,伺服器端的 C# 不能直接操作客戶端的 DOM; 這就是為什麼JS互通性至關重要。 您無需手動設定新視窗的高度或寬度,因為瀏覽器會自動處理 PDF 檢視器。

5.安全性:在產生 PDF 之前驗證並清理使用者輸入。

結論

IronPDF強大的 PDF 生成功能與 Blazor 的 JavaScript 互通性相結合,為在新瀏覽器標籤頁中開啟 PDF 提供了一個強大的解決方案。 這種方法使開發人員能夠創建動態、專業的 PDF 文檔,並與基於 Microsoft .NET 技術構建的現代 Blazor 應用程式無縫整合。

準備在 Blazor 專案中實現 PDF 功能嗎? 立即開始您的IronPDF 免費試用。 試用版包含所有功能,無浮水印,並提供全面的支持,確保您成功。

常見問題解答

如何使用 Blazor 在新標籤中開啟 PDF?

您可以在 Blazor 的新標籤頁面中開啟 PDF,方法是使用 IronPDF 來產生 PDF,並透過 JavaScript interop 將 PDF 顯示在新的瀏覽器標籤頁面中。

IronPDF 在 Blazor 應用程式中扮演什麼角色?

IronPDF 用於 Blazor 應用程式中產生 PDF 文件,讓開發人員可以在應用程式中以程式化的方式建立和處理 PDF。

為何Blazor使用JavaScript互動來開啟PDF?

在 Blazor 中,JavaScript interop 用於與瀏覽器功能互動,例如開啟新的標籤頁,這對於以人性化的方式顯示 IronPDF 所產生的 PDF 是必要的。

我可以在Blazor伺服器應用程式中實作PDF檢視嗎?

是的,您可以在 Blazor Server 應用程式中實現 PDF 檢視,方法是使用 IronPDF 來產生 PDF,並使用 JavaScript interop 來在新標籤中打開 PDF,以獲得無縫的使用者體驗。

在 Blazor 應用程式中以新標籤開啟 PDF 有什麼好處?

在新索引標籤中開啟 PDF 可增強使用者體驗,讓使用者不需從目前頁面導航即可檢視文件,並保持應用程式狀態不變。

是否可以在 Blazor 中使用 IronPDF 自訂 PDF 輸出?

是的,IronPDF 允許您在 Blazor 應用程式中自訂 PDF 輸出,包括設定頁眉、頁腳,以及套用樣式以符合特定的設計需求。

打開 PDF 的教學中使用的是哪個版本的 Blazor?

本教學著重於 Blazor 伺服器版本,以示範如何使用 IronPDF 與 JavaScript interop 在新標籤頁中開啟 PDF。

使用 IronPDF 如何改善 Blazor 中的文件處理?

在 Blazor 中使用 IronPDF 可提供強大的 PDF 生成和處理功能,從而改善文件處理,讓您可以輕鬆地直接從應用程式中創建專業品質的 PDF。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。