見出し画像

[Python] PDFファイルを画像ファイルに変換する

はじめに

今回は、Pythonで、PDFファイルをページごとに画像ファイルに変換する処理を実装します。

処理概要は、下記です。

  • コマンドラインで渡されたPDFファイルを、画像ファイルに変換

  • 画像ファイルは、PDFファイルと同じフォルダに作成

  • 画像ファイル名は、PDFファイル名の拡張子なしのベースネームに対し、ページ番号を2桁で付与
    例:PDFファイル名:a.pdf ページが2ページある場合、a_01.png、a_02.pngの2つの画像ファイルを作成

使用するライブラリ

pdf2image

PDFファイルを画像変換するライブラリとなります。なお、使用時にはインストールが必要です。

pip install pdf2image

また、pdf2imageライブラリは、内部でpopplerというPDFドキュメント閲覧用のライブラリを使用します。
popplerは、OSによってインストールの仕方が異なります。詳細は、下記の「How to install」をご参照ください。
今回は、windows10で動作させるため、popplerをPCへダウンロードして使用します。

popplerのダウンロード

ブラウザで、下記のURLへアクセスします。

Latest binaryの隣にある最新版をダウンロードします。

ダウンロードしてきたファイルの拡張子は、.7zとなっています。この拡張子.7zのファイルは、「7-Zip」という圧縮・展開ツールを使用して、ファイルを解凍(展開)できます。

次に、ダウンロードしてきたファイルを、適宜フォルダで解凍します。解凍すると、下記のようなフォルダ構成になります。

このbinフォルダのフルパスをコピーしてメモっておきます。

実行環境

・windows10
・Python 3.8.5

実装

全体の処理は、下記です。

import os
import sys
from pdf2image import convert_from_path

POPPLER_PATH = r"C:\xxxx\poppler\bin"

def main(file_path_list):
    for file_path in file_path_list:
        folder_name = os.path.dirname(file_path)
        pdf_file_name = os.path.basename(file_path)
        base_file_name = os.path.splitext(pdf_file_name)[0]

        # PDFをImageに変換
        pages = convert_from_path(file_path, poppler_path=POPPLER_PATH)

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

if __name__ == '__main__':
    args = sys.argv

    # 引数2つ目以降処理する
    main(args[1:])

順番に処理の内容を説明します。

①コマンドラインから渡されたファイル名を取得

args = sys.argv

sys.argvは、リスト型でコマンドラインから渡された引数が格納されます。リストの1番目は、実行ファイル名となるため、2番目以降をPDFファイルのパス名として処理を行います。

 def main(file_path_list):
    for file_path in file_path_list:

②PDFファイルパスから、フォルダ名、ファイル名、ベースネームを取得

PDFファイルのパス名より、フォルダ名を取得するには、os.path.dirnameメソッドを使用します。

folder_name = os.path.dirname(file_path)

次に、PDFファイルのパス名より、ファイル名を取得するには、os.path.basenameメソッドを使用します。

pdf_file_name = os.path.basename(file_path)

最後に、ファイル名から拡張子を除いたベースネーム名を取得するには、os.path.splitextメソッドを使用します。
os.path.splitextメソッドの戻り値は、リスト型となります。リストの1番目は拡張子なしのベースネーム、2番目は拡張子が取得できます。

base_file_name = os.path.splitext(pdf_file_name)[0]

③PDFファイルを画像オブジェクトに変換

convert_from_path関数を使用して、PDFファイルを画像オブジェクトに変換します。

convert_from_path関数で、先ほどダウンロードしたpopplerを使用するため、指定の方法が2つあります。

1.環境変数のPATHに、poppler\binのフォルダパスを追加する

2.convert_from_path関数のキーワード引数:poppler_pathにpoppler\binのフォルダパスを指定する

今回は、2つめの方法で指定しています。

pages = convert_from_path(file_path, poppler_path=POPPLER_PATH)

次に、convert_from_path関数の戻り値は、PDFファイルの1ページごとの画像オブジェクトとなっています。この画像オブジェクトは、PillowライブラリのImageオブジェクトです。
この画像オブジェクトを、ファイル名を指定して保存します。

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

なお、画像を保存するImage.saveメソッドは、保存されるファイルのフォーマットを、引数で指定されたファイル名の拡張子から自動的に判別します。
今回は、png形式で保存しています。

まとめ

今回は、Pythonで、PDFファイルをページごとに画像ファイルに変換する処理を実装しました。
PDFを画像に変換するには、有料のPDF編集ソフト、もしくはWebサイトのサービスを使用することになります。Pythonだと無料でツールを作ることができ、かつ保存するフォーマットやファイル名のルールも自分で決められるので、便利ですね。

参考サイト


この記事が気に入ったらサポートをしてみませんか?