PythonでPDFから画像を保存する
今回はPDFからpythonで画像を保存する方法を説明しようと思います。
PDFから画像を直接保存することもできますが、何故か保存できないこともあります。
そういう時に、画面に表示されている状態を画像に保存する方法もご紹介しようと思います。
外務省の世界各国の旗を保存してあるPDFをターゲットに実行していきたいと思います。
PDFから画像を保存する方法は2通りあります。
1,PDFに埋め込んである画像を保存する
2,PDFのページを画像として保存する
この2通りについて紹介しようと思います。
ライブラリのインストール
最初に使用するライブラリをインストールします。
pymupdf と opencv-python をインストールしてください
pip install pymupdf opencv-python
1,PDFに埋め込んである画像を保存する
PDFに埋め込んである画像を保存します。(一番下に完全なコードを載せておきます)
def extract_images_from_pdf(pdf_path, output_folder):
"""
PDFから埋め込まれた画像を抽出して保存する。
"""
doc = fitz.open(pdf_path)
os.makedirs(output_folder, exist_ok=True)
for page_num in range(len(doc)):
page = doc[page_num]
for img_index, img in enumerate(page.get_images(full=True)):
xref = img[0]
base_image = doc.extract_image(xref)
image_bytes = base_image["image"]
image_ext = base_image["ext"]
image_filename = os.path.join(output_folder, f"page{page_num+1}_img{img_index+1}.{image_ext}")
with open(image_filename, "wb") as f:
f.write(image_bytes)
print(f"埋め込み画像を保存しました: {output_folder}")
今回この方法で保存するとこれだけしか保存されません。

2,PDFのページを画像として保存する
PDFの見えているページを画像として保存します。
def render_pages_as_images(pdf_path, output_folder, dpi=200):
"""
PDFの各ページを画像としてレンダリングし保存する。
"""
doc = fitz.open(pdf_path)
os.makedirs(output_folder, exist_ok=True)
for page_num in range(len(doc)):
page = doc[page_num]
pix = page.get_pixmap(dpi=dpi) # DPIを指定してレンダリング
image_filename = os.path.join(output_folder, f"page{page_num+1}.png")
pix.save(image_filename)
print(f"ページ画像を保存しました: {output_folder}")

ようやく全体の画像が保存されました。
全体のプログラムは次のようになります。
ファイルパスは自分の環境にあったものに書き換えてください。
# 入力PDFファイル
pdf_path = "P:\\programming\\Python\\Image\\national_flags_list.pdf"
# 一時的に画像を保存するフォルダ
temp_image_folder = "P:\\programming\\Python\\Image\\images\\temp"
# 国旗を保存するフォルダ
output_flag_folder = "P:\\programming\\Python\\Image\\images\\flags"
# ステップ1: PDFから埋め込み画像を抽出
extract_images_from_pdf(pdf_path, temp_image_folder)
# ステップ2: PDFの各ページを画像としてレンダリング
render_pages_as_images(pdf_path, temp_image_folder)