跳過到頁腳內容
使用IRONPDF

在 Windows Forms PictureBox 中渲染 PDF 頁面 | C# 指南

在 Windows Forms 應用程式中顯示 PDF 頁面是文件管理工具、報表檢視器和文件預覽實用程式的常見需求。 PictureBox 控制項是理想的選擇,因為它已經處理表單中的影像渲染。 問題在於 PDF 文件不是圖像——它們需要經過專門的渲染才能被任何標準圖像控制項顯示。 本指南將逐步介紹如何使用 IronPDF 將 PDF 頁面轉換為點陣圖影像,並在 PictureBox 控制項中顯示它們,以及頁面導覽、列印和儲存支援。

!{--01001100010010010100001001010010010000010101001001011001010111110100011101000101010101 01000101111101010011010101000100000101010010010101000100010101000100010111110101011101001000110 1010101000100100001011111010100000101001001001111010001000101010101010000110101010100101010101011 10101010001010010010010010010000010100110001011111010000100100110001001111101000011010010111111010000110100101110--

為什麼 PictureBox 不能直接顯示 PDF 檔?

Windows Forms 中的PictureBox 控制項專為影像格式而設計:BMP、PNG、JPG、GIF、TIFF 以及其他一些格式。 當您嘗試將 PDF 檔案路徑指派給 PictureBox.ImageLocation 或將 PDF 流載入至 PictureBox.Image 時,控制項會拋出異常,因為 PDF 二進位格式不是可辨識的影像格式。

有些方法試圖透過 COM 互通嵌入 Adob​​e Acrobat 來規避這個問題。但這會造成對執行應用程式的每台機器都必須安裝 Adob​​e Reader 的硬依賴——這種部署限制在企業環境中難以管理。 它還會將渲染引擎鎖定為使用者所安裝的 Acrobat 版本,這可能會導致不同機器之間的相容性問題。

更簡潔的方法是使用 .NET PDF 庫,該庫在運行時將PDF頁面轉換為點陣圖影像。 IronPDF 透過其 ToBitmap 方法提供了此功能,該方法將 PDF 文件的每一頁渲染成一個 AnyBitmap 物件。 然後您可以將該物件轉換為標準的 System.Drawing.Bitmap 並將其直接指派給 PictureBox.Image。 無需安裝 Adob​​e 產品,無需進行 COM 註冊,也無需在應用程式視窗中嵌入外部檢視器。

此技術適用於.NET Framework 4.6.2 及更高版本,以及 Windows 上的.NET 6、8 和 10。 IronPDF內部的渲染引擎是基於 Chrome,這意味著即使對於具有複雜佈局、嵌入式字體和混合圖像/文字內容的 PDF,它也能產生高保真輸出。

如何在 Windows Forms 專案中安裝IronPDF ?

在編寫任何程式碼之前,您需要將IronPDF新增到您的專案中。 最快的方法是透過NuGet套件管理器 CLI:

dotnet add package IronPdf
dotnet add package IronPdf
SHELL

或者,使用 Visual Studio 套件管理器控制台:

Install-Package IronPdf
Install-Package IronPdf
SHELL

安裝完成後,請確認套件引用出現在您的 .csproj 檔案中。 IronPDF 的目標平台是 Windows,支援 .NET 6 及更高版本。因此,如果您在專案檔案中使用跨平台目標,請為 Windows 新增 <RuntimeIdentifiers><Platforms> 限制。 對於 Windows Forms 項目,在 Visual Studio 中建立專案範本時,通常已經配置好了。

對於生產環境中的許可,請將您的許可證密鑰放在應用程式啟動程式碼中,且位於所有IronPDF調用之前:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

在開發和評估過程中, IronPDF以試用模式運行,這會在渲染輸出中加入浮水印。 免費試用許可證會移除浮水印,用於測試目的。

如何設定 Windows Forms 專案結構?

開啟 Visual Studio 並建立一個面向 .NET 10 的新 Windows 窗體應用程式專案。項目範本產生一個 Form1.cs 和一個 Program.cs 入口點。

在設計器介面中,將以下控制項新增至表單:

  • 一個名為 PictureBoxpictureBoxPdf 覆蓋了表單的大部分區域,其中 SizeMode 設定為 Zoom
  • 一個名為 ButtonbtnOpen,文字為"開啟 PDF"
  • 一個名為 Button 的名稱,文字為"上一頁"
  • 一個名為 Button 的名稱 btnNext,文字為"下一個"
  • 一個名為 ButtonbtnSave,文字為"儲存頁面"
  • 一個名為 ButtonbtnPrint,文本為"打印"
  • 一個名為 LabellblPageInfo,用於顯示目前頁碼

SizeMode = Zoom 設定 PictureBox 可確保 PDF 頁面按比例縮放以適應控件,而不會扭曲縱橫比。 這一點很重要,因為 PDF 頁面的大小各不相同——信紙、A4 和法律格式的尺寸都不同,您希望檢視器能夠優雅地處理所有這些尺寸。

以下是 PDF 檢視器應用程式的完整表單代碼。 這使用了 Program.cs 中的頂級語句,並將完整的檢視器邏輯放在 Form1.cs 中:

using IronPdf;
using IronSoftware.Drawing;
using System.Drawing;

public partial class Form1 : Form
{
    private PdfDocument? currentPdf;
    private AnyBitmap[]? pageImages;
    private int currentPageIndex = 0;

    public Form1()
    {
        InitializeComponent();
        pictureBoxPdf.SizeMode = PictureBoxSizeMode.Zoom;
        UpdateNavigationState();
    }

    private void UpdateNavigationState()
    {
        bool hasPdf = pageImages != null && pageImages.Length > 0;
        btnPrevious.Enabled = hasPdf && currentPageIndex > 0;
        btnNext.Enabled = hasPdf && currentPageIndex < (pageImages?.Length - 1 ?? 0);
        btnSave.Enabled = hasPdf;
        btnPrint.Enabled = hasPdf;
        lblPageInfo.Text = hasPdf
            ? $"Page {currentPageIndex + 1} of {pageImages!.Length}"
            : "No document loaded";
    }
}
using IronPdf;
using IronSoftware.Drawing;
using System.Drawing;

public partial class Form1 : Form
{
    private PdfDocument? currentPdf;
    private AnyBitmap[]? pageImages;
    private int currentPageIndex = 0;

    public Form1()
    {
        InitializeComponent();
        pictureBoxPdf.SizeMode = PictureBoxSizeMode.Zoom;
        UpdateNavigationState();
    }

    private void UpdateNavigationState()
    {
        bool hasPdf = pageImages != null && pageImages.Length > 0;
        btnPrevious.Enabled = hasPdf && currentPageIndex > 0;
        btnNext.Enabled = hasPdf && currentPageIndex < (pageImages?.Length - 1 ?? 0);
        btnSave.Enabled = hasPdf;
        btnPrint.Enabled = hasPdf;
        lblPageInfo.Text = hasPdf
            ? $"Page {currentPageIndex + 1} of {pageImages!.Length}"
            : "No document loaded";
    }
}
Imports IronPdf
Imports IronSoftware.Drawing
Imports System.Drawing

Public Partial Class Form1
    Inherits Form

    Private currentPdf As PdfDocument
    Private pageImages As AnyBitmap()
    Private currentPageIndex As Integer = 0

    Public Sub New()
        InitializeComponent()
        pictureBoxPdf.SizeMode = PictureBoxSizeMode.Zoom
        UpdateNavigationState()
    End Sub

    Private Sub UpdateNavigationState()
        Dim hasPdf As Boolean = pageImages IsNot Nothing AndAlso pageImages.Length > 0
        btnPrevious.Enabled = hasPdf AndAlso currentPageIndex > 0
        btnNext.Enabled = hasPdf AndAlso currentPageIndex < If(pageImages?.Length - 1, 0)
        btnSave.Enabled = hasPdf
        btnPrint.Enabled = hasPdf
        lblPageInfo.Text = If(hasPdf, $"Page {currentPageIndex + 1} of {pageImages.Length}", "No document loaded")
    End Sub
End Class
$vbLabelText   $csharpLabel

UpdateNavigationState 輔助方法會根據 PDF 是否已載入以及檢視器目前顯示的頁面來停用或啟用導覽和操作按鈕。 這樣可以防止使用者在載入文件之前點擊按鈕時出現空白引用錯誤。

! VB .NET 在 PictureBox 中顯示 PDF:在 Windows 表單中將 PDF 頁面渲染為圖像:圖 1 - 安裝 IronPDF

如何將 PDF 頁面載入並渲染到 PictureBox 中?

將 PDF 載入到 PictureBox 中並渲染到 PdfDocument.FromFile 中涉及兩個步驟:使用 ToBitmap 載入文檔,然後呼叫 ToBitmap 將所有頁面轉換為位元圖物件陣列。

PDF 轉影像轉換方法 ToBitmap 以請求的 DPI 渲染 PDF 中的每一頁。 更高的DPI可以產生更清晰的影像,但會佔用更多記憶體。 對於文件檢視器來說,150 DPI 通常是一個不錯的平衡點——既能在螢幕上清晰閱讀,又不會因為顯示大型文件而佔用大量記憶體。

private void btnOpen_Click(object sender, EventArgs e)
{
    using OpenFileDialog openDialog = new OpenFileDialog();
    openDialog.Filter = "PDF Files|*.pdf";
    openDialog.Title = "Select a PDF Document";

    if (openDialog.ShowDialog() == DialogResult.OK)
    {
        LoadPdfDocument(openDialog.FileName);
    }
}

private void LoadPdfDocument(string filePath)
{
    currentPdf?.Dispose();
    currentPdf = PdfDocument.FromFile(filePath);

    // Render all pages as bitmaps at 150 DPI
    pageImages = currentPdf.ToBitmap(150);
    currentPageIndex = 0;

    DisplayCurrentPage();
    UpdateNavigationState();
}

private void DisplayCurrentPage()
{
    if (pageImages == null || pageImages.Length == 0) return;

    // Convert AnyBitmap to System.Drawing.Bitmap for PictureBox
    System.Drawing.Bitmap bitmap = pageImages[currentPageIndex].ToImage<System.Drawing.Bitmap>();
    pictureBoxPdf.Image?.Dispose();
    pictureBoxPdf.Image = bitmap;

    UpdateNavigationState();
}
private void btnOpen_Click(object sender, EventArgs e)
{
    using OpenFileDialog openDialog = new OpenFileDialog();
    openDialog.Filter = "PDF Files|*.pdf";
    openDialog.Title = "Select a PDF Document";

    if (openDialog.ShowDialog() == DialogResult.OK)
    {
        LoadPdfDocument(openDialog.FileName);
    }
}

private void LoadPdfDocument(string filePath)
{
    currentPdf?.Dispose();
    currentPdf = PdfDocument.FromFile(filePath);

    // Render all pages as bitmaps at 150 DPI
    pageImages = currentPdf.ToBitmap(150);
    currentPageIndex = 0;

    DisplayCurrentPage();
    UpdateNavigationState();
}

private void DisplayCurrentPage()
{
    if (pageImages == null || pageImages.Length == 0) return;

    // Convert AnyBitmap to System.Drawing.Bitmap for PictureBox
    System.Drawing.Bitmap bitmap = pageImages[currentPageIndex].ToImage<System.Drawing.Bitmap>();
    pictureBoxPdf.Image?.Dispose();
    pictureBoxPdf.Image = bitmap;

    UpdateNavigationState();
}
Private Sub btnOpen_Click(sender As Object, e As EventArgs) Handles btnOpen.Click
    Using openDialog As New OpenFileDialog()
        openDialog.Filter = "PDF Files|*.pdf"
        openDialog.Title = "Select a PDF Document"

        If openDialog.ShowDialog() = DialogResult.OK Then
            LoadPdfDocument(openDialog.FileName)
        End If
    End Using
End Sub

Private Sub LoadPdfDocument(filePath As String)
    currentPdf?.Dispose()
    currentPdf = PdfDocument.FromFile(filePath)

    ' Render all pages as bitmaps at 150 DPI
    pageImages = currentPdf.ToBitmap(150)
    currentPageIndex = 0

    DisplayCurrentPage()
    UpdateNavigationState()
End Sub

Private Sub DisplayCurrentPage()
    If pageImages Is Nothing OrElse pageImages.Length = 0 Then Return

    ' Convert AnyBitmap to System.Drawing.Bitmap for PictureBox
    Dim bitmap As System.Drawing.Bitmap = pageImages(currentPageIndex).ToImage(Of System.Drawing.Bitmap)()
    pictureBoxPdf.Image?.Dispose()
    pictureBoxPdf.Image = bitmap

    UpdateNavigationState()
End Sub
$vbLabelText   $csharpLabel

PdfDocument.FromFile 方法將 PDF 從磁碟載入記憶體。 呼叫 ToBitmap 並帶有 DPI 參數,傳回一個 AnyBitmap 物件數組,每個物件對應一頁。 AnyBitmap 類型是 IronPDF 的與格式無關的位圖類,而 ToImage<System.Drawing.Bitmap>() 將其轉換為 System.Drawing.Bitmap 類型,這是 PictureBox.Image 所期望的。

請注意,在分配新物件之前,先前的 PictureBox.Image 已被釋放。 這很重要——每個 Bitmap 物件都持有未託管的 GDI+ 資源,未能釋放舊位圖會導致長時間運行的應用程式出現記憶體洩漏。

! VB .NET 在 PictureBox 中顯示 PDF:在 Windows 窗體中將 PDF 頁面渲染為圖像:圖 2 - 可供使用的空白 Windows 窗體範例

載入完成後,檢視器立即顯示第一頁。 lblPageInfo 標籤會更新以顯示目前頁碼和總頁數。

! VB .NET 在 PictureBox 中顯示 PDF:在 Windows 窗體中將 PDF 頁面渲染為圖像:圖 3 - 範例輸入 PDF 在我們的檢視器中顯示

如何在PDF頁面之間新增頁面導航?

只能顯示第一頁的 PDF 檢視器對於多頁文件來說並不實用。 導航按鈕允許使用者在已渲染的頁面數組中向前和向後移動:

private void btnPrevious_Click(object sender, EventArgs e)
{
    if (currentPageIndex > 0)
    {
        currentPageIndex--;
        DisplayCurrentPage();
    }
}

private void btnNext_Click(object sender, EventArgs e)
{
    if (pageImages != null && currentPageIndex < pageImages.Length - 1)
    {
        currentPageIndex++;
        DisplayCurrentPage();
    }
}
private void btnPrevious_Click(object sender, EventArgs e)
{
    if (currentPageIndex > 0)
    {
        currentPageIndex--;
        DisplayCurrentPage();
    }
}

private void btnNext_Click(object sender, EventArgs e)
{
    if (pageImages != null && currentPageIndex < pageImages.Length - 1)
    {
        currentPageIndex++;
        DisplayCurrentPage();
    }
}
Private Sub btnPrevious_Click(sender As Object, e As EventArgs)
    If currentPageIndex > 0 Then
        currentPageIndex -= 1
        DisplayCurrentPage()
    End If
End Sub

Private Sub btnNext_Click(sender As Object, e As EventArgs)
    If pageImages IsNot Nothing AndAlso currentPageIndex < pageImages.Length - 1 Then
        currentPageIndex += 1
        DisplayCurrentPage()
    End If
End Sub
$vbLabelText   $csharpLabel

每次點擊事件處理程序都會將 currentPageIndex 的值加一,並呼叫 DisplayCurrentPage,後者會將 PictureBox.Image 的值替換為對應的位圖。邊界檢查(currentPageIndex > 0currentPageIndex < pageImages.Length - 1)可以防止索引越界異常,但 UpdateNavigationState 也會在按鈕超出範圍時停用它們。

對於較大的文檔,您還可以考慮新增頁碼輸入字段,使用者可以在其中輸入特定的頁碼以直接跳到該頁,或在側邊新增可捲動的縮圖條。 pageImages 陣列已經包含所有已渲染的頁面,因此跳到任意頁面只需將 currentPageIndex 設定為目標索引並呼叫 DisplayCurrentPage 即可。

! VB .NET 在 PictureBox 中顯示 PDF:在 Windows 表單中將 PDF 頁面渲染為圖像:圖 4 - 使用我們的按鈕導航到第 2 頁

如何使用檢視器儲存和列印 PDF 頁面?

文件檢視器通常需要支援將目前頁面儲存為影像檔案以及將文件傳送到印表機這兩個功能。 IronPDF讓這兩件事都變得簡單易行。

將目前頁面另存為圖像文件

目前頁面已作為 System.Drawing.BitmapPictureBox.Image 中可用。 使用 Image.Save 儲存,格式根據使用者選擇的檔案副檔名推斷:

private void btnSave_Click(object sender, EventArgs e)
{
    if (pictureBoxPdf.Image == null) return;

    using SaveFileDialog saveDialog = new SaveFileDialog();
    saveDialog.Filter = "PNG Image|*.png|JPEG Image|*.jpg|TIFF Image|*.tif";
    saveDialog.Title = "Save Page As Image";
    saveDialog.FileName = $"page_{currentPageIndex + 1}";

    if (saveDialog.ShowDialog() == DialogResult.OK)
    {
        pictureBoxPdf.Image.Save(saveDialog.FileName);
    }
}
private void btnSave_Click(object sender, EventArgs e)
{
    if (pictureBoxPdf.Image == null) return;

    using SaveFileDialog saveDialog = new SaveFileDialog();
    saveDialog.Filter = "PNG Image|*.png|JPEG Image|*.jpg|TIFF Image|*.tif";
    saveDialog.Title = "Save Page As Image";
    saveDialog.FileName = $"page_{currentPageIndex + 1}";

    if (saveDialog.ShowDialog() == DialogResult.OK)
    {
        pictureBoxPdf.Image.Save(saveDialog.FileName);
    }
}
Private Sub btnSave_Click(sender As Object, e As EventArgs)
    If pictureBoxPdf.Image Is Nothing Then Return

    Using saveDialog As New SaveFileDialog()
        saveDialog.Filter = "PNG Image|*.png|JPEG Image|*.jpg|TIFF Image|*.tif"
        saveDialog.Title = "Save Page As Image"
        saveDialog.FileName = $"page_{currentPageIndex + 1}"

        If saveDialog.ShowDialog() = DialogResult.OK Then
            pictureBoxPdf.Image.Save(saveDialog.FileName)
        End If
    End Using
End Sub
$vbLabelText   $csharpLabel

列印PDF文檔

對於列印,請使用 IronPDF 的列印方法,該方法會將 PDF 直接傳送到 Windows 列印基礎架構——而不是渲染後的影像,而是實際的 PDF 內容。 與列印點陣圖相比,這種方式可以產生更清晰的輸出,因為印表機驅動程式接收的是向量 PDF 指令,而不是柵格化影像:

private void btnPrint_Click(object sender, EventArgs e)
{
    if (currentPdf == null) return;

    using PrintDialog printDialog = new PrintDialog();
    if (printDialog.ShowDialog() == DialogResult.OK)
    {
        currentPdf.Print();
    }
}
private void btnPrint_Click(object sender, EventArgs e)
{
    if (currentPdf == null) return;

    using PrintDialog printDialog = new PrintDialog();
    if (printDialog.ShowDialog() == DialogResult.OK)
    {
        currentPdf.Print();
    }
}
Private Sub btnPrint_Click(sender As Object, e As EventArgs)
    If currentPdf Is Nothing Then Return

    Using printDialog As New PrintDialog()
        If printDialog.ShowDialog() = DialogResult.OK Then
            currentPdf.Print()
        End If
    End Using
End Sub
$vbLabelText   $csharpLabel

PrintDialog 允許使用者在列印開始前選擇目標印表機並配置設定。 實際的列印作業由 IronPDF 的內部渲染引擎處理,該引擎與 Windows 列印後台處理程序整合。

! VB .NET 在 PictureBox 中顯示 PDF:在 Windows 窗體中將 PDF 頁面渲染為圖像:圖 5 - 列印按鈕工作範例

如何正確處理和處置記憶體?

PDF 文件和渲染的位圖會佔用大量內存,尤其是在 DPI 設定較高或文件較大時。 如果沒有妥善處置,長時間運行的檢視器應用程式會逐漸耗盡可用記憶體。

處置清單

此模式下正確處置的關鍵點如下:

  • 在載入新文件之前,請呼叫 currentPdf?.Dispose()PdfDocument 實作了 IDisposable 並持有非託管資源。
  • 在將新位圖分配給 PictureBox.Image 之前,請呼叫 pictureBoxPdf.Image?.Dispose()。 每個渲染後的頁面都是獨立的非託管 GDI+ 物件。
  • pageImages 陣列包含 AnyBitmap 物件。 當您離開頁面並且不再需要舊位圖時,對 DisposePictureBox.Image 呼叫會處理 System.Drawing.Bitmap 副本,但您可能還想在載入新文件時釋放數組中的 @@--CODE-27223--@@ 物件。

重寫 Form1.Dispose 以在表單關閉時進行清理:

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        currentPdf?.Dispose();
        pictureBoxPdf.Image?.Dispose();

        if (pageImages != null)
        {
            foreach (var bitmap in pageImages)
                bitmap.Dispose();
        }

        components?.Dispose();
    }
    base.Dispose(disposing);
}
protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        currentPdf?.Dispose();
        pictureBoxPdf.Image?.Dispose();

        if (pageImages != null)
        {
            foreach (var bitmap in pageImages)
                bitmap.Dispose();
        }

        components?.Dispose();
    }
    base.Dispose(disposing);
}
Protected Overrides Sub Dispose(disposing As Boolean)
    If disposing Then
        currentPdf?.Dispose()
        pictureBoxPdf.Image?.Dispose()

        If pageImages IsNot Nothing Then
            For Each bitmap In pageImages
                bitmap.Dispose()
            Next
        End If

        components?.Dispose()
    End If
    MyBase.Dispose(disposing)
End Sub
$vbLabelText   $csharpLabel

這種模式確保在表單關閉時釋放所有IronPDF和 GDI+ 資源,從而防止生產部署中出現記憶體洩漏。

如何只渲染可見頁面而不是所有頁面?

對於包含數十頁甚至數百頁的大型 PDF 文件,使用 ToBitmap 一次渲染所有頁面會非常緩慢且佔用大量記憶體。更有效率的做法是按需渲染使用者想要查看的頁面。

IronPDF 的RasterizeToImageFiles方法支援逐頁渲染,但對於記憶體使用,您也可以使用 PageCount 並一次渲染一個頁面:

private void DisplayPageLazy(int pageIndex)
{
    if (currentPdf == null) return;

    // Render only the requested page
    AnyBitmap[] singlePage = currentPdf.ToBitmap(150, pageIndex, pageIndex);

    System.Drawing.Bitmap bitmap = singlePage[0].ToImage<System.Drawing.Bitmap>();
    pictureBoxPdf.Image?.Dispose();
    pictureBoxPdf.Image = bitmap;

    singlePage[0].Dispose();

    lblPageInfo.Text = $"Page {pageIndex + 1} of {currentPdf.PageCount}";
    UpdateNavigationState();
}
private void DisplayPageLazy(int pageIndex)
{
    if (currentPdf == null) return;

    // Render only the requested page
    AnyBitmap[] singlePage = currentPdf.ToBitmap(150, pageIndex, pageIndex);

    System.Drawing.Bitmap bitmap = singlePage[0].ToImage<System.Drawing.Bitmap>();
    pictureBoxPdf.Image?.Dispose();
    pictureBoxPdf.Image = bitmap;

    singlePage[0].Dispose();

    lblPageInfo.Text = $"Page {pageIndex + 1} of {currentPdf.PageCount}";
    UpdateNavigationState();
}
Private Sub DisplayPageLazy(pageIndex As Integer)
    If currentPdf Is Nothing Then Return

    ' Render only the requested page
    Dim singlePage As AnyBitmap() = currentPdf.ToBitmap(150, pageIndex, pageIndex)

    Dim bitmap As System.Drawing.Bitmap = singlePage(0).ToImage(Of System.Drawing.Bitmap)()
    pictureBoxPdf.Image?.Dispose()
    pictureBoxPdf.Image = bitmap

    singlePage(0).Dispose()

    lblPageInfo.Text = $"Page {pageIndex + 1} of {currentPdf.PageCount}"
    UpdateNavigationState()
End Sub
$vbLabelText   $csharpLabel

ToBitmap(dpi, startPage, endPage) 重載渲染特定範圍的頁面。 透過為 startPageendPage 傳遞相同的索引,每次只渲染一個頁面。這雖然會犧牲每次導航的渲染時間,但可以降低峰值記憶體使用量,對於非常大的文件來說,這種做法是值得的。

有關 IronPDF 影像輸出功能的更多信息,請參閱PDF 轉圖像文件PDF 光柵化指南

一個實用的PDF檢視器也應該允許使用者放大內容和旋轉頁面。 對於縮放,動態調整傳遞給 ToBitmap 的 DPI -- 儲存一個 currentDpi 欄位(從 150 開始),在縮放按鈕點擊時將其增加或減少 50,然後使用更新後的 DPI 呼叫延遲頁面渲染器。 較高的 DPI 會產生較大的影像,PictureBoxZoom 模式下會縮放影像以適應控制項。 使用 Math.MinMath.Max 將 DPI 範圍限制在 72 到 400 DPI 之間,以避免低端輸出模糊或高端記憶體消耗過大。

有關更進階的渲染選項,包括從 PDF 中擷取文字以及影像渲染,請參閱PDF 文字擷取指南PDF 影像擷取文件

您還可以探索 IronPDF 對合併 PDF 文件添加浮水印旋轉 PDF 頁面添加註釋等功能的支持,這些功能在更高級的檢視器中也能實現。

如何為 Windows Forms 選擇合適的 PDF 渲染庫?

在為 Windows Forms 選擇 PDF 渲染庫時,有多種選擇。以下是一個簡單的比較,可幫助您評估各種選項:

Windows窗體應用程式的PDF渲染選項
選項 外部依賴 .NET 支援 商業許可 影像輸出
IronPDF 無(獨立式) .NET 4.6.2 -- .NET 10 是的(提供試用) 可配置DPI下的高保真度
Adobe Acrobat COM 已安裝 Adob​​e Reader/Acrobat 僅限 Windows .NET Framework Adobe 許可 取決於已安裝的版本
PDFium.NET PDFium 原生二進位檔案 .NET 5+ BSD(開源) 品質好,可手動調整DPI
GhostScript 封裝器 已安裝 GhostScript 任何方式(透過 CLI 或 COM) AGPL 或商業 畫質好,但渲染速度較慢

IronPDF 在 Windows Forms 用例中的主要優勢在於它是完全獨立的——無需在最終用戶的電腦上安裝任何外部軟體。 IronPDF 的許可頁面詳細介紹了定價和免費試用選項。 您可以在NuGet上找到該軟體包,以及下載統計資料和版本歷史記錄。 若要深入了解 PDF 規格如何定義頁面渲染,ISO 發布的ISO 32000-2 PDF 標準描述了IronPDF和其他渲染器必須實現的格式。

若要了解 IronPDF 除了影像渲染之外的其他功能,請參閱IronPDF文件主頁,其中涵蓋了 PDF 建立、HTML 到 PDF 的轉換、表單處理、數位簽章等等。

下一步計劃是什麼?

本教學中所示的模式—使用 ToBitmap 渲染,使用 PictureBox 顯示,使用基於索引的控制項導航—為您提供了一個功能齊全、無依賴項的 Windows Forms PDF 檢視器。 從這裡出發,根據您的應用程式需求,有幾個方向值得探索。

對於生產級檢視器,可以考慮使用延遲頁面渲染來有效處理大型文檔,在主檢視器旁邊新增可捲動縮圖面板,並顯示與 DPI 參數關聯的縮放控制項。 對於文件管理應用程式,將檢視器與 IronPDF 的文字擷取表單欄位讀取功能結合,以建立可搜尋的文件索引。

如果您的工作流程涉及在顯示 PDF 之前以程式設計方式產生 PDF, IronPDF也支援HTML 到 PDF 的轉換以及從頭開始建立 PDF ,因此同一個程式庫可以處理產生和檢視。

開始免費試用,取得用於開發的無浮水印許可證金鑰,或查看完整的 API 參考,以了解 PdfDocumentAnyBitmap 和支援的渲染類別中可用的所有方法。 IronPDF 範例庫還提供了可直接運行的程式碼範例,涵蓋了 C# 中的常見 PDF 任務。

常見問題解答

如何使用 C# 在 Windows Forms PictureBox 中顯示 PDF 檔案?

使用 IronPDF 的 ToBitmap 方法將 PDF 頁面渲染為 AnyBitmap 對象,將每個物件轉換為 System.Drawing.Bitmap,並將其指派給 PictureBox.Image。

IronPDF提供了哪些 C# 渲染 PDF 頁面的方法?

IronPDF提供 ToBitmap 方法,以可設定的 DPI 將 PDF 頁面渲染為 AnyBitmap 物件。呼叫 ToImage 方法。 () 用於轉換為 PictureBox 使用。

是否可以在 PictureBox 中瀏覽 PDF 頁面?

是的。將渲染後的頁面位圖儲存在一個陣列中,並遞增或遞減頁面索引變數。每次導覽點擊時,將對應的點陣圖賦值給 PictureBox.Image。

使用 IronPDF 在 Windows Forms 中顯示 PDF 有哪些優點?

IronPDF是一款完全獨立的軟體,無需安裝任何外部軟體。它支援可配置的 DPI 渲染、頁面導航、列印和文字擷取,且不依賴任何 Adob​​e Acrobat。

IronPDF 是否可以處理多頁 PDF,以便在 PictureBox 中顯示?

是的。 ToBitmap 函數會為每個頁面傳回一個 AnyBitmap 物件。您可以儲存該陣列並透過索引進行導航,或使用 ToBitmap(dpi, startPage, endPage) 重載函數來實現按需逐頁渲染。

Curtis Chau
技術作家

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

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

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我