よし呟こう

思ったことを呟きます。

Windows/Mac Python3(pdf2image+poppler)でpdfを画像に変換するメモ

Python3 では pdf2image なるパッケージを使うことで、pdfファイルを画像に変換することが可能です。その際には poppler というコーデックを別途でインストールする必要があるのですが、適当にインストールすると pdf2image が poppler を認識してくれません。しかも、WindowsMac で導入に若干の違いがあります。

このメモは pdf2image と poppler の導入から pdf を画像に変換するところまでを書きます。

自己責任でお願いします


Axifofの環境

私は古いバージョン(python 3.7.5)を使っています。そのため、pipのバージョンも古いです。しかし、最新版でも問題ありません。



セットアップ

やることは4つです。

1. pdf2image のインストール

# pip でインストールする場合
# 参照:https://pypi.org/project/pdf2image/
pip install pdf2image

# Anaconda でインストールする場合
# 参照:https://anaconda.org/conda-forge/pdf2image
conda install -c conda-forge pdf2image

問題なくインストールできると思います。Anaconda Navigator からインストールする場合、検索窓で "pdf2image" など検索してもヒットしません。この場合は、

  1. Anaconda Navigator から terminal を起動(Enviroments タブの "▶︎"(三角)マーク から "terminal" をクリックすれば起動できます)
  2. 上記コマンドの入力と実行

あるいは Jyupter 上で上記コマンドを実行すれば良いです(これは Mac 上でのみ確認しました)。



2. poppler のインストール

共通

自力でコンパイルすることができる人は、Poppler から最新版の「poppler-X.XX.X.tar.xz」なるファイルをダウンロード・解凍してコンパイルしてください。path をメモしておいてください。

2020/07/15 現在で poppler の最新版は 0.90.1 でした。


Windows の場合

バージョンは今となっては結構古くなりますが、コンパイルが面倒とか、とにかく使えれば良いということでしたら、Poppler for Windows からバイナリファイルをダウンロードできます。解凍して path をメモしておいてください。

2020/07/15 現在で poppler の最新版は 0.90.1 ですが、この方法で導入すると 0.68.0 になります。


Mac の場合

poppler は Python のパッケージではないので別途インストールが必要です。homebrew を使いますので、そちらのセットアップがまだの人はそちらのセットアップを済ませておいてください。

brew install poppler

これで poppler を導入できます。詳細はMac App Storeを参照ください1
Windows はテスト環境として持っているだけで、メインで使っておらず、詳しくないのでよくわかりませんが、cygwin などで homebrew とかって使えましたっけ。もし使えるならばこの方法によって、Windowsでも最新版のインストールができると思います。

なお、私が poppler を導入したのはもう4ヶ月以上前なので、以下で示される poppler のバージョンは 0.88.0 です笑。



3. poppler の移動

ここでは 2. で「Macの場合」で導入した場合の処理を書きます。それ以外の場合は、すでに path がわかっているので読む必要はありません。

poppler を pdf2image パッケージから呼び出すために、直接環境変数を設定しても良いのですが、おそらくバージョンによってインストール先が違うために以下の手順でバイナリファイルを探す必要があります。

また、Anaconda で pdf2image を使う場合には Anaconda にインストールされた pdf2image の参照先の問題で(これもバージョンに依存すると思いますが)環境変数に設定しても認識されないことがあるようです(未検証)。その場合も下の手順でパスを確認する必要があります。

  1. finder で poppler で検索。Mac全体で探します。
  2. poppler のフォルダから バイナリファイル がある方の poppler のフォルダを見つける
  3. バイナリファイル がある方の poppler のフォルダをコピーして持ってくる、あるいは path をメモしておく

参考までに私の場合は

/usr/local/Cellar/poppler/0.88.0/bin

でした。最終的に pyinstaller や cx_freeze などでアプリケーション化する場合は、本体ファイルをあらかじめ取り出しておくほうが何かと都合が良いので、バイナリファイル がある方の poppler のフォルダを作業フォルダにコピーしておくことをお勧めします。



 

4. pdf2image に path を渡す、pdf を画像に変換する

os ライブラリで一時環境変数を与えても良いですがここでは上記手段で取得した path を直接与えます。あるいは poppler バイナリファイル入りのフォルダー path を与えます。

import pathlib
import pdf2image

pdf_paths = pathlib.Path('input').glob('*.pdf')
output_dir = pathlib.Path('output')

for pdf_path in pdf_paths:
    base = pdf_path.stem
    images = pdf2image.convert_from_path(pdf_path, poppler_path='/usr/local/Cellar/poppler/0.88.0/bin')
    for index, image in enumerate(images):
        image.save(output_dir/pathlib.Path(base + '-{}.png'.format(index + 1)))

9行目の

pdf2image.convert_from_path( ... )

で pdf を画像に変換できます。詳しい引数についてはpdf2image's documentationを参照ください。ここで、引数 "poppler_path" で path を与えます;10行目の

poppler_path='/usr/local/Cellar/poppler/0.88.0/bin'

のように path を指定します。これは導入の仕方と poppler のバイナリファイル入りフォルダーの扱い方次第なので一概にこうなるわけではないです。

お勧めの path の与え方としては、poppler のバイナリファイルが入ったフォルダをコピーして作業ディレクトリに入れておくことです。

|- poppler
|- main.py

上のような構成を考えます。この場合は指定する path が

poppler_path='poppler/0.88.0/bin'  # Macの場合

あるいは

poppler_path=''poppler/bin"  # Windowsの場合

で済むので楽です。

9行目の

images = pdf2image.convert_from_path( ... )

ですが、

type(images[0])
# <class 'PIL.PpmImagePlugin.PpmImageFile'>

でした。Pillow を使っているみたいですね。


  1. リンク先の名前が Mac App Store となっていますが、おそらく Apple とは関係ない気がします。