JA EN

PDF から画像を抽出する方法 - ツール別完全ガイド

· 約 9 分で読めます

PDF 内の画像構造を理解する

PDF から画像を正しく抽出するには、まず PDF ファイル内で画像がどのように格納されているかを理解する必要があります。PDF は単なる画像の集合ではなく、テキスト、ベクターグラフィックス、ラスター画像、フォントなどを統合した複合ドキュメント形式です。

PDF 内の画像格納方式:

抽出時の注意点:

抽出方法の選択は、「元の画像データをそのまま取り出したい」のか「ページの見た目を画像化したい」のかで大きく異なります。前者は埋め込み画像の抽出、後者はページのレンダリング (ラスタライズ) です。

コマンドラインツールによる抽出

コマンドラインツールは、大量の PDF からの一括抽出やスクリプトへの組み込みに最適です。代表的なツールの使い方を解説します。

pdfimages (Poppler ユーティリティ):

PDF 内の埋め込み画像をそのまま (再圧縮なしで) 抽出する最も信頼性の高いツールです。

pdftoppm (ページ全体のラスタライズ):

Ghostscript:

Python による画像抽出

Python を使えば、画像抽出のロジックをカスタマイズし、後処理 (リネーム、フィルタリング、変換) と組み合わせた柔軟なワークフローを構築できます。

PyMuPDF (fitz) - 推奨:

高速で機能豊富な PDF 操作ライブラリです。画像の抽出が非常に簡単に行えます。

import fitz
doc = fitz.open("document.pdf")
for page_num in range(len(doc)):
page = doc[page_num]
images = page.get_images(full=True)
for img_index, img in enumerate(images):
xref = img[0]
base_image = doc.extract_image(xref)
image_bytes = base_image["image"]
image_ext = base_image["ext"]
with open(f"page{page_num+1}_img{img_index+1}.{image_ext}", "wb") as f:
f.write(image_bytes)

PyMuPDF の利点:

pdf2image (Poppler ラッパー):

ページ全体を画像化する場合に便利です。内部で pdftoppm を呼び出します。

from pdf2image import convert_from_path
images = convert_from_path("document.pdf", dpi=300)
for i, image in enumerate(images):
image.save(f"page_{i+1}.png", "PNG")

大量ページの PDF を処理する場合は、first_pagelast_page パラメータでページ範囲を指定し、メモリ使用量を制御してください。

GUI ツールとオンラインサービス

コマンドラインやプログラミングに不慣れなユーザー向けに、GUI ツールとオンラインサービスを紹介します。ただし、機密文書の場合はオンラインサービスの利用を避け、ローカルツールを使用してください。

デスクトップ GUI ツール:

オンラインサービス (機密文書には非推奨):

オンラインサービス利用時の注意:

抽出画像の品質を最大化するテクニック

PDF から抽出した画像の品質を最大限に保つためのテクニックと、よくある問題への対処法を解説します。

品質を維持するための原則:

よくある問題と対処法:

スキャン PDF の場合:

スキャン PDF はページ全体が 1 枚の画像であるため、「画像の抽出」と「ページのレンダリング」が同義になります。pdftoppm -r 300 または PyMuPDF の page.get_pixmap(dpi=300) で高解像度に出力してください。

バッチ処理と自動化スクリプト

大量の PDF ファイルから画像を一括抽出する場合のバッチ処理スクリプトと、実務で役立つ自動化パターンを紹介します。

シェルスクリプトによるバッチ処理:

#!/bin/bash
for pdf in *.pdf; do
dir="${pdf%.pdf}"
mkdir -p "$dir"
pdfimages -all "$pdf" "$dir/img"
done

このスクリプトは、カレントディレクトリの全 PDF ファイルについて、PDF 名のフォルダを作成し、その中に画像を抽出します。

Python による高度なバッチ処理:

以下のようなカスタマイズが可能です:

実務での活用パターン:

注意事項:

関連記事

大量画像の一括処理ワークフロー - 効率的なバッチ処理の設計と実装

数百〜数千枚の画像を効率的に一括処理するワークフローの設計方法を、コマンドラインツールとスクリプトの実例で解説します。

画像フォーマット比較表 - JPEG/PNG/WebP/AVIF/GIF/BMP の特徴と使い分け

主要な画像フォーマット 6 種類の技術的特徴を比較。圧縮方式、対応色深度、透過、アニメーション、ブラウザ対応状況を一覧表で整理し、用途別の最適な選択を解説します。

動画からのフレーム抽出テクニック

FFmpeg やブラウザ API を使った動画フレーム抽出の実践ガイド。シーン検出、キーフレーム抽出、バッチ処理の手法を網羅します。

ステガノグラフィ入門 - 画像に情報を埋め込む技術の仕組みと応用

画像ステガノグラフィの基本原理から実装方法まで解説。LSB 法、DCT 領域埋め込み、電子透かしとの違い、セキュリティ応用と検出技術を具体的なコード例とともに紹介します。

Web サイトの画像パフォーマンス監査 - Core Web Vitals 改善の実践ガイド

Web サイトの画像がパフォーマンスに与える影響を監査する方法を解説。LCP 改善、CLS 防止、転送量削減の具体的な手法を紹介します。

メール添付用画像の圧縮ガイド - 容量制限を守りつつ画質を保つ方法

メール添付時の画像圧縮テクニックを解説。容量制限内に収めながら画質を維持する具体的な手順と、ビジネスシーン別の推奨設定を紹介します。

関連用語