😎
論文(PDF)から画像を抽出する
概要
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
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.
Pixmapsとは?
Pixmaps (“pixel maps”) are objects at the heart of MuPDF’s rendering capabilities.
参考にしたサイト
Discussion