フッターコンテンツにスキップ
IRONPDFの使用

Windows Forms PictureBoxでPDFページをレンダリング | C#ガイド

Windows フォーム アプリケーション内で PDF ページを表示することは、ドキュメント管理ツール、レポート ビューアー、およびファイル プレビュー ユーティリティの一般的な要件です。 PictureBox コントロールは、フォーム内の画像レンダリングを既に処理しているため、自然な候補です。 問題は、PDF ファイルが画像ではないことです。標準的な画像コントロールで表示するには、特殊なレンダリングが必要です。 このガイドでは、 IronPDFを使用して PDF ページをビットマップ画像に変換し、ページナビゲーション、印刷、保存のサポートとともに PictureBox コントロール内に表示する方法について説明します。

今IronPDFを始めましょう。
green arrow pointer

なぜ PictureBox は PDF ファイルを直接表示できないのですか?

Windows Forms のPictureBox コントロールは、BMP、PNG、JPG、GIF、TIFF、およびその他いくつかの画像フォーマット専用に設計されています。 PictureBox.ImageLocation に PDF ファイル パスを割り当てようとしたり、PictureBox.Image に PDF ストリームを読み込もうとすると、PDF バイナリ形式が認識される画像形式ではないため、コントロールは例外をスローします。

いくつかのアプローチでは、COM相互運用機能を介してAdobe Acrobatを埋め込むことでこの問題を回避しようと試みます。しかし、これはアプリケーションを実行するすべてのマシンにAdobe Readerがインストールされているという強い依存関係を生み出し、エンタープライズ環境では管理が困難な展開上の制約となります。 また、レンダリング エンジンはユーザーが使用している Acrobat のバージョンにロックされるため、異なるマシン間で互換性の問題が発生する可能性があります。

よりクリーンなアプローチは、実行時に PDF ページをビットマップ画像に変換する.NET PDF ライブラリを使用することです。IronPDF、PDF ドキュメントの各ページを AnyBitmap オブジェクトにレンダリングする ToBitmap メソッドを通じて、まさにこの機能を提供します。 その後、そのオブジェクトを標準の System.Drawing.Bitmap に変換し、それを PictureBox.Image に直接割り当てることができます。 Adobe のインストールは不要、COM の登録も不要、アプリケーション ウィンドウに埋め込まれた外部ビューアも不要です。

この手法は、 .NET Framework 4.6.2 以上、および Windows 上 for .NET 6、8、10 で機能します。 IronPDF内のレンダリング エンジンは Chrome ベースであるため、複雑なレイアウト、埋め込みフォント、画像とテキストの混在コンテンツを含む PDF でも忠実度の高い出力を生成します。

Windows フォーム プロジェクトにIronPDFをインストールするにはどうすればよいでしょうか?

コードを記述する前に、プロジェクトにIronPDFを追加する必要があります。 最も速い方法は、 NuGetパッケージ マネージャー CLI を使用することです。

dotnet add package IronPdf
dotnet add package IronPdf
SHELL

あるいは、Visual Studio パッケージ マネージャー コンソールを使用します。

Install-Package IronPdf
Install-Package IronPdf
SHELL

インストール後、パッケージ参照が .csproj ファイルに表示されていることを確認してください。IronPDFは.NET 6 以降の Windows を対象としているため、プロジェクト ファイルでクロス プラットフォーム ターゲットを使用している場合は、Windows 用の <RuntimeIdentifiers> または <Platforms> 制限を追加してください。 Windows フォーム プロジェクトの場合、これは通常、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 フォーム プロジェクト構造をどのように設定しますか?

Visual Studio を開き、 .NET 10 をターゲットとする新しい Windows Forms App プロジェクトを作成します。プロジェクト テンプレートは、Form1.csProgram.cs エントリ ポイントを生成します。

デザイナー画面で、次のコントロールをフォームに追加します。

  • PictureBox という名前の pictureBoxPdf がフォームの大部分を覆い、SizeModeZoom に設定されています。
  • Button という名前の btnOpen があり、テキストは"PDFを開く"です
  • Button という名前の btnPrevious があり、テキストは"Previous"です。
  • Button という名前の btnNext があり、テキストは"次へ"です
  • Button という名前の btnSave があり、テキストは"ページを保存"です
  • Button という名前の btnPrint というテキストを持つ A が "Print" という名前で作成されました
  • 現在のページ番号を表示するための Label という名前の lblPageInfo

PictureBoxSizeMode = Zoom 設定により、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 が読み込まれたかどうか、およびビューアが現在表示しているページに基づいて、ナビゲーション ボタンとアクション ボタンを無効または有効にします。 これにより、ユーザーがドキュメントを読み込む前にボタンをクリックしたときに null 参照エラーが発生するのを防ぎます。

VB .NETで PictureBox に PDF を表示する: Windows フォームで PDF ページを画像としてレンダリングする: 画像 1 - IronPDFをインストールする

PDF ページを PictureBox に読み込んでレンダリングするにはどうすればよいでしょうか?

PDF を読み込んで PictureBox にレンダリングするには、2 つの手順が必要です。まず、PdfDocument.FromFile を使用してドキュメントを読み込み、次に ToBitmap を呼び出してすべてのページをビットマップ オブジェクトの配列に変換します。

PDFから画像への変換方法ToBitmapは、PDFのすべてのページを要求されたDPIでレンダリングします。 DPI を高くすると画像は鮮明になりますが、メモリの消費量も多くなります。 通常、150 DPI の値はドキュメント ビューアーにとって適切なバランスであり、大きなドキュメントをギガバイト単位の RAM を必要とせずに画面上で読み取ることができます。

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 をメモリにロードします。 DPI パラメータを指定して ToBitmap を呼び出すと、ページごとに 1 つの AnyBitmap オブジェクトの配列が返されます。 AnyBitmap 型は IronPDF のフォーマット非依存のビットマップ クラスであり、ToImage<System.Drawing.Bitmap>() はそれを System.Drawing.Bitmap が期待する型に変換します。

以前の 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 を 1 ずつ調整し、DisplayCurrentPage を呼び出します。これにより、PictureBox.Image が対応するビットマップに置き換えられます。境界チェック (currentPageIndex > 0 および currentPageIndex < pageImages.Length - 1) により、インデックス範囲外例外は防止されますが、UpdateNavigationState は、範囲外になる場合にボタンを無効にします。

大きなドキュメントの場合は、ユーザーが特定のページ番号を入力してそのページに直接ジャンプできるページ番号入力フィールドを追加するか、サイドにスクロール可能なサムネイルストリップを追加することも検討してください。pageImages 配列には既にレンダリングされたすべてのページが含まれているため、任意のページにジャンプするには、currentPageIndex をターゲット インデックスに設定し、DisplayCurrentPage を呼び出すだけです。

VB .NETで PictureBox に PDF を表示する: Windows フォームで PDF ページを画像としてレンダリングする: 画像 4 - ボタンを使用して 2 ページ目へ移動する

ビューアから PDF ページを保存および印刷するにはどうすればよいですか?

ドキュメント ビューアは通常、現在のページを画像ファイルとして保存することと、ドキュメントをプリンターに送信することの両方をサポートする必要があります。 IronPDF を使用すると、どちらも簡単になります。

現在のページを画像ファイルとして保存する

現在のページは既に System.Drawing.Bitmap として PictureBox.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 のPrint メソッドを使用します。このメソッドは、レンダリングされた画像ではなく、実際の 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 を使用すると、印刷を開始する前に、ユーザーは対象のプリンターを選択し、設定を構成できます。 実際の印刷ジョブは、Windows 印刷スプーラーと統合された IronPDF の内部レンダリング エンジンによって処理されます。

VB .NETで PictureBox に PDF を表示する: Windows フォームで PDF ページを画像としてレンダリングする: 画像 5 - 印刷ボタンの動作例

メモリと廃棄を正しく処理するにはどうすればよいでしょうか?

PDF ドキュメントとレンダリングされたビットマップは、特に DPI 設定が高い場合やドキュメントが大きい場合に、大量のメモリを消費します。 適切に破棄しないと、長時間実行されるビューア アプリケーションは使用可能なメモリを徐々に使い果たしてしまいます。

廃棄チェックリスト

このパターンで正しく廃棄するための重要なポイントは次のとおりです。

  • 新しいドキュメントを読み込む前に、currentPdf?.Dispose() を呼び出してください。 PdfDocumentIDisposable を実装し、管理されていないリソースを保持します。
  • PictureBox.Image に新しいビットマップを割り当てる前に、pictureBoxPdf.Image?.Dispose() を呼び出してください。 レンダリングされた各ページは、個別のアンマネージ GDI+ オブジェクトです。
  • pageImages 配列には AnyBitmap オブジェクトが含まれています。 ページから移動して古いビットマップが不要になった場合、DisposePictureBox.Image 呼び出しによって System.Drawing.Bitmap コピーが処理されますが、新しいドキュメントを読み込むときに配列内の AnyBitmap オブジェクトを破棄したい場合もあるでしょう。

フォームが閉じられたときにクリーンアップを行うには、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を使用して一度に1ページずつレンダリングすることもできます。

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 の両方に同じインデックスを渡すことで、一度にレンダリングされるページは1つだけになります。これにより、ナビゲーションごとのレンダリング時間は長くなりますが、ピーク時のメモリ使用量を抑えることができます。これは、非常に大きなドキュメントの場合に有効な場合があります。

IronPDF の画像出力機能の詳細については、 PDF から画像へのドキュメントPDF ラスタライズ ガイドを参照してください。

実用的な PDF ビューアでは、ユーザーがコンテンツを拡大したり、ページを回転したりすることも可能である必要があります。 Zoomの場合、ToBitmap に渡される DPI を動的に調整します。currentDpi フィールド (150 から開始) を保存し、Zoomボタンがクリックされたときに 50 ずつ増減させ、更新された DPI を使用して遅延ページ レンダラーを呼び出します。 DPIが高いほど画像が大きくなり、PictureBox モードでは、コントロールに合わせて拡大縮小されます。 Math.MinMath.Max を使用して、72~400 DPI の範囲を制限し、低範囲での出力のぼやけや高範囲でのメモリの過剰消費を回避します。

画像のレンダリングと同時に PDF からテキストを抽出するなど、より高度なレンダリング オプションについては、 PDF テキスト抽出ガイドPDF 画像抽出ドキュメントを参照してください。

IronPDFのより高度なビューアでは、 PDF文書の結合透かしの追加PDFページの回転注釈の追加といった機能も利用できます。

Windows フォーム用の PDF レンダリング ライブラリをどのように選択すればよいでしょうか?

Windowsフォーム用のPDFレンダリングライブラリを選択する際には、いくつかの選択肢があります。以下に、選択肢を評価するのに役立つ簡単な比較を示します。

Windows フォーム アプリケーション用の PDF レンダリング オプション
オプション 外部依存 .NETサポート 商用ライセンス 画像出力
IronPDF なし(自己完結型) .NET 4.6.2 -- .NET 10 はい(試用版あり) 設定可能なDPIで高忠実度を実現
Adobe Acrobat COM Adobe Reader/Acrobatがインストールされている Windows .NET Frameworkのみ Adobeライセンス インストールされているバージョンに依存
PDFium.NET PDFiumネイティブバイナリ .NET 5以上 BSD(オープンソース) 高品質、手動DPI制御
GhostScriptラッパー GhostScriptがインストールされている 任意(CLIまたはCOM経由) AGPLまたは商用 品質は良いがレンダリングが遅い

Windows フォームの使用例における IronPDF の主な利点は、完全に自己完結型であるため、エンド ユーザーのマシンに外部ソフトウェアをインストールする必要がないことです。 IronPDF のライセンス ページには、価格と無料試用オプションに関する詳細が記載されています。 パッケージは、ダウンロード統計とバージョン履歴とともにNuGet.orgで見つかります。 PDF 仕様でページ レンダリングがどのように定義されているかを詳しく知るには、ISO が発行したISO 32000-2 PDF 標準で、 IronPDFやその他のレンダラーが実装する必要がある形式について説明されています。

画像のレンダリング以外の IronPDF の機能の詳細については、 IronPDF のドキュメント ホームで、PDF の作成、HTML から PDF への変換、フォームの処理、デジタル署名などについて説明しています。

次のステップは何ですか?

このチュートリアルで紹介するパターン(ToBitmap でレンダリングし、PictureBox で表示し、インデックスベースのコントロールでナビゲートする)を使用すると、Windows Forms で機能的で依存関係のない PDF ビューアを作成できます。 ここからは、アプリケーションの要件に応じて、いくつかの方向性を検討する価値があります。

制作品質のビューアの場合は、大きなドキュメントを効率的に処理するために遅延ページ レンダリングを検討し、メイン ビューアの横にスクロール可能なサムネイル パネルを追加し、DPI パラメータに関連付けられたズーム コントロールを公開します。 ドキュメント管理アプリケーションの場合、ビューアと IronPDF のテキスト抽出機能およびフォーム フィールド読み取り機能を組み合わせて、検索可能なドキュメント インデックスを構築します。

ワークフローで PDF を表示する前にプログラムで生成する必要がある場合、 IronPDF はHTML から PDF への変換PDF の最初からの作成もサポートしているため、同じライブラリで生成と表示の両方を処理できます。

無料トライアルを開始して、開発用のウォーターマークなしのライセンスキーを取得するか、完全な API リファレンスを参照してAnyBitmap、およびサポートするレンダリング クラスで使用可能なメソッドの完全なセットを確認してください。 IronPDFのサンプルギャラリーには、C#で一般的なPDFタスクを網羅した、すぐに実行できるコードサンプルも用意されています。

よくある質問

C#を使用してWindows Forms PictureBoxにPDFを表示するにはどうすればよいですか?

IronPDFのToBitmapメソッドを使用して、PDFページをAnyBitmapオブジェクトとしてレンダリングし、それぞれをSystem.Drawing.Bitmapに変換して、PictureBox.Imageに割り当てます。

IronPDFは、C#でPDFページをレンダリングするためにどのメソッドを提供していますか?

IronPDFは、PDFページを任意のDPIでAnyBitmapオブジェクトとしてレンダリングするToBitmapメソッドを提供しています。PictureBoxで使用するために変換するには、ToImage()を呼び出します。

PDFページをPictureBoxでナビゲートすることは可能ですか?

はい。レンダリングされたページのビットマップを配列に格納し、ページインデックス変数を増減します。各ナビゲーションクリックで対応するビットマップをPictureBox.Imageに割り当てます。

WindowsフォームでPDFを表示するためにIronPDFを使う利点は何ですか?

IronPDFは完全に自己完結しており、外部ソフトウェアのインストールを必要としません。可変DPIレンダリング、ページナビゲーション、印刷、テキスト抽出をサポートしており、Adobe Acrobatへの依存はありません。

IronPDFはPictureBoxで表示するために複数ページのPDFを扱うことができますか?

はい。ToBitmapはページごとに1つのAnyBitmapを返します。配列を格納してインデックスでナビゲートするか、ToBitmap(dpi, startPage, endPage)のオーバーロードを使用して、オンデマンドでページごとにレンダリングします。

カーティス・チャウ
テクニカルライター

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

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね