如何从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
相关产品推荐
相关产品推荐

