Pythonを使用してPDFドキュメントにアクションを作成する方法

PDF形式は、そのクロスプラットフォーム互換性と豊富な機能セットにより、多くの業界で選ばれるファイル形式となっています。その中でも、**PDFのアクション（Action）機能**は特に注目されます。アクションを使用することで、リンクやボタン、スクリプトなどのインタラクティブな要素を埋め込むことができ、ドキュメントの対話性や機能性が大幅に向上します。Pythonのような強力なプログラミング言語を用いてこれらのアクションを作成することで、ドキュメント処理の自動化や、複雑な操作の実現が可能となり、PDFドキュメントの活用範囲が大きく広がります。静的なコンテンツ表示に留まらず、ユーザーのニーズやビジネスプロセスにより適したサービスを提供できるようになるのです。本記事では、Pythonを使用して**PDFドキュメントにアクションを作成する方法**について説明します。

- **[Pythonを使用してPDFにナビゲーションアクションを作成する](#pythonを使用してpdfにナビゲーションアクションを作成する)**
- **[Pythonを使用してPDFにサウンドアクションを作成する](#pythonを使用してpdfにサウンドアクションを作成する)**
- **[Pythonを使用してPDFにJavaScriptアクションを作成する](#pythonを使用してpdfにjavascriptアクションを作成する)**

ここで紹介する方法は、[Spire.PDF for Python](https://jp.e-iceblue.com/download/spire-pdf-for-python.html)を使用します。Pythonで以下のコマンドを実行してインストールできます：`pip install Spire.PDF`。

[無料ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)

## Pythonを使用してPDFにナビゲーションアクションを作成する

ライブラリの`PdfGoToAction`クラスは、指定されたページや位置にジャンプするナビゲーションアクションを表します。また、ジャンプ後のページズームをカスタマイズすることも可能です。以下は、このクラスを使用してPDFドキュメントにナビゲーションアクションを作成する手順です：

1. 必要なモジュールをインポートします。
2. `PdfDocument`クラスを作成し、`PdfDocument.LoadFromFile()`メソッドを使用してPDFファイルを読み込みます。
3. `PdfDocument.Pages.get_Item()`メソッドを使用してページを取得します。
4. `PdfDestination`インスタンスを作成して、ジャンプ先の位置とズームを設定します。
5. `PdfDestination`インスタンスを使用して、`PdfGoToAction`インスタンスを作成します。
6. `PdfGoToAction`インスタンスを使用して、指定された位置に`PdfActionAnnotation`インスタンスを作成し、注釈の色を設定します。
7. `PdfPageBase.Annotations.Add()`メソッドを使用して注釈をページに追加します。
8. `PdfPageBase.Canvas.DrawString()`メソッドを使用して、注釈の位置にナビゲーションヒントのテキストを描画します。
9. `PdfDocument.SaveToFile()`メソッドを使用してドキュメントを保存します。
10. リソースを解放します。

**コード例**
```python
from spire.pdf import *

# PdfDocumentクラスのインスタンスを作成し、PDF文書を読み込む
pdf = PdfDocument()
pdf.LoadFromFile("Sample.pdf")

# 2ページ目を取得
page = pdf.Pages.get_Item(1)

# PdfDestinationのインスタンスを作成し、そのプロパティを設定
destination = PdfDestination(pdf.Pages.get_Item(0))
destination.Location = PointF(0.0, 0.0)
destination.Mode = PdfDestinationMode.Location
destination.Zoom = 0.8

# PdfGoToActionのインスタンスを作成
action = PdfGoToAction(destination)

# PdfActionAnnotationのインスタンスを作成
rect = RectangleF.FromLTRB(70, pdf.PageSettings.Size.Height - 100, 220, pdf.PageSettings.Size.Height - 70)
annotation = PdfActionAnnotation(rect, action)
annotation.Color = PdfRGBColor(Color.get_Green())

# 注釈を2ページ目に追加
page.Annotations.Add(annotation)

# ボタンの文字を描画
font = PdfTrueTypeFont("Yu Mincho Demibold", 14.0, PdfFontStyle.Regular, True)
stringFormat = PdfStringFormat(PdfTextAlignment.Center)
page.Canvas.DrawString("最初のページへ移動", font, PdfBrushes.get_Green(), rect, stringFormat)

# 文書を保存
pdf.SaveToFile("output/PDFにナビゲーションボタンを追加.pdf")
pdf.Close()
```

結果
![Pythonを使用してPDFにナビゲーションアクションを作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/2a5036cb-a86e-92e3-96b8-42835f63a197.png)

## Pythonを使用してPDFにサウンドアクションを作成する
`PdfSoundAction`クラスは音声アクションを表し、PDFドキュメントに音声を埋め込み、ユーザーが特定の操作を行った際に音声を再生することができます（例えば、アクション注釈をクリックしたときやファイルを開いたとき）。以下は、PDFドキュメントにサウンドアクションを作成する手順です：

1. 必要なモジュールをインポートします。
2. `PdfDocument`クラスを作成し、`PdfDocument.LoadFromFile()`メソッドを使用してPDFファイルを読み込みます。
3. 指定された音声ファイルを使用して`PdfSoundAction`インスタンスを作成します。
4. `PdfSoundAction`クラスのプロパティを使用して、音声再生パラメーターを設定します。
5. `PdfSoundAction.Sound`プロパティを使用して音声パラメーターを設定します。
6. `PdfDocument.Pages.get_Item()`メソッドを使用してページを取得します。
7. `PdfPageBase.Canvas.DrawImage()`メソッドを使用して、ページの指定された位置に音声再生アイコンを描画します。
8. `PdfSoundAction`インスタンスを使用して`PdfActionAnnotation`インスタンスを作成し、`PdfPageBase.Annotations.Add()`メソッドを使用して音声再生アイコンの位置に追加します。
9. `PdfDocument.AfterOpenAction`プロパティを直接使用して、ドキュメントを開くと同時に音声アクションを実行するように設定することもできます。
10. `PdfDocument.SaveToFile()`メソッドを使用してドキュメントを保存します。
11. リソースを解放します。

**コード例**
```python
from spire.pdf import *

# PdfDocumentのインスタンスを作成し、PDFファイルを読み込む
pdf = PdfDocument()
pdf.LoadFromFile("Sample1.pdf")

# ドキュメントの最初のページを取得
page = pdf.Pages.get_Item(0)

# 音声ファイルのパスを使用してPdfSoundActionのインスタンスを作成
soundAction = PdfSoundAction("Wave.wav")

# 音声パラメータを設定
soundAction.Sound.Bits = 16
soundAction.Sound.Channels = PdfSoundChannels.Stereo
soundAction.Sound.Encoding = PdfSoundEncoding.Signed
soundAction.Sound.Rate = 44100

# 再生パラメータを設定
soundAction.Volume = 0.5
soundAction.Repeat = True
soundAction.Mix = True
soundAction.Synchronous = False

# ページ上に画像を描画
image = PdfImage.FromFile("Sound.png")
page.Canvas.DrawImage(image, PointF(30.0, 30.0))

# 音声アクションを使用してPdfActionAnnotationのインスタンスを作成
rect = RectangleF.FromLTRB(30.0, 30.0, image.GetBounds().Width + 30.0, image.GetBounds().Height + 30.0)
annotation = PdfActionAnnotation(rect, soundAction)

# 注釈をページに追加
page.Annotations.Add(annotation)

# ドキュメントが開いた後に音声アクションを再生する設定
# pdf.AfterOpenAction = soundAction

# 文書を保存
pdf.SaveToFile("output/PDFに音声アクションを追加.pdf")
pdf.Close()
```

結果
![PDFにサウンドアクションを作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/94a06243-706a-5b73-c34c-8d9e8a8047b5.png)

## Pythonを使用してPDFにJavaScriptアクションを作成する
`PdfJavaScriptAction`クラスは、特定の状況でPDFドキュメント内でJavaScriptコードを実行するJavaScriptアクションを表します。例えば、フォームの入力やリセットなどが挙げられます。以下は、PDFにJavaScriptアクションを作成する手順の例です：

1. 必要なモジュールをインポートします。
2. `PdfDocument`クラスを作成し、`PdfDocument.LoadFromFile()`メソッドを使用してPDFファイルを読み込みます。
3. `PdfDocument.Pages.get_Item()`メソッドを使用してページを取得します。
4. JavaScriptコードをカスタマイズします。
5. このコードを使用して`PdfJavaScriptAction`インスタンスを作成します。
6. `PdfJavaScriptAction`インスタンスを使用して、ページの指定された位置に`PdfActionAnnotation`インスタンスを作成し、その色を設定します。
7. `PdfPageBase.Annotations.Add()`メソッドを使用して注釈をページに追加します。
8. `PdfDocument.SaveToFile()`メソッドを使用してドキュメントを保存します。
9. リソースを解放します。

**コード例**
```python
from spire.pdf import *

# PdfDocumentのインスタンスを作成
pdf = PdfDocument()

# PDFファイルを読み込む
pdf.LoadFromFile("Sample2.pdf")

# 最初のページを取得
page = pdf.Pages.get_Item(0)

# JavaScriptコードを指定
js = """
var lastName = this.getField("LastName").value;
var firstName = this.getField("FirstName").value;
this.getField("FullName").value = lastName + " " + firstName;
"""

# JavaScriptアクションを作成
jsAction = PdfJavaScriptAction(js)

# JavaScriptアクション付きの注釈を作成
rect = RectangleF.FromLTRB(380, 160, 530, 180)
annotation = PdfActionAnnotation(rect, jsAction)
annotation.Color = PdfRGBColor(Color.get_Red())

# ページに注釈を追加
page.Annotations.Add(annotation)

# アクションのヒントテキストを描画
font = PdfTrueTypeFont("Yu Gothic", 12.0, PdfFontStyle.Regular, True)
stringFormat = PdfStringFormat(PdfTextAlignment.Center)
text = "クリックして氏名を入力"
page.Canvas.DrawString(text, font, PdfBrushes.get_Red(), rect, stringFormat)

# 文書を保存
pdf.SaveToFile("output/JavaScriptアクションをPDFに追加.pdf")
pdf.Close()
```

結果
![2024-08-30_153020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/7e80dd79-84d3-8676-9c0f-c8a0aef9ae8d.png)

本記事では、Pythonを使用してPDFドキュメントにナビゲーションアクション、サウンドアクション、およびJavaScriptアクションを作成する方法を紹介しました。

さらに詳しいPDFドキュメント操作のコツは、[Spire.PDF for Pythonのチュートリアル](https://www.e-iceblue.com/Tutorials/Python/Spire.PDF-for-Python/Program-Guide/Spire.PDF-for-Python-Program-Guide-Content.html)をご覧ください。