【Python】pdf2imageでFileNotFoundErrorになったときの対処方法(Windows)

pdf2imageでPDFをpng画像にしてみる

pythonでPDFから画像ファイルを作る場合、pdf2imageというライブラリを使用することが多いかと思います。

Windows10環境において、以下のコードを書き、私もやってみました。

from pdf2image import convert_from_path
from pathlib import Path

pdf_path = Path("\\pdffiles\\target.pdf")
print(str(pdf_path))
pages = convert_from_path(str(pdf_path), 150)

for i, page in enumerate(pages):
    out_file_name = pdf_path.stem + "_{:02d}".format(i + 1) + ".png"
    page.save(out_file_name, "PNG") 

このように記述したところ、「convert_from_path」で、

“FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。"

のエラーが発生しました。

ファイルパスを確かめても確かにPDFファイルが存在します。なぜでしょう?

原因:pdf2imageはPopperというCUIツールに依存

pdf2imageはpopperというPDFから画像を生成するためのコマンドラインツールに依存しており、その導入と環境変数設定が足りていなかったようです。

それを「FileNotFoundError」で気が付くのは難しいと思うのですが・・・

対処: popperの実行ファイルをダウンロードし、パスを通す

以下のリンクから最新版のPopperをダウンロードします。

https://blog.alivate.com.au/poppler-windows/

7z圧縮でした。解答するツールが無い方は7zip等をインストールして解凍してください。

調べてみると、Windowsの環境変数の設定で解凍された中身のbinフォルダにパスを通す例が多いのですが、このやり方だと設定したことを忘れてしまい、他の環境で動かせない可能性があります。

それが嫌だったので、スクリプトコード内で都度環境変数を設定する方法にしました。

まず、解凍されたフォルダごとスクリプトがあるフォルダに入れてしまいます。

スクリプトに以下のコードを追加し、一時的に環境変数を設定します。

import os

#環境変数追加
cwd = os.getcwd()
bin_path = os.path.join(cwd, 'poppler-0.68.0','bin')
os.environ['PATH'] = '{};{}'.format(bin_path, os.environ['PATH'])

これにより、エラーが解決されました。全体のコードは以下のとおりです。

from pdf2image import convert_from_path
from pathlib import Path
import os

#環境変数追加
cwd = os.getcwd()
bin_path = os.path.join(cwd, 'poppler-0.68.0','bin')
os.environ['PATH'] = '{};{}'.format(bin_path, os.environ['PATH'])

#PDF→PNG
pdf_path = Path("\\pdffiles\\target.pdf")
print(str(pdf_path))
pages = convert_from_path(str(pdf_path), 150)

for i, page in enumerate(pages):
    out_file_name = pdf_path.stem + "_{:02d}".format(i + 1) + ".png"
    page.save(out_file_name, "PNG") 

以上です。

PythonPython

Posted by shomin