PDF 文件常用於文檔歸檔、內容分發等場景,其中的圖片可能包含關鍵的插圖、圖標、簽章、水印等內容。對於 Java 開發者而言,如何從 PDF 頁面中準確提取嵌入圖片,是構建檔案處理系統、內容識別服務等應用的重要一環。
本文將介紹如何使用 Java 提取 PDF 中的全部圖片,並結合實際情況,講解如何 跳過背景圖像、識別有效圖片尺寸 以及 保存為不同圖像格式。
- Java提取PDF中的所有圖片
- 跳過頁面背景圖像
- 通過尺寸篩選有效圖片
- 保存為PNG、JPG、BMP等格式
本文基於 Free Spire.PDF for Java,安裝方法詳見:安裝指南。
Java提取PDF中的所有圖片
Spire.PDF 提供了 PdfImageHelper.getImagesInfo() 方法,可用於獲取某一頁中所有嵌入圖片的信息,並可通過 getImage() 獲取 BufferedImage 對象。
操作説明:
- 加載 PDF 文檔;
- 遍歷每一頁,使用
PdfImageHelper獲取圖片信息; - 循環保存每張圖片為文件;
- 關閉文檔釋放資源。
示例代碼:
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 頁面中第一張圖片常常是頁面的背景圖,如果只是想提取內容圖片(如插圖、簽章等),可選擇跳過第一張圖片。
跳過背景圖的修改代碼:
// 從第二張開始提取,跳過背景圖
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 教程中心