You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从PDPage中提取所有图片?PDFBox版本变更后的实现疑问

用PDFBox提取PDF页面中的所有图片

针对你已经获取到PDPage和PDResources的情况,在PDFBox 2.x及以上版本中,提取页面图片的核心是遍历资源中的XObject,筛选出图片类型对象,同时处理可能的嵌套资源(比如表单中的图片)。新版本和旧版本的主要区别在于图片对象类从PDXObjectImage改为了PDImageXObject,这也是容易混淆的点。

以下是衔接你现有代码的完整实现:

// 你已有的代码
PDPage page = (PDPage) this.document.getDocumentCatalog().getPages().get(i);
PDResources resources = page.getResources();

// 新增:提取图片的逻辑
try {
    // 获取资源中的所有XObject集合
    Map<String, PDXObject> xObjects = resources.getXObjects();
    if (xObjects != null) {
        for (Map.Entry<String, PDXObject> entry : xObjects.entrySet()) {
            PDXObject xObj = entry.getValue();
            // 判断是否为图片对象
            if (xObj instanceof PDImageXObject) {
                PDImageXObject image = (PDImageXObject) xObj;
                // 生成图片文件名,可根据需求调整
                String imgFileName = String.format("page-%d-image-%s.%s", 
                                                  i + 1, entry.getKey(), image.getSuffix());
                // 将图片写入文件
                ImageIO.write(image.getImage(), image.getSuffix(), new File(imgFileName));
            }
            // 处理嵌套的表单资源(表单中可能包含图片)
            else if (xObj instanceof PDFormXObject) {
                PDFormXObject formXObj = (PDFormXObject) xObj;
                // 递归提取表单内的图片
                extractImagesFromResources(formXObj.getResources(), i);
            }
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

// 递归处理资源的辅助方法
private void extractImagesFromResources(PDResources res, int pageIndex) throws IOException {
    Map<String, PDXObject> xObjects = res.getXObjects();
    if (xObjects != null) {
        for (Map.Entry<String, PDXObject> entry : xObjects.entrySet()) {
            PDXObject xObj = entry.getValue();
            if (xObj instanceof PDImageXObject) {
                PDImageXObject image = (PDImageXObject) xObj;
                String imgFileName = String.format("page-%d-form-image-%s.%s", 
                                                  pageIndex + 1, entry.getKey(), image.getSuffix());
                ImageIO.write(image.getImage(), image.getSuffix(), new File(imgFileName));
            } else if (xObj instanceof PDFormXObject) {
                PDFormXObject formXObj = (PDFormXObject) xObj;
                extractImagesFromResources(formXObj.getResources(), pageIndex);
            }
        }
    }
}

关键说明:

  • 版本适配:PDFBox 2.x+使用PDImageXObject表示图片,替换了旧版的PDXObjectImage,这是你需要注意的核心改动点。
  • 嵌套资源处理:部分PDF的图片可能嵌套在PDFormXObject(表单对象)中,因此需要递归遍历这些子资源,避免遗漏图片。
  • 图片保存:通过ImageIO.write()将图片写入文件,image.getSuffix()可以直接获取图片的格式后缀(如png、jpg)。

需要导入的相关包:

import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.util.Map;

内容的提问来源于stack exchange,提问作者Giovanni De Maio Langella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:05:25