みなさんこんにちは!みやしんです。
今回はPDFファイルの中から写真や画像だけを簡単に切り抜く方法をご紹介します!
論文などのページ数が大量なPDFでもOKです!
今回はPyMuPDFというライブラリを使います。これを使えば簡単に切り抜きできちゃいます!
では、早速始めていきましょう!^^

Pythonは便利なライブラリが多いにゃ!
この記事で出来ること
PDFファイルから写真や画像を自動で切り抜く+保存します。
例えば、このPDFでやってみます!
月面の環境 (レゴリスを中心に) JAXA宇宙教育センター ※1Pのみ抜粋/全15ページ

<掲載先>
https://edu.jaxa.jp/contents/other/himawari/pdf/2_moon.pdf
<切り抜き結果>
こんな感じでPDF内の写真や画像を切り抜いて、フォルダ内に全て保存します。

では早速始めてみましょう!
PyMuPDFをインストール
下記のコマンドでインストールします。
> pip install PyMuPDF
フォルダ構成とサンプルコード
フォルダー構成はこちらです!

サンプルコードです。
# PyMuPDFライブラリのfitzをインポート
import os, sys, fitz
def crop_img(pdf_path):
doc = fitz.open(pdf_path)
# 画像を格納するためのフォルダを作成
img_dir = os.path.dirname(pdf_path) + '/CropImage'
os.mkdir(img_dir)
# imageの抽出と保存
images = []
for page in doc:
# doc.get_page_images:ページ毎の画像のリスト, page.number:(ページ数-1)
images.extend(doc.get_page_images(page.number))
# i=INDEX, image=切り抜いた画像
for i, image in enumerate(images):
img = doc.extract_image(image[0]) # 画像データとメタ情報を辞書型で抽出
img_name = img_dir + '/' + 'image_' + str(i) + '.png'
img_file = open(img_name, 'wb')
img_file.write(img['image']) # img['image']:画像データ
img_file.close()
if __name__ == "__main__":
# コマンドライン引数を使う
args = sys.argv
# command: python CropImg.py [pdf_path] => python CropImg.py ./MoonEnv.pdf
# args[0]はこのファイル名(CropImg.py)
# args[1]はpdf_path
pdf = args[1]
crop_img(pdf)
下記のコマンドで CropImg.pyを実行します。
> python CropImg.py ./MoonEnv.pdf
python CropImg.py [PDFファイルのパス] でPDFファイルパスをコマンド引数で渡します。
これでPDFファイルから写真や画像を抽出できたと思います。
追記:抽出した画像と元の画像を比較
抽出した画像と元のPDF画像を比較してみました!

PC画面上に大体同じ大きさにして並べています。
左:元画像(PDF) 右:切り抜き画像(PyMuPDF) です。
色合いは殆ど同じに見えますね。
右の切り抜き画像は、426×212pixel (90,312pixel)です。解像度はPDFの時のままで切り抜かれていそうです。しかし、切り抜き画像の方がスムージングが掛かっているというか画像が滑らかになっています。元画像はpixelの四角がちょっと目立つ感じです。
切り抜いた方がキレイになった気がしますね!
こちらの記事もおススメです!

コメント