見出し画像

[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だと無料でツールを作ることができ、かつ保存するフォーマットやファイル名のルールも自分で決められるので、便利ですね。

参考サイト


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

ピックアップされています

Python

  • 34本

コメント

ログイン または 会員登録 するとコメントできます。
[Python] PDFファイルを画像ファイルに変換する|こはた
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1