別冊の 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 はすごい。