在处理包含图片的 PDF 文件时,例如扫描文档、产品手册或宣传资料,我们经常需要将其中的图像提取出来,用于保存、识别或再加工。本文将介绍如何使用 Spire.PDF for Java 实现 从 PDF 中提取图片,并提供基础操作方法与高级提取技巧。无论你是在开发一个图像提取工具,还是希望通过 Java 从 PDF 中获取嵌入图像,本教程都将提供实用的代码示例和详尽的解读。
教程目录
环境配置与依赖库
在 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>
如果只需要处理简单的提取任务,也可以使用免费版:Free Spire.PDF for Java。
用 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 渲染为图像而非仅提取其中的图像对象,可参考:Java 实现 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);
附加内容:提取 PDF 附件中的图像
如果 PDF 文件中嵌入了图片作为附件(例如 .jpg/.png 文件),可参考以下教程提取:
用 Java 提取 PDF 附件
常见问题解答
Java 可以提取 PDF 中的图像吗?
可以。Spire.PDF for Java 提供专门的图像提取接口,能够快速获取页面中的嵌入图像。
提取的图片是否保持原始质量?
是的。提取后的图像保持原始分辨率与编码。推荐使用 PNG 或 BMP 以获取无损质量。
图像提取与页面渲染有何区别?
图像提取是将 PDF 中嵌入的原始图像提取出来;而页面渲染是将整个 PDF 页面(包括文字与排版)转换为一张图像,前者更轻量,后者更全面。
扫描版 PDF 是否也能提取图像?
可以。大多数扫描 PDF 其实是嵌入了整页位图(如 JPG/TIFF),可以直接提取。
结语
通过本文的讲解,我们了解了如何使用 Spire.PDF for Java 通过 Java 代码从 PDF 文件中提取图像,包括基础提取方法和过滤背景图、小图标等进阶技巧。无论是处理扫描件、设计图,还是提取营销资料中的图片,我们都可以通过 Java 程序轻松提取。
如需体验完整功能并解除评估限制,可联系我们申请免费临时 License。