pdfを画像(PEGやPNG)ファイルに変換したいとき、ありますよね。
Adobeユーザーなら、Acrobatを使えば「pdfを書き出し」から変換できます。
しかし…!複数のpdfでそれをやるのは地味に面倒です。
そして、「Pythonでなんとかできないか…」と思ってネットで検索しても、なかなかドンピシャな記事が出てこなかったので、忘備録にこの記事を書きました。
GitHub
GitHubに以下で紹介するコードを公開しています。
お手元のPCにPythonと「pdf2image」が入っていれば、git cloneしてすぐ使えます。(多分)
具体的なやり方
「pdf2image」ライブラリをインストールする
Pythonでpdfを変換するためには「pdf2image」ライブラリが必要です。
pipでインストールします。
pip install pdf2image
※Pythonの代表的な画像を処理するためのパッケージ 「pillow」も必要です。
しかし、無い場合は一緒にインストールしてくれるみたいです。
「poppler」をダウンロードする
「pdf2image」を使うには「poppler」というコマンドラインツールが必要のようです。
そこで、最新バージョンの「poppler」のZipファイルをダウンロードしてください。
※僕はWindowsでしか試していません。
Zipファイルを解凍をする
ダウンロードが終わったら、Laplaceや7Zipなどを使ってZipファイルを解凍します。
そして、別途「poppler」という名前のフォルダを作ります。
この「poppler」の中に、解凍したZipファイルに入っている「bin」と「include」と「lib」と「share」をコピーして入れます。
プロジェクトフォルダを作る
そして、以下の構成のフォルダを作ります。
PdfToImage
├ image_file ←変換した画像ファイルが出力されるフォルダ
├ pdf_file ←変換したいpdfを入れるフォルダ
├ poppler ←ダウンロードしたpopplerの中身を入れるフォルダ
│ ├ bin
│ ├ include
│ ├ lib
│ └ share
└ pdf_to_image.py ←Pythonの実行ファイル
最終的に「PdfToImage」フォルダの中身がこんな感じになるイメージです。↓
Pythonのプログラムを書く
色々な書き方があると思いますけど…僕はこんな感じで書きました。
import os
from pathlib import Path
from pdf2image import convert_from_path
import glob
# poppler/binを環境変数PATHに追加する
poppler_dir = Path(__file__).parent.absolute() / "poppler/bin"
os.environ["PATH"] += os.pathsep + str(poppler_dir)
# PDFファイルのパスを取得し順番に捌いていく
for x in glob.glob("./pdf_file/*.pdf"):
pdf_path = Path(x)
# pdfから画像に変換
pages = convert_from_path(str(pdf_path), dpi=150)
# 画像ファイルを1ページずつ保存
image_dir = Path("./image_file")
for i, page in enumerate(pages):
file_name = f'{pdf_path.stem}_{i + 1}.png'
image_path = f'{image_dir}/{file_name}'
# PNGで保存
page.save(str(image_path), "PNG")
これで変換したいpdfを「pdf_file」の中に入れた後に、pyファイルを実行するだけで一括で画像ファイルに変換できます。便利だ―!\(^o^)/
※このプログラムはPNGファイルに変換する用です。「png」を「jpeg」にすればJPEGに変換できます。
※convert_from_path()関数の「dpi=○○」の数値で解像度を変更できます。
「png」を「jpeg」どちらへも変換したい人で、プログラムを書き替えるのが面倒な人は、「png」用と「jpeg」用のプログラムをそれぞれ作るか、if文で条件分岐を書いてプログラムを実行時に選べるようにしても良いかもしれません。↓
import os
from pathlib import Path
from pdf2image import convert_from_path
import glob
# poppler/binを環境変数PATHに追加する
poppler_dir = Path(__file__).parent.absolute() / "poppler/bin"
os.environ["PATH"] += os.pathsep + str(poppler_dir)
# 変換したい拡張子の情報をinput関数で受け取る
file_extension = input('jpeg→「j」、png→「p」を入力してください。')
# 拡張子の条件分岐
if file_extension == 'j':
file_extension_name = 'jpeg'
else:
file_extension_name = 'png'
# PDFファイルのパスを取得し順番に捌いていく
for x in glob.glob("./pdf_file/*.pdf"):
pdf_path = Path(x)
# pdfから画像に変換
pages = convert_from_path(str(pdf_path), dpi=150)
# 画像ファイルを1ページずつ「image_file」に保存する。
image_dir = Path("./image_file")
for i, page in enumerate(pages):
# ファイルネームを決定する。
file_name = f'{pdf_path.stem}_{i + 1}.{file_extension_name}'
image_path = f'{image_dir}/{file_name}'
# PNGで保存
page.save(image_path, file_extension_name)
ちなみに、こんな感じで「last_page=1」とすると各pdfの1ぺージ目だけを画像に変換できます。
pages = convert_from_path(str(pdf_path), dpi=150 , last_page=1)
このページを見ると、他にも色々な引数を設定できるみたいですね。