『.NET』C#でPDFにアクションを追加する方法

C#言語を使用して.NETフレームワーク上で**PDFドキュメントにアクションを追加**することで、ドキュメントのインタラクティブ性やユーザー体験を向上させるだけでなく、自動化ワークフローの中で重要な役割を果たします。たとえば、特定のページへの自動ジャンプ、外部リソースへのリンク、音声再生といった操作が可能です。この機能により、開発者は特定の要件に基づいてPDFドキュメントの操作をカスタマイズでき、ドキュメントの実用性を高めることができます。この記事では、**.NETプラットフォームでC#を使用してPDFにアクションを追加する方法**を解説します。

### 記事の内容
- C#を使用してPDFにアクションを追加する一般的な手順
- PDF内でドキュメント内ジャンプアクションを作成する方法
- PDFでWebリンクを開くアクションを作成する方法
- PDFで音声再生アクションを作成する方法
- PDFでファイルを開くアクションを作成する方法
- PDFでJavaScriptアクションを作成する方法

**使用ツール:** この記事では、無料の[Free Spire.PDF for .NET](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-net.html)ライブラリを使用します。これはNuGetを介してインストール可能です：  
`PM> Install-Package FreeSpire.PDF`

---

## C#を使用してPDFにアクションを追加する一般的な手順
C#とFree Spire.PDFライブラリを利用することで、PDFドキュメントにさまざまなインタラクティブ要素を埋め込むことができます。たとえば、ナビゲーションボタンや外部リンク、音声再生機能を追加してユーザーの体験を向上させることができます。以下は、PDFにアクションを追加する際の主要な手順を簡単に説明したものです：

1. `PdfDocument`クラスのインスタンスを作成する。  
2. `PdfDocument.LoadFromFile()`メソッドを使用してPDFドキュメントを読み込む。  
3. `PdfDocument.Pages[]`プロパティを使用して対象ページを取得する。  
4. アクションを表すクラスのインスタンスを作成し、必要なプロパティを設定する。  
5. アクションをPDFに追加する：  
   - ページの特定の矩形領域に`PdfActionAnnotation`クラスのインスタンスを作成し、アクションを関連付けることが可能です。必要に応じてツールチップテキストを追加し、`PdfPageBase.Annotations.Add()`メソッドを使用してアノテーションをページに追加します。  
   - また、`PdfDocument.AfterOpenAction`や`PdfDocument.BeforeCloseAction`プロパティを設定して、特定の操作時に実行されるアクションを設定することもできます。  
6. `PdfDocument.SaveToFile()`メソッドを使用して生成したドキュメントを保存する。  
7. リソースを解放する。  

---

## PDF内でドキュメント内ジャンプアクションを作成する
ドキュメント内ジャンプアクションは、`PdfGoToAction`クラスを使用して作成します。以下にコード例を示します：
```csharp
using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Annotations;
using Spire.Pdf.General;
using Spire.Pdf.Graphics;
using System.Drawing;

namespace AddNavigationButtonPDF
{
    class Program
    {
        static void Main(string[] args)
        {
            // PdfDocumentのインスタンスを作成
            PdfDocument pdf = new PdfDocument();

            // PDFファイルを読み込む
            pdf.LoadFromFile("Sample.pdf");

            // PdfDestinationインスタンスを作成し、遷移先を設定
            PdfDestination destination = new PdfDestination(pdf.Pages[1]);
            destination.Location = new PointF(0, 0);
            destination.Mode = PdfDestinationMode.Location;
            destination.Zoom = 0.6f;

            // 遷移先に基づいてPdfGoToActionインスタンスを作成
            PdfGoToAction action = new PdfGoToAction(destination);

            // 四角形を作成し、最初のページに描画
            RectangleF rect = new RectangleF(70, pdf.PageSettings.Size.Height - 120, 140, 20);
            pdf.Pages[0].Canvas.DrawRectangle(PdfBrushes.LightGray, rect);
            // 四角形内にテキストを描画
            PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Gothic UI", 14f, FontStyle.Bold), true);
            PdfStringFormat stringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            pdf.Pages[0].Canvas.DrawString("2ページに移動", font, PdfBrushes.Green, rect, stringFormat);

            // 四角形とアクションに基づいてPdfActionAnnotationインスタンスを作成
            PdfActionAnnotation actionAnnotation = new PdfActionAnnotation(rect, action);

            // 最初のページにアクション注釈を追加
            pdf.Pages[0].Annotations.Add(actionAnnotation);

            // ドキュメントを保存
            pdf.SaveToFile("output/PDFナビゲーションアクション.pdf");
            pdf.Close();
        }
    }
}
```

**結果:**  
![PDF内でドキュメント内ジャンプアクションを作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/b77964b8-7e7a-788d-fe47-3f4080118c13.png)

作成したアクションを使用して、PDF内の特定のページにジャンプできます。

---

## PDFでWebリンクを開くアクションを作成する
Webリンクを開くアクションは、`PdfUriAction`クラスを使用して作成します。以下にコード例を示します：
```csharp
using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Annotations;
using Spire.Pdf.Graphics;
using System.Drawing;

namespace AddSoundActionPDF
{
    class Program
    {
        static void Main(string[] args)
        {
            // PdfDocumentのインスタンスを作成
            PdfDocument pdf = new PdfDocument();

            // PDFファイルを読み込む
            pdf.LoadFromFile("Sample.pdf");

            // 最初のページを取得
            PdfPageBase page = pdf.Pages[0];

            // ページ上に四角形を描画
            RectangleF rect = new RectangleF(30, 30, 120, 20);
            page.Canvas.DrawRectangle(PdfBrushes.LightGray, rect);
            // 四角形内にテキストを描画
            PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Gothic UI", 14f, FontStyle.Bold), true);
            PdfStringFormat stringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            page.Canvas.DrawString("クリックしてサンプルページを開く", font, PdfBrushes.LightSkyBlue, rect);

            // PdfUriActionインスタンスを作成し、そのプロパティを設定
            PdfUriAction action = new PdfUriAction();
            action.Uri = "https://www.example.com/";

            // ウェブリンクアクションと四角形を使用してPdfActionAnnotationインスタンスを作成
            PdfActionAnnotation actionAnnotation = new PdfActionAnnotation(rect, action);

            // 最初のページにアクション注釈を追加
            page.Annotations.Add(actionAnnotation);

            // ドキュメントを保存
            pdf.SaveToFile("output/PDFウェブリンクアクション.pdf");
            pdf.Close();
        }
    }
}
```

**結果:**  
![ PDFでWebリンクを開くアクションを作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/2a43ffae-51af-1ee4-155a-85b1e8641e13.png)

クリックすることで指定されたURLに遷移します。

---

## PDFで音声再生アクションを作成する
音声再生アクションは、`PdfSoundAction`クラスを使用して作成します。以下にコード例を示します：
```csharp
using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Annotations;
using Spire.Pdf.Graphics;
using Spire.Pdf.General;
using System.Drawing;

namespace AddSoundActionPDF
{
    class Program
    {
        static void Main(string[] args)
        {
            // PdfDocument のインスタンスを作成
            PdfDocument pdf = new PdfDocument();

            // PDF ファイルを読み込む
            pdf.LoadFromFile("Sample.pdf");

            // 最初のページを取得
            PdfPageBase page = pdf.Pages[0];

            // ページにヒント画像を描画
            PdfImage image = PdfImage.FromFile("Sound.png");
            page.Canvas.DrawImage(image, new PointF(30, 30));

            // PdfSoundAction のインスタンスを作成し、そのプロパティを設定
            PdfSoundAction action = new PdfSoundAction("Wave.wav");
            // サウンドパラメータを設定
            action.Sound.Bits = 16;
            action.Sound.Channels = PdfSoundChannels.Stereo;
            action.Sound.Encoding = PdfSoundEncoding.Signed;
            action.Sound.Rate = 44100;
            // 再生オプションを設定
            action.Volume = 0;
            action.Repeat = true;
            action.Mix = true;
            action.Synchronous = true;

            // ヒント画像の位置に基づいて PdfActionAnnotation のインスタンスを作成し、サウンドアクションを設定
            RectangleF rect = new RectangleF(30, 30, image.Width, image.Height);
            PdfActionAnnotation actionAnnotation = new PdfActionAnnotation(rect, action);

            // アクション注釈を最初のページに追加
            page.Annotations.Add(actionAnnotation);

            // ドキュメントを開いた後にサウンドアクションを再生するよう設定
            pdf.AfterOpenAction = action;

            // ドキュメントを保存
            pdf.SaveToFile("output/PDF音声再生アクション.pdf");
            pdf.Close();
        }
    }
}
```

**結果:**  
![PDFで音声再生アクションを作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/762ac32f-52e6-16fc-ebb6-33e1bf1f9c09.png)

指定したオーディオファイルを再生できます。

---

## PDFでファイルを開くアクションを作成する
ファイルを開くアクションは、`PdfLaunchAction`クラスを使用して作成します。以下にコード例を示します：
```csharp
using Spire.Pdf;
using Spire.Pdf.Actions;
using Spire.Pdf.Annotations;
using Spire.Pdf.Graphics;
using System.Drawing;

namespace AddFileLaunchActionPDF
{
    class Program
    {
        static void Main(string[] args)
        {
            // PdfDocument のインスタンスを作成
            PdfDocument pdf = new PdfDocument();

            // PDF ファイルを読み込む
            pdf.LoadFromFile("Sample.pdf");

            // 最初のページを取得
            PdfPageBase page = pdf.Pages[0];

            // ページに矩形を描画
            RectangleF rect = new RectangleF(50, 50, 180, 20);
            page.Canvas.DrawRectangle(PdfBrushes.LightGray, rect);
            // 矩形内にテキストを描画
            PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Yu Gothic UI", 14f, FontStyle.Bold), true);
            PdfStringFormat stringFormat = new PdfStringFormat(PdfTextAlignment.Center);
            pdf.Pages[0].Canvas.DrawString("クリックしてサンプル2を開く", font, PdfBrushes.Green, rect, stringFormat);

            // PdfLaunchAction のインスタンスを作成
            PdfLaunchAction action = new PdfLaunchAction("D:/サンプル2.pdf", PdfFilePathType.Absolute);
            // 起動モードを新しいウィンドウで開くように設定
            action.IsNewWindow = true;

            // 矩形と起動アクションに基づいて PdfActionAnnotation のインスタンスを作成
            PdfActionAnnotation actionAnnotation = new PdfActionAnnotation(rect, action);

            // アクション注釈を最初のページに追加
            page.Annotations.Add(actionAnnotation);

            // ドキュメントを保存
            pdf.SaveToFile("output/PDFファイル起動アクション.pdf");
            pdf.Close();
        }
    }
}

```

**結果:**  
![PDFでファイルを開くアクションを作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/42783e3c-6b2d-e5a8-af99-9874618ff45a.png)

指定された外部ファイルを開けます。

---

## PDFでJavaScriptアクションを作成する
JavaScriptアクションは、`PdfJavaScriptAction`クラスを使用して作成します。以下にコード例を示します：
```csharp
using Spire.Pdf;
using Spire.Pdf.Actions;

namespace AddJavaScriptActionPDF
{
    class Program
    {
        static void Main(string[] args)
        {
            // PdfDocument のインスタンスを作成
            PdfDocument pdf = new PdfDocument();

            // PDF ファイルを読み込む
            pdf.LoadFromFile("Sample.pdf");

            // JavaScript コードを定義
            var jsCode =
            "app.alert({" +
            "    cMsg: '人工知能の未来についての記事を読む準備ができましたか？\\n\\nこの記事では、人工知能の定義、歴史、カテゴリー、およびその応用について詳しく説明します。ぜひお楽しみください！', " +
            "    nIcon: 3, " +
            "    cTitle: '文書の紹介'" +
            "});";

            // コードを使用して PdfJavaScriptAction のインスタンスを作成
            PdfJavaScriptAction action = new PdfJavaScriptAction(jsCode);

            // PDF ドキュメントを開いたときに実行されるアクションを設定
            pdf.AfterOpenAction = action;

            // ドキュメントを保存
            pdf.SaveToFile("output/PDF JavaScriptアクション.pdf");
            pdf.Close();
        }
    }
}
```

**結果:**
![PDFでJavaScriptアクションを作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/65dc6280-7fff-4b5b-1783-7e0e6277c437.png)

カスタマイズしたJavaScriptコードを実行できます。

---

この記事では、.NETプラットフォームを使用してC#コードでPDFにアクションを追加する方法について、手順とコード例を交えて解説しました。この技術を活用して、ユーザーにより魅力的なインタラクティブなPDFドキュメントを提供できます。