社会人研究者が色々頑張るブログ

pythonで画像処理やパターン認識をやっていきます

pythonでPDFから画像を抽出する

はじめに

論文のサーベイを効率化するツールを作成しています。
今回は論文のpdfファイルから図を抽出してみたいと思います。

f:id:nsr_9:20211106231327p:plain

nsr-9.hatenablog.jp

PyMuPDFで画像の取得

前回の記事ではPDFからテキストを抽出するために、pdfminer.sixというライブラリを使用していました。
nsr-9.hatenablog.jp

前回使ったpdfminer.sixではjpeg以外の画像が抽出できないようなので別のライブラリを使用します。
今回使うpymupdfもpdfを扱えるライブラリなのですが、より多様な機能を扱えるようです。

公式のgifhubを参照するとPDFに対して以下が行えるようです。

ドキュメントの復号化
メタ情報、リンクそしてブックマークにアクセスできる
ラスターフォーマット(PNG等)やベクターフォーマット(SVG)をレンダリングする
テキストを検索する
テキストと画像を抽出する
PDF, HTML, XML, JSON, Textを他の形式に変換する
tesseractがインストールされている場合、光学文字認識を実行する
GitHub - pymupdf/PyMuPDF: Python bindings for MuPDF's rendering library.

pipで簡単にインストールすることが出来ます。

pip install pymupdf

ライブラリをimportする時はちょっと注意が必要です。

import fitz

pymupdfでなくfitzという名前になっているみたいですね。(なんででしょうか?)

画像を抽出するサンプルコードを以下に記載します。

import fitz
import sys
import os


path = sys.argv[1]
reader = fitz.open(path)
out_path = "./out/"
os.makedirs(out_path, exist_ok=True)
for p, page in enumerate(reader):
    images = page.get_images()
    for i, imgf in enumerate(images):
        meta = reader.extract_image(imgf[0])
        # 画像のフォーマット(.jpgとか.pngとか)
        fmt = meta["ext"]
        # 画像のバイナリ
        imgb = meta["image"]
        f = open(out_path+str(p)+"_"+str(i)+"."+fmt, "wb")
        f.write(imgb)
        f.close()

直感的に利用できる様な実装になっていますね。
これを使うと次の様な出力を得ます。

PDFファイル 抽出された画像
f:id:nsr_9:20211106230808p:plain f:id:nsr_9:20211106230836p:plain

いい感じにPDFから画像が抽出されましたね!