博客 / 詳情

返回

Java提取PDF圖片:完整解析與實用技巧

PDF 文件常用於文檔歸檔、內容分發等場景,其中的圖片可能包含關鍵的插圖、圖標、簽章、水印等內容。對於 Java 開發者而言,如何從 PDF 頁面中準確提取嵌入圖片,是構建檔案處理系統、內容識別服務等應用的重要一環。

本文將介紹如何使用 Java 提取 PDF 中的全部圖片,並結合實際情況,講解如何 跳過背景圖像識別有效圖片尺寸 以及 保存為不同圖像格式

  • Java提取PDF中的所有圖片
  • 跳過頁面背景圖像
  • 通過尺寸篩選有效圖片
  • 保存為PNG、JPG、BMP等格式
本文基於 Free Spire.PDF for Java,安裝方法詳見:安裝指南。

Java提取PDF中的所有圖片

Spire.PDF 提供了 PdfImageHelper.getImagesInfo() 方法,可用於獲取某一頁中所有嵌入圖片的信息,並可通過 getImage() 獲取 BufferedImage 對象。

操作説明:

  1. 加載 PDF 文檔;
  2. 遍歷每一頁,使用 PdfImageHelper 獲取圖片信息;
  3. 循環保存每張圖片為文件;
  4. 關閉文檔釋放資源。

示例代碼:

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 {
        // 創建 PDF 文檔實例
        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/Page" + i + "_Image" + j + ".png");
                ImageIO.write(image, "png", file);
            }
        }

        pdf.close();
    }
}

運行效果截圖:
提取的PDF圖片示例


跳過頁面背景圖像

PDF 頁面中第一張圖片常常是頁面的背景圖,如果只是想提取內容圖片(如插圖、簽章等),可選擇跳過第一張圖片。

跳過背景圖的修改代碼:

// 從第二張開始提取,跳過背景圖
for (int j = 1; j < imagesInfo.length; j++) {
    BufferedImage image = imagesInfo[j].getImage();
    ImageIO.write(image, "png", new File("output/Page" + i + "_Image" + j + ".png"));
}

通過尺寸篩選有效圖片

PDF中有些圖像可能是透明像素、1x1的小圖標或無效圖塊,可通過判斷圖片尺寸進行過濾:

添加尺寸過濾邏輯:

for (int j = 0; j < imagesInfo.length; j++) {
    BufferedImage image = imagesInfo[j].getImage();

    // 篩選有效尺寸(例如寬度或高度大於50像素)
    if (image.getWidth() > 50 && image.getHeight() > 50) {
        File file = new File("output/Page" + i + "_Image" + j + ".png");
        ImageIO.write(image, "png", file);
    }
}

這樣可以有效排除無效圖像,提高提取效率和準確性。


保存為多種圖片格式(JPG/BMP/PNG)

提取到的 BufferedImage 可保存為多種格式,例如 JPG(壓縮)、BMP(無損)、PNG(推薦)。

多格式保存示例:

ImageIO.write(image, "PNG", new File("output/image_" + i + ".png"));   // 推薦
ImageIO.write(image, "JPEG", new File("output/image_" + i + ".jpg")); // 壓縮
ImageIO.write(image, "BMP", new File("output/image_" + i + ".bmp"));  // 高質量

也可以直接將圖片寫入內存:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(image, "PNG", stream);

這在需要將圖片上傳至服務端或嵌入其他文檔處理中非常有用。


總結

本文介紹瞭如何使用 Java 提取 PDF 文件中的所有圖片,並進一步提供了三種實用的增強技巧:

  • 跳過背景圖像:避免保存無用的頁面背景;
  • 尺寸篩選:去除無效小圖;
  • 多格式保存:滿足不同業務需求。

這些技巧適用於檔案數字化、票據分析、圖像識別等應用場景,結合 Spire.PDF 的高兼容性,可穩定處理各類複雜 PDF 文檔。


更多教程請參考:Spire.PDF for Java 教程中心

user avatar kobe_fans_zxc 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.