見出し画像

[Python] PyMuPDFライブラリを使用して、PDFファイルをページごとに画像ファイルに変換する

はじめに

以前、Pythonで、PDFファイルをページごとに画像ファイルに変換する処理についてまとめました。

この際、使用しているライブラリは、pdf2imageでした。 pdf2imageライブラリは、内部でpopplerというライブラリを使用するため、事前にパソコンにpopplerをインストールしておく必要がありました。

先日、パソコンを置き換えた際に、popplerのインストールを忘れてしまい、このツールが動作しなくなってしまいました。
このようなうっかりをなくすため、Pythonのライブラリをpip(インストール)するだけで実行できるよう、実装を修正しました。

使用するライブラリ

PyMuPDF

PDFドキュメントのデータ抽出、分析、変換、操作を行うことができる高性能なライブラリ。
使用時にはインストールが必要です。

pip install PyMuPDF

pathlib

ファイルやフォルダ(ディレクトリ)のパスをオブジェクトとして操作、処理することができる標準ライブラリ。
標準ライブラリのため、使用時にインストールは不要です。

動作環境

  • Windows11

  • Python 3.11.5

実装

全体の実装は下記です。

import sys
from pathlib import Path
import fitz

def main(file_path_list):
    """PDFファイルのページを画像ファイルに変換する
    
    Args:
        file_path_list (list): PDFファイルパス名のリスト
    """
    for file_path in file_path_list:
        path_file = Path(file_path)
        folder_name = path_file.parent
        base_file_name = path_file.stem

        # PDFファイルを開く
        pdf = fitz.open(file_path)

        # 1ページずつ画像ファイルとして保存する
        for i, page in enumerate(pdf):
            pix = page.get_pixmap()
            image_f_name = f'{base_file_name}_{str(i).zfill(2)}.png'
            image_f_path = Path(folder_name) / image_f_name
            pix.save(image_f_path)

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('PDFファイルを指定してください')
        sys.exit()
    
    # 引数2つ目以降処理する
    main(sys.argv[1:])

処理の流れは、以前ご紹介した記事同様です。

ライブラリ変更による変更箇所を説明します。

ライブラリのインポート

from pathlib import Path
import fitz

1行目では、pathlibライブラリからPathオブジェクトをインポートします。
2行目では、PyMuPDFライブラリのインポートをします。
注意点としては、インポートする際のライブラリ名は、fitzとなることです。

なお、インポートするライブラリ名が、PyMuPDFではなく、fitzをしているかについては、公式ドキュメントに記載あります。

PDFファイルを開く

# PDFファイルを開く
pdf = fitz.open(file_path)

openメソッドで、Documentオブジェクトを生成します。
引数は、ファイル名となります。

PDFファイルの各ページを取得し、画像データを取得

for i, page in enumerate(pdf):
  pix = page.get_pixmap()

Documentオブジェクトからページを取得するのに、for文を使用しています。page変数に、各ページのPageオブジェクトを取得することができます。
今回、ページ番号を画像ファイル名の末尾に指定したいので、enumerate関数を使用して、インデックス番号を一緒に取得しています。
Pageオブジェクトのget_pixmapメソッドを使用して、ページを画像データに変換しています。

get_pixmapメソッドの戻り値は、Pixmapオブジェクトとなります。

変換した画像データをファイルに保存するには、Pixmapオブジェクトのsaveメソッドを使用します。
引数として、保存する際のファイルパス名を指定しています。

以上で実装終了です!

早速、動作させてみます。
引数に、PDFファイルのファイルパスを指定します。サンプルには、下記よりダウンロードしたPDFを使用しました。

https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/r03/pdf/01point.pdf

対象のPDFファイル

実行後、PDFファイルが配置されているフォルダに、PDFファイル内のページ数分画像が作成されました!

PDFファイル内のページがページごとに画像ファイルとなって保存

まとめ

今回は、PythonのPyMuPDFライブラリを使用して、PDFファイルをページごとに画像ファイルに変換する処理を実装しました。

参考サイト


いいなと思ったら応援しよう!