[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ファイル内のページ数分画像が作成されました!
まとめ
今回は、PythonのPyMuPDFライブラリを使用して、PDFファイルをページごとに画像ファイルに変換する処理を実装しました。