C# Windowsフォームアプリケーションで PdfiumViewer を使用してPDFを表示

## はじめに
Windows Forms アプリケーションで PDF ファイルを表示する方法はいくつかありますが、PdfiumViewer を使用すると、よりスムーズに PDF の表示・操作が可能になります。[前回の記事で](https://qiita.com/Shakya_Bishal/items/c946a097d5782fa6eb5c)、WebBrowser を利用して PDF ファイルをデータベースから取得し、表示する方法を解説しました。

## PdfiumViewer とは？
PdfiumViewer は、PDFium をベースとした .NET 用の PDF ビューアライブラリです。高速な描画とシンプルなインターフェースを提供し、Windows Forms で簡単に PDF を表示できます。

## PdfiumViewer のインストール
まず、NuGet パッケージマネージャを使用して PdfiumViewer をインストールします。
```
この記事ではMicrosoft Visual Studio 2022、.Net Framework 4.8を使っています。
Install-Package PdfiumViewer
Install-Package PdfiumViewer.Native.x86.v8-xfa
Install-Package PdfiumViewer.Native.x86_64.v8-xfa 
```
## Windows Forms アプリケーションのセットアップ
Windows Forms に PdfiumViewer を組み込むために、新しい Form を作成し、PDF ビューアを設定します。

### クラスの作成
クラスを作成し、ボタンやDataGridViewを追加します。
```
public partial class FileManagement : Form
{
    private PdfViewer pdfViewer;
    private DataGridView dataGridView;
    private Button btnNew;
    private Button btnDisplayPdfviewer;
    private FileServices _fileServices;
    private DataTable _dt;
    private MemoryStream stream;

    public FileManagement()
    {
        InitializeControls();
    }

    private void InitializeControls()
    {
        // ボタンの設定
        btnNew = new Button { Text = "新規", Location = new Point(712, 37), Width = 150 };

        btnDisplayPdfviewer = new Button { Text = "表示(PdfViewer)", Location = new Point(712, 133), Width = 150 };

        btnNew.Click += btnAdd_Click;
        
        btnDisplayPdfviewer.Click += btnShow_Click;

        // DataGridViewの設定
        dataGridView = new DataGridView { Location = new Point(32, 37), Width = 602, Height = 313 };

        // フォームに追加
        this.Controls.Add(btnNew);
        this.Controls.Add(btnDisplayPdfviewer);
        this.Controls.Add(dataGridView);
    }
}
```

### PDF を PdfiumViewer で表示する
選択したファイルを PdfiumViewer で開くように実装します。
```
private void btnShow_Click(object sender, EventArgs e)
{
    LoadPdfFromDatabase("pdfViewer");
}

private async void LoadPdfFromDatabase(string openWith)
{
    if (dataGridView.SelectedRows.Count > 0)
    {
        DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
        string fileNo = selectedRow.Cells["fileNo"].Value.ToString();

        string where = $"WHERE fileNo = {int.Parse(fileNo)}";
        var data = await _fileServices.GetFile(where) ?? new DataTable();
        
        foreach (DataRow row in data.Rows)
        {
            byte[] pdfData = (byte[])row["fileData"];
            string fileName = row["fileName"].ToString();

            if (openWith == "pdfViewer")
            {
                FileManagement form = new FileManagement(pdfData);
                form.ShowDialog();
            }
        }
    }
}

```

### PdfViewer を使用した PDF 表示
データベースから取得したバイナリデータを PdfiumViewer で開きます。
```
public FileManagement(byte[] pdfData)
{
    Text = "PDF Viewer";
    Size = new Size(800, 600);
    pdfViewer = new PdfViewer { Dock = DockStyle.Fill };

    // PDFをMemoryStreamに読み込む
    stream = new MemoryStream(pdfData);
    pdfViewer.Document = PdfDocument.Load(stream);

    this.Controls.Add(pdfViewer);
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951101/092821c4-cb7f-34c4-3f5a-b15f79b6b12a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951101/58d8b513-158d-030e-0197-909995545ba5.png)

## まとめ
PdfiumViewer を使用して C# Windows Forms アプリケーションで PDF を表示する方法を紹介しました。データベースに保存された PDF がPdfiumViewer を利用することで、より快適な PDF ビューアを構築できます。