pythonでPDFから画像を抽出する
はじめに
論文のサーベイを効率化するツールを作成しています。
今回は論文のpdfファイルから図を抽出してみたいと思います。
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ファイル | 抽出された画像 |
---|---|
いい感じにPDFから画像が抽出されましたね!