医師国家試験をデータベース化する(5)

別冊の pdf から画像データを抽出します。

別冊の pdf ファイルから画像を抽出

国家試験問題は、文章だけの問題と画像だけの pdf があって、問題を提示するためには画像を抽出する必要があります。

Word に何らかの画像を貼り付けて素直に pdf としてエクスポートすると画像として抽出できるはずです。


import fitz
import os

filename = '/home/mituo/ドキュメント/医師・看護師国試/Doctor/pdf/117/A2.pdf'
dir_name = filename.split('.')[0]
img_dir = os.path.join(os.getcwd(),dir_name) 
if os.path.isdir(img_dir) == False:
    os.mkdir(img_dir)

doc = fitz.open(filename)
images = []

for page in range(len(doc)):
    images.append(doc[page].get_images())

for pageNo, image in enumerate(images):
    if image != []:
        for i in range(len(image)):
            xref = image[i][0]
            smask = image[i][1]
            if image[i][8] == 'FlateDecode':
                ext = 'png'
            elif image[i][8] == 'DCTDecode':
                ext = 'jpeg'
            pix = fitz.Pixmap(doc.extract_image(xref)["image"])
            if smask > 0:
                mask = fitz.Pixmap(doc.extract_image(smask)["image"])
                pix = fitz.Pixmap(pix, 0) 
                pix = fitz.Pixmap(pix, mask)
            img_name = os.path.join(img_dir, f'image{pageNo+1}_{i}.{ext}')
            print(img_name)
            pix.save(img_name)

これはネットから頂いたもので 100 % 理解できているわけではありませんが、きちんと動作します。

画像のサイズを揃える

上のようにして抽出した画像は「.png」ファイルで、大小が不揃いです。


-rw-rw-r-- 1 mituo mituo   44K  1月 31 15:53 image23_1.png
-rw-rw-r-- 1 mituo mituo   84K  1月 31 15:53 image23_2.png
-rw-rw-r-- 1 mituo mituo  536K  1月 31 15:53 image24_0.png
-rw-rw-r-- 1 mituo mituo  2.9M  1月 31 15:53 image25_0.png

これを、少なくとも画像の横幅を揃えます。
以下のようなシェルスクリプトを作成します。


#!/bin/sh

for file in `\find ./before -maxdepth 4 -name '*.png'`; do
    faname_ext="${file##*/}"
    fname="${faname_ext%.*}"
    echo $fname
    ffmpeg -i $file -vf "scale=600:-1" -q 2 ./after/$fname.jpg
done

アプリを作成して問題文の中に画像を提示するつもりですが、そのためには問題番号と画像をリンクさせる必要があります。

実行結果

実行すると以下のような画像が抽出されます。

これは、横幅を 600 px に揃えたものです。

python はすごい。