スキャン文書、製品マニュアル、広告資料など、画像を含む PDF を扱う際に、その中の画像を抽出して保存・認識・再利用したいケースは多くあります。本記事では、Java を用いて PDF から画像を抽出する方法を解説し、基本的な操作から応用的な抽出テクニックまでをご紹介します。画像抽出ツールの開発や、PDF から埋め込み画像を取得したい場合に役立つ、実用的なコード例と詳細な説明を提供します。
目次
環境構築と依存ライブラリ
Java で PDF を直接操作して画像を抽出するのは容易ではありません。PDF 内の画像は圧縮されていたり、エンコード形式が異なったり、複雑な構造の中に埋め込まれている場合があり、標準 API では対応しきれないことが多いです。
Spire.PDF for Java は、PDF 内の埋め込み画像を簡潔な API で正確に抽出できるため、文書処理や画像抽出アプリケーションの構築に最適です。
推奨開発環境:
- JDK 1.6 以上
- Spire.PDF for Java(無料版または商用版)
- 開発ツール:IntelliJ IDEA または Eclipse など
Maven での導入方法:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>11.7.5</version>
</dependency>
簡単な抽出処理のみを行う場合は、無料版の Free Spire.PDF for Java も利用可能です。
PDF 内のすべての画像を抽出する
PdfImageHelper クラスを使用することで、PDF 各ページを走査し、画像情報を抽出できます。このクラスは、埋め込み・インライン画像を自動で識別し、その内容やメタデータ(サイズや位置など)を取得できます。
サンプルコード:
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.utilities.PdfImageHelper;
import com.spire.pdf.utilities.PdfImageInfo;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ExtractAllImagePDF {
public static void main(String[] args) throws IOException {
// PdfDocument インスタンスを作成する
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("input.pdf");
// 画像ヘルパーのインスタンスを作成する
PdfImageHelper imageHelper = new PdfImageHelper();
// 各ページをループして画像を抽出する
for (int i = 0; i < pdf.getPages().getCount(); i++) {
PdfPageBase page = pdf.getPages().get(i);
PdfImageInfo[] imagesInfo = imageHelper.getImagesInfo(page);
for (int j = 0; j < imagesInfo.length; j++) {
BufferedImage image = imagesInfo[j].getImage();
File file = new File("output/Images/Page" + (i+1) + "_Image" + (j+1) + ".png");
ImageIO.write(image, "png", file);
}
}
pdf.close();
}
}
実行前に "output" フォルダを作成しておかないと、IOException が発生します。
説明:
- PdfImageHelper.getImagesInfo() はページ内のすべての画像を配列で返します;
- 各 PdfImageInfo には、画像本体・位置・解像度などのメタ情報が含まれます;
- ImageIO.write() を使えば、PNG・JPG・BMP など任意形式で保存可能です。
この方法はほとんどの画像付き PDF に対応しており、画像リソースを迅速に抽出できます:
ページ全体を画像としてレンダリングしたい場合は、こちらのチュートリアルをご覧ください:Java で PDF を画像に変換する方法
応用テクニック:背景画像や小さなアイコンを除外する
PDF によっては、ウォーターマークやボタン、枠線などの装飾画像が含まれている場合があります。不要な画像を抽出しないよう、以下のような方法で精度を高めることができます。
1. 背景画像をスキップする
背景画像がページの最初の画像として抽出されるケースが多いため、1 枚目をスキップして処理することで除外できます:
for (int i = 1; i < imagesInfo.length; i++) {
BufferedImage image = imagesInfo[i].getImage();
ImageIO.write(image, "PNG", new File("output/image_" + i + ".png"));
}
また、imagesInfo[].getBounds()
を使って画像のサイズや位置を確認し、条件分岐によるフィルタリングも可能です。
2. 小さすぎる画像を除外する
アイコンやボタンなどの小さな画像を除くために、サイズの閾値を設けてフィルタリングします:
BufferedImage image = imagesInfo[i].getImage();
if (image.getWidth() > 200 && image.getHeight() > 200) {
ImageIO.write(image, "PNG", new File("output/image_" + (i+1) + ".png"));
}
閾値は PDF の内容に応じて調整してください。
3. 画像形式を変更したりストリームに出力する
目的に応じて保存形式を選択できます:
ImageIO.write(image, "JPEG", new File("output/image_" + (i+1) + ".jpg")); // 非可逆圧縮で保存
ImageIO.write(image, "BMP", new File("output/image_" + (i+1) + ".bmp")); // 可逆圧縮で保存
- PNG/BMP:元画質を維持し、OCR 用途に最適;
- JPEG:Web 表示や保存容量を抑えたい場合に適しています。
また、画像をバイト配列としてメモリに出力することも可能です:
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(image, "PNG", stream);
補足:PDF の添付ファイルから画像を抽出する
PDF 内に .jpg や .png の添付ファイルとして画像が埋め込まれている場合、以下のガイドをご参照ください:
Java で PDF 添付ファイルを抽出する方法
よくある質問(FAQ)
Java で PDF の画像は抽出できますか?
はい、Spire.PDF for Java は埋め込み画像を取得するための専用 API を提供しています。
抽出された画像は元の画質を保てますか?
はい。抽出画像は元の解像度・品質を保持します。無劣化で保存したい場合は PNG や BMP をお勧めします。
ページレンダリングとの違いは?
画像抽出は、PDF に含まれる画像オブジェクトをそのまま取り出す方法です。一方、レンダリングはページ全体(テキスト・図形含む)を画像化するため、用途が異なります。
スキャンされた PDF でも画像を取り出せますか?
はい。多くのスキャン PDF はページ全体が画像(JPG や TIFF)として埋め込まれており、直接抽出可能です。
まとめ
本記事では、Java および Spire.PDF for Java を用いて PDF ファイルから画像を抽出する方法をご紹介しました。基本的な抽出処理から、背景画像やアイコンのフィルタリングといった応用テクニックまでを網羅し、実用的なコード例を通じて理解を深めていただけたかと思います。
スキャン文書や設計資料、販促画像など、さまざまな PDF からの画像抽出に本チュートリアルを活用してみてください。
より多くの機能を制限なくご利用いただくには、一時的な無料ライセンスの申請はこちら。