😎

論文(PDF)から画像を抽出する

2021/06/09に公開

概要

Why?

論文の画像をトリミングしたり、保存したりするのがめんどくさい

How?

pythonをもちいて画像を抽出、保存

What?

コマンド実行後のディレクトリの変化

# before
.
├── references
│   └── paper.pdf
├── tools
│   ├── Pipfile
│   ├── Pipfile.lock
│   └── img_frm_pdf.py

# command
$python img_frm_pdf.py ../references/paper.pdf

# after
.
├── references
│   ├── image
│   │   ├── image_0.png
│   │   ├── image_1.png
│   │   ├── image_2.png
│   │   ├── image_3.png
│   │   ├── image_4.png
│   │   └── image_5.png
│   └── paper.pdf
├── tools
│   ├── Pipfile
│   ├── Pipfile.lock
│   └── img_frm_pdf.py

こんな感じで、画像が保存されます.

今後の予定:

  • 下のようなディレクトリの構成にしたい
.
.
├── references
│   ├── (paper_title)
│   │   ├── image
│   │   │   ├── image_0.png
│   │   │   ├── image_1.png
│   │   │   ├── image_2.png
│   │   │   ├── image_3.png
│   │   │   ├── image_4.png
│   │   │   └── image_5.png
│   │   └── paper.pdf
  • 画像だけではなく、表も保存できるようにしたい
  • 画像+画像のキャプション、表、グラフのみのpdfを出力したい

実装

使うpackage

  • PyMuPDF
pip install PyMuPDF

PyMuPDF Documentation

import os, sys, fitz

def extract_img(pdf_path):
  doc = fitz.open(pdf_path)
  # make directory for image
  img_dir = os.path.dirname(pdf_path) + '/image'
  os.mkdir(img_dir)
  # imageの抽出と保存
  images = []
  for page in doc:
    images.extend(doc.get_page_images(page.number))
  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_file.close()

if __name__ == "__main__":
  args = sys.argv
  # command: python this_filename pdf_path
  pdf = args[1]
  extract_img(pdf)

改善点あったら教えてください!

知らなかった用語集

MuPDFとは?

MuPDF is a lightweight PDF, XPS, and E-book viewer.

https://mupdf.com/

Pixmapsとは?

Pixmaps (“pixel maps”) are objects at the heart of MuPDF’s rendering capabilities.

https://pymupdf.readthedocs.io/en/latest/pixmap.html#pixmap

参考にしたサイト

https://qiita.com/kzrn3318/items/600654e909854ae4ad92

Discussion