複数のpdfを一括で画像(JPEGやPNG)に変換する方法【Python】

ブログ

みなさんこんにちは!クフルダモノーツYoshito Kimura(k1mu)です!

 

音楽をやっていると、楽譜のpdf画像(PEGやPNG)ファイルに変換したいときがあります。

Adobeユーザーなら、Acrobatを使えば「pdfを書き出し」から変換できます。

【無料】Adobe Acrobat Reader をダウンロード | Adobe Acrobat
Acrobat ReaderはPDFの表示以外に、コメント追加や電子契約(月2回まで)も可能です。PDFの編集、変換やパスワード設定には有料のAcrobat DCをご利用ください。

しかし…!複数のpdfでそれをやるのは地味に面倒です。

そして、「Pythonでなんとかできないか…」と思ってネットで検索しても
なかなかドンピシャな記事が出てこなかったので、忘備録にこの記事を書きました。

Pythonについては↓

Pythonを使った変換のやり方

「pdf2image」ライブラリをインストールする

Pythonでpdfを変換するためには「pdf2image」ライブラリが必要です。
pipでインストールします。

 pip install pdf2image

※Pythonの代表的な画像を処理するためのパッケージ 「pillow」も必要です。
しかし、無い場合は一緒にインストールしてくれるみたいです。

「poppler」をダウンロードする

pdf2imageを使うには「poppler」というコマンドラインツールが必要のようです。

そこで、最新バージョンの「poppler」のZipファイルをダウンロードしてください。

Windowsの方はこちらこちらから。
Macの方はこちらから

※僕はWindowsでしか試していません。

Zipファイルを解凍をする

ダウンロードが終わったら、Laplace7Zipなどを使って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 = pdf_path.stem + "_{:02d}".format(i + 1) + ".png"
        image_path = 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)

#変換したい拡張子の情報をインプット関数で受け取る
extension_name = input('jpeg→「j」、png→「p」を入力してください。')

#拡張子の条件分岐
if extension_name == 'j':
    extension = 'jpeg'
else:
    extension = '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 = pdf_path.stem + "_{:02d}".format(i + 1) + "." + extension 
        image_path = image_dir / file_name
        # PNGで保存
        page.save(str(image_path), extension)

 

ちなみに、こんな感じで「last_page=1」とすると各pdf1ぺージ目だけを画像に変換できます。

    pages = convert_from_path(str(pdf_path), dpi=150 , last_page=1)

このページを見ると、他にも色々な引数を設定できるみたいですね。

Reference — pdf2image latest documentation

GitHub
Yoshito924/pdf_to_image
Python script to convert pdf to png or jpeg(pdfをpngやjpegに変換するPythonのスクリプト) - Yoshito924/pdf_to_image

参考にさせていただいたページ

PythonでPDFを画像ファイル(JPEG、PNG)に変換する方法 | ガンマソフト株式会社
今回はPDFを画像ファイル(JPEG、PNG)にPythonで変換する方法をご紹介します。 PDFを画像ファイルに変換するには、通常は有料のAdobe® Acrobat®などのソフトを...
Windowsの環境パスを通す(path)
Windowsで環境パスの通し方の解説。
Pythonで条件を満たすパスの一覧を再帰的に取得するglobの使い方 | note.nkmk.me
Pythonのglobモジュールを使うと、ワイルドカード*などの特殊文字を使って条件を満たすファイル名・ディレクトリ(フォルダ)名などのパスの一覧をリストやイテレータで取得できる。glob --- Unix 形式のパス名のパターン展開 — Python 3.7.1rc1 ドキュメント globモジュールは標準ライブラリ...
PDFファイルの画像ファイルへの変換 - Qiita
はじめに PDFから画像ファイルへの変換について調べたので、その備忘録として記載します。 参考 PythonでPDFを画像ファイル(JPEG、PNG)に変換する方法 Install の方法 【Python】PDFと画像の...
タイトルとURLをコピーしました