PythonでPDFにハイパーリンクを追加・削除する

PDFファイルは、今や文書の保存や配布に最適なフォーマットです。しかし、PDFファイルは静的な性質を持っているため、インタラクティブ性が制限されることがあります。ハイパーリンクは、PDFファイルのインタラクティブ性とユーザーエクスペリエンスを向上させるための重要な要素です。
強力なプログラミング言語であるPythonには、ハイパーリンクの追加や削除など、PDFファイルを扱うための様々なライブラリやツールがあります。この記事では、これらの操作を実行するためにサードパーティ製ライブラリ[Spire.PDF for Python](https://www.e-iceblue.com/Introduce/pdf-for-python.html)を使用する方法について詳しく説明します。
* [PythonでPDFにハイパーリンクを追加する](#pythonでpdfにハイパーリンクを追加する) 
* [PythonでPDFからハイパーリンクを削除する](#pythonでpdfからハイパーリンクを削除する)

## Pythonライブラリをインストールする
PDFファイルを処理するには、[**Spire.PDF for Python**](https://www.e-iceblue.com/Introduce/pdf-for-python.html)ライブラリが必要です。以下のpipコマンドで直接インストールできます：
> pip install Spire.Pdf


## PythonでPDFにハイパーリンクを追加する
Spire.PDF for Pythonは、PDFに様々なタイプのハイパーリンクを追加することをサポートしています：
* 単純なテキストリンク: **`PdfPageBase.Canvas.DrawString()`** メソッドを使ってPDFページに直接描画できます。
* ハイパーテキストリンク、電子メールリンク: **`PdfTextWebLink.DrawTextWebLink()`** メソッドでPDFページに描画できます。
* ドキュメントリンク： **`PdfPageBase.AnnotationsWidget.Add(PdfFileLinkAnnotation)`** メソッドで追加できます。

> Pythonコード:
```python
from spire.pdf.common import *
from spire.pdf import *

# PDF文書を作成し、ページを追加する
pdf = PdfDocument()
page = pdf.Pages.Add()

# 開始X座標とY座標を指定する
y = 30.0
x = 10.0

# True Typeフォントの作成
font = PdfTrueTypeFont("Yu Mincho", 12.0, PdfFontStyle.Regular, True)
font1 = PdfTrueTypeFont("Yu Mincho", 12.0, PdfFontStyle.Underline, True)

# シンプルなテキストリンクを追加する
label = "簡単なテキストリンク："
format = PdfStringFormat()
format.MeasureTrailingSpaces = True
page.Canvas.DrawString(label, font, PdfBrushes.get_Black(), 0.0, y, format)
x = font.MeasureString(label, format).Width
url = "https://qiita.com/"
page.Canvas.DrawString(url, font1, PdfBrushes.get_Blue(), x, y)
y = y + 28

# ハイパーテキストリンクの追加
label = "ハイパーテキストリンク："
page.Canvas.DrawString(label, font, PdfBrushes.get_Black(), 0.0, y, format)
x = font.MeasureString(label, format).Width
webLink = PdfTextWebLink()
webLink.Text = "ホームページ"
webLink.Url = url
webLink.Font = font1
webLink.Brush = PdfBrushes.get_Blue()
webLink.DrawTextWebLink(page.Canvas, PointF(x, y))
y = y + 28

# Eメールリンクの追加
label = "Eメールリンク： "
page.Canvas.DrawString(label, font, PdfBrushes.get_Black(), 0.0, y, format)
x = font.MeasureString(label, format).Width
link = PdfTextWebLink()
link.Text = "お問い合わせ"
link.Url = "mailto:support@e-iceblue.com"
link.Font = font1
link.Brush = PdfBrushes.get_Blue()
link.DrawTextWebLink(page.Canvas, PointF(x, y))
y = y + 28

# 文書リンクを追加する
label = "文書リンク: "
page.Canvas.DrawString(label, font, PdfBrushes.get_Black(), 0.0, y, format)
x = font.MeasureString(label, format).Width
text = "クリックしてファイルを開く"
location = PointF(x, y)
size = font1.MeasureString(text)
linkBounds = RectangleF(location, size)
fileLink = PdfFileLinkAnnotation(linkBounds, "C:\\Users\\Administrator\\Desktop\\report.xlsx")
fileLink.Border = PdfAnnotationBorder(0.0)
page.AnnotationsWidget.Add(fileLink)
page.Canvas.DrawString(text, font1, PdfBrushes.get_Blue(), x, y)

# PDFファイルを保存する
pdf.SaveToFile("PDFLinks.pdf")
pdf.Close()
```

**生成されたファイル：**
![PDFLink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/db9b5314-53e5-6876-5d9d-9ebe5190cd59.png)

 
## PythonでPDFからハイパーリンクを削除する
PDF文書に存在するすべてのハイパーリンクを一度に削除したい場合は、次の手順を参照してください：

1. `LoadFromFile()`メソッドでPDF文書を読み込みます。
1. ドキュメント内のページをループし、**`PdfPageBase.AnnotationsWidget`** プロパティを通して各ページの注釈を取得します。
1. すべての注釈をループし、各注釈がハイパーリンクであるかどうかをチェックします。
1. そうであれば、**`PdfAnnotationCollection.Remove()`** メソッドを使用して削除します。
1. `PdfDocument.SaveToFile()` メソッドを使用してドキュメントを保存します。

>Pythonコード:
```python
from spire.pdf import *
from spire.pdf.common import *

# PDF文書を読み込む
pdf = PdfDocument()
pdf.LoadFromFile("PDFLinks.pdf")

# 文書内のすべてのページを反復処理する
for j in range(pdf.Pages.Count):
    # 各ページを取得する
    page = pdf.Pages.get_Item(j)
    # 各ページの注釈を取得する
    annotations = page.AnnotationsWidget
    # すべての注釈を反復処理する
    if annotations.Count > 0:
        i = annotations.Count - 1
        while i >=0:
            # 注釈を取得する
            annotation = annotations.get_Item(i)
            # 各注釈がハイパーリンクかどうかをチェックする
            if isinstance(annotation, PdfTextWebLinkAnnotationWidget):
                # ハイパーリンク注釈の削除
                annotations.Remove(annotation)
            i -= 1

# PDF文書を保存する
pdf.SaveToFile("RemovePDFLinks.pdf")
pdf.Close()
```

PDFページ内の指定されたハイパーリンクを削除するだけなら、以下のコードを参照できます：
```python
# 最初のページの最初のハイパーリンクを削除する
page = pdf.Pages.get_Item(0)
page.AnnotationsWidget.RemoveAt(0)
```
* * *
生成されたドキュメントの赤いウォーターマークは、以下のリンクをクリックして、1ヶ月の無料ライセンスをリクエストすることで削除できます：

https://www.e-iceblue.com/TemLicense.html