在處理包含圖片的 PDF 文件時,例如掃描文檔、產品手冊或宣傳資料,我們經常需要將其中的圖像提取出來,用于保存、識別或再加工。E-iceblue旗下Spire系列產品,是文檔處理領域的佼佼者,支持國產化信創。本文將介紹如何使用?Spire.PDF for Java?實現?從 PDF 中提取圖片,并提供基礎操作方法與高級提取技巧。無論你是在開發一個圖像提取工具,還是希望通過 Java 從 PDF 中獲取嵌入圖像,本教程都將提供實用的代碼示例和詳盡的解讀。
Spire.PDF for Java免費試用下載?
環境配置與依賴庫
在 Java 中直接處理 PDF 并提取圖像并不容易。由于 PDF 文件中的圖片可能被壓縮、編碼或嵌入在復雜結構中,使用原生 API 很難有效完成圖像提取任務。
Spire.PDF for Java?提供了簡潔的 API,能夠準確識別并提取 PDF 中的嵌入圖像,非常適合構建文檔處理和圖像提取類應用。
開發環境建議如下:
- 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>
用 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 文件pdf.loadFromFile("input.pdf");// 創建 PdfImageHelper 類的實例PdfImageHelper imageHelper = new PdfImageHelper();// 遍歷 PDF 的每一頁,提取圖片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++) {PdfImageInfo imageInfo = imagesInfo[j];// 獲取圖片并保存為文件BufferedImage image = imageInfo.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,可快速提取圖片資源:
進階技巧:過濾背景圖與小圖標
某些 PDF 頁面會包含水印、邊框、按鈕等裝飾性圖像。為避免提取這些不必要內容,可通過以下策略進行優化:
1. 跳過背景圖像
一些 PDF 頁面包含背景圖,而提取時背景圖通常會作為第一張圖片,可通過跳過首個圖像過濾背景圖:
for (int i = 1; i < imagesInfo.length; i++) { // 從第二張圖開始處理BufferedImage image = imagesInfo[i].getImage();ImageIO.write(image, "PNG", new File("output/image_" + (i - 1) + ".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 + ".png")); }
建議根據文檔實際情況調整尺寸閾值。
3. 輸出為不同格式或寫入流中
根據用途選擇不同格式:
ImageIO.write(image, "JPEG", new File("output/image_" + i + ".jpg")); // 有損壓縮 ImageIO.write(image, "BMP", new File("output/image_" + i + ".bmp")); // 無損保存
- PNG/BMP:適合保存原始圖像,便于后續 OCR;
- JPEG:適合網絡展示或壓縮存儲。
也可以寫入字節流,便于在線處理或上傳:
ByteArrayOutputStream stream = new ByteArrayOutputStream(); ImageIO.write(image, "PNG", stream);
常見問題解答
Java 可以提取 PDF 中的圖像嗎?
可以。Spire.PDF for Java?提供專門的圖像提取接口,能夠快速獲取頁面中的嵌入圖像。
提取的圖片是否保持原始質量?
是的。提取后的圖像保持原始分辨率與編碼。推薦使用 PNG 或 BMP 以獲取無損質量。
圖像提取與頁面渲染有何區別?
圖像提取是將 PDF 中嵌入的原始圖像提取出來;而頁面渲染是將整個 PDF 頁面(包括文字與排版)轉換為一張圖像,前者更輕量,后者更全面。
掃描版 PDF 是否也能提取圖像?
可以。大多數掃描 PDF 其實是嵌入了整頁位圖(如 JPG/TIFF),可以直接提取。
結語
通過本文的講解,我們了解了如何使用?Spire.PDF for Java?通過 Java 代碼從 PDF 文件中提取圖像,包括基礎提取方法和過濾背景圖、小圖標等進階技巧。無論是處理掃描件、設計圖,還是提取營銷資料中的圖片,我們都可以通過 Java 程序輕松提取。