PythonでPDFをTIFFに、またはTIFFをPDFに変換する

PDFは、デジタル文書管理の分野で一般的に使用されているフォーマットの1つで、主にテキスト、画像、表、リンクなどを含む複雑な文書の保存と共有に使用されます。一方、TIFF (Tagged Image File Format) は、画像処理の分野で一般的に使用され、主に高品質の画像ファイルの保存に使用されます。
実際には、さまざまなシナリオに適応するために、PDFファイルをTIFF画像に変換したり、TIFFをPDFに変換したりする必要がある場合があります。この記事では、PDFとTIFFフォーマットの相互変換を実現するためにPythonを使用する方法を紹介します。
* [PythonでPDFファイルを複数ページのTIFF画像に変換する](#pythonでpdfファイルを複数ページのtiff画像に変換する)
* [PythonでTIFF画像をPDFファイルに変換する](#pythonでtiff画像をpdfファイルに変換する)

## 必要なPythonライブラリ
* [**Spire.PDF for Python**](https://www.e-iceblue.com/Introduce/pdf-for-python.html) - Python プログラムで PDF ドキュメントの作成、読み込み、編集、変換、保存をサポートするサードパーティライブラリ。
* **Pillow** - Python の画像処理ライブラリ（PIL ライブラリベース）。JPEG, PNG, GIF, TIFF, BMP など幅広い画像フォーマットをサポートしており、画像の読み込み・変更・作成・保存を行う関数を提供。

これら2つのPythonライブラリは、以下のpipコマンドを使ってインストールできる：
>pip install Spire.Pdf
pip install pillow

## PythonでPDFファイルを複数ページのTIFF画像に変換する
TIFFフォーマットは複数ページの画像の保存をサポートしているため、スキャンした本や新聞、レポートなど、複数の画像やページを含む文書の保存や配布に最適です。PDFファイルをTIFFに変換するには、Spire.PDF for Pythonライブラリが提供するインターフェースを使用してPDF内の各ページを画像ストリームに変換し、Pillowライブラリを使用してこれらの画像ストリームを1つの連続した複数ページのTIFFファイルにマージする必要があります。

> **主な手順と方法は以下の通り：**
1. PDF ファイルを読み込むには、`PdfDocument` クラスの `LoadFromFile()` メソッドを使用します；
2. PDFページを画像に変換する:
   * PDFファイルの各ページを繰り返し処理します；
   * PdfDocumentクラスの`SaveAsImage()`メソッドを使用して、各ページを画像ストリームに変換します；
   * Pillowライブラリを使用して画像ストリームをImageオブジェクトに変換し、リストに追加します。
3. リ ス ト 内の画像を複数ページ TIFF フ ァ イ ル と し て保存 し ます。

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

from PIL import Image
from io import BytesIO

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

# リストを作成する
images = []

# PDF文書内のすべてのページを反復処理する
for i in range(pdf.Pages.Count):

    # 指定されたページを画像ストリームに変換する
    with pdf.SaveAsImage(i) as imageData:

        # 画像ストリームを画像オブジェクトに変換する
        img = Image.open(BytesIO(imageData.ToArray())) 

        # 変換された画像オブジェクトをリストに追加する
        images.append(img)

# 最初の画像をベースとして使用し、残りの画像をこのベースに追加して、連続した複数ページのTIFFファイルを形成する
images[0].save("PDFtoTIFF.tiff", save_all=True, append_images=images[1:])

# リソースの解放
pdf.Dispose()
```

> **生成されたTIFFファイル：**
![PDF-TIFF日.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/b4cb93fd-6132-6059-2b2e-002bf01ac915.png)



## PythonでTIFF画像をPDFファイルに変換する
複数ページのTIFF画像をPDF文書に変換するには、まずPillowライブラリを使ってTIFF画像の各フレームを分割してPNG画像として保存し、次にSpire.PDF for Pythonライブラリを使ってこれらの画像をPDFページに描画する必要があります。

> **主な手順と方法は以下の通り：**
1. `PdfDocument`オブジェクトを作成する
1. Pillowライブラリを使用してTIFF画像ファイルを読み込む
1. TIFF画像のフレームを処理する
   - TIFF画像の各フレームを繰り返し処理します
   - 現在のフレームを取得し、Pillowライブラリが提供する`copy()`メソッドを使用して現在のフレームをコピーします
   - Pillowライブラリが提供する`save()`メソッドを使用して、現在のフレームを指定された形式の画像ファイルとして保存します
   - Spire.PDFライブラリを使用して、画像ファイルをPDF画像オブジェクトに変換します。
4. 画像をPDFページに描画します
   - `PdfDocument.Pages.Add()` メ ソ ッ ド を使っ て、 PDF 文書内にページ を追加 し ます
   - `PdfPageBase.Canvas.DrawImage()`メソッドを使用して、PDFページ上に画像を描画します
5. PDFファイルを保存します。

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

from PIL import Image
import io

# PdfDocumentオブジェクトを作成する
pdf = PdfDocument()

# マージンの設定
pdf.PageSettings.SetMargins(0.0)

# TIFF画像の読み込み
tiff_image = Image.open("PDFtoTIFF.tiff")

# 各フレームを繰り返し処理する
for i in range(tiff_image.n_frames):

    # 現在のフレームを取得
    tiff_image.seek(i)
    
    # 現在のフレームをコピーし、PNG画像ファイルとして保存する。
    tiff_image.copy().save("output_frame_{i}.png")
    
    # PNG画像ファイルをPDF画像オブジェクトに変換する
    image = PdfImage.FromFile("output_frame_{i}.png")

    # 画像の幅と高さを取得する
    width = image.PhysicalDimension.Width
    height = image.PhysicalDimension.Height

    # PDF内の画像と同じサイズのページを追加する
    page = pdf.Pages.Add(SizeF(width, height))

    # ページ上の指定された位置に画像を描画します
    page.Canvas.DrawImage(image, 0.0, 0.0, width, height)

# PDF文書を保存する
pdf.SaveToFile("TIFFtoPDF.pdf",FileFormat.PDF)

# リソースの解放
pdf.Dispose()
```

> **生成されたPDFファイル：**

![TIFFtoPDF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/632e97b6-b622-2cca-5be9-11e6edbb42a5.png)

* * *

赤い透かしを消すには、クリックして1ヶ月の無料ライセンスを申請してください：

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

PDF Python ライブラリがサポートするその他の PDF 変換関数：

https://www.e-iceblue.com/Tutorials/Python/Spire.PDF-for-Python/Program-Guide/Spire.PDF-for-Python-Program-Guide-Content.html