PDF 文件经常用于保存各种类型的文档,例如技术报告、产品手册、项目资料以及工程文档。除了文本内容之外,PDF 中通常还包含大量图片资源,例如流程图、统计图表、产品截图以及扫描页面。
在实际开发中,提取 PDF 图片并不只是简单地将图片保存出来。很多情况下,还需要进一步获取图片相关信息,例如:
- 图片来自 PDF 的哪一页;
- 每个页面包含多少张图片;
- 图片的宽度和高度;
- 提取后的图片如何与原始文档建立对应关系。
例如,在文档管理系统中,可以自动提取 PDF 中的图片进行归档;在构建知识库或内容分析系统时,也可以将 PDF 中的图片作为独立资源进行处理。
本文将介绍如何使用 Java 从 PDF 文件中提取图片,并获取图片相关信息。
环境准备
创建 Java 项目后,可以通过 Maven 添加 PDF 处理依赖。
在 pom.xml 中添加以下配置:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>12.9.0</version>
</dependency>
</dependencies>
然后导入需要使用的类:
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;
从 PDF 中提取所有图片
PDF 中的图片通常作为页面资源存储。提取图片时,需要先加载 PDF 文件,然后遍历每个页面,通过 PdfImageHelper 获取页面中的图片信息。
下面的示例会提取 PDF 文件中的所有图片,并保存为 PNG 格式。
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;
public class ExtractPdfImages {
public static void main(String[] args) throws Exception {
// 创建 PDF 文档对象
PdfDocument pdf = new PdfDocument();
// 加载需要处理的 PDF 文件
pdf.loadFromFile("示例文档.pdf");
// 创建图片辅助类,用于获取 PDF 页面中的图片
PdfImageHelper imageHelper = new PdfImageHelper();
int imageIndex = 1;
// 遍历 PDF 中的所有页面
for (int i = 0; i < pdf.getPages().getCount(); i++) {
PdfPageBase page = pdf.getPages().get(i);
// 获取当前页面中的图片信息
PdfImageInfo[] imageInfos =
imageHelper.getImagesInfo(page);
if (imageInfos != null) {
for (PdfImageInfo imageInfo : imageInfos) {
// 获取图片对象
BufferedImage image =
imageInfo.getImage();
// 保存图片
ImageIO.write(
image,
"PNG",
new File("提取图片_" + imageIndex + ".png")
);
imageIndex++;
}
}
}
// 释放资源
pdf.dispose();
}
}
获取 PDF 每页包含的图片数量
在处理大型 PDF 文档时,有时需要先统计每一页包含多少图片。
例如,在建立图片索引或分析 PDF 结构时,可以先获取每页的图片数量。
示例代码:
public class CountPdfImages {
public static void main(String[] args) {
// 创建 PDF 文档对象
PdfDocument pdf = new PdfDocument();
// 加载 PDF 文件
pdf.loadFromFile("示例文档.pdf");
PdfImageHelper imageHelper = new PdfImageHelper();
// 遍历 PDF 页面
for (int i = 0; i < pdf.getPages().getCount(); i++) {
PdfPageBase page = pdf.getPages().get(i);
// 获取当前页面中的图片
PdfImageInfo[] imageInfos =
imageHelper.getImagesInfo(page);
int imageCount =
imageInfos == null ? 0 : imageInfos.length;
System.out.println(
"第 " + (i + 1)
+ " 页包含 "
+ imageCount
+ " 张图片"
);
}
// 释放资源
pdf.dispose();
}
}
输出示例:
第 1 页包含 3 张图片
第 2 页包含 5 张图片
第 3 页包含 1 张图片
通过这种方式,可以快速了解 PDF 中图片资源的分布情况。
获取 PDF 图片尺寸信息
除了提取图片文件,还可以获取图片的宽度和高度。
这些信息可以帮助判断图片质量,例如筛选高清图片或者对图片资源进行分类。
示例代码:
public class GetPdfImageSize {
public static void main(String[] args) {
PdfDocument pdf = new PdfDocument();
// 加载 PDF 文件
pdf.loadFromFile("示例文档.pdf");
PdfImageHelper imageHelper = new PdfImageHelper();
// 遍历所有页面
for (int i = 0; i < pdf.getPages().getCount(); i++) {
PdfPageBase page = pdf.getPages().get(i);
PdfImageInfo[] imageInfos =
imageHelper.getImagesInfo(page);
if (imageInfos != null) {
for (PdfImageInfo imageInfo : imageInfos) {
BufferedImage image =
imageInfo.getImage();
System.out.println(
"图片宽度:"
+ image.getWidth()
+ ",图片高度:"
+ image.getHeight()
);
}
}
}
pdf.dispose();
}
}
输出示例:
图片宽度:1200,图片高度:800
图片宽度:640,图片高度:480
通过图片尺寸,可以进一步筛选满足要求的图片资源。
提取图片并保留页面信息
在实际应用中,通常不仅需要图片文件,还需要知道图片来自 PDF 的哪一页。
例如:
示例文档.pdf
第 1 页
├── 图片 1
└── 图片 2
第 2 页
└── 图片 1
可以将页面编号加入输出文件名:
public class ExtractImagesWithPageInfo {
public static void main(String[] args) throws Exception {
PdfDocument pdf = new PdfDocument();
// 加载 PDF 文件
pdf.loadFromFile("示例文档.pdf");
PdfImageHelper imageHelper = new PdfImageHelper();
// 遍历 PDF 页面
for (int pageIndex = 0;
pageIndex < pdf.getPages().getCount();
pageIndex++) {
PdfPageBase page =
pdf.getPages().get(pageIndex);
PdfImageInfo[] imageInfos =
imageHelper.getImagesInfo(page);
if (imageInfos != null) {
for (int imageIndex = 0;
imageIndex < imageInfos.length;
imageIndex++) {
// 获取图片
BufferedImage image =
imageInfos[imageIndex].getImage();
// 根据页码和图片编号生成文件名
String fileName =
"第"
+ (pageIndex + 1)
+ "页_图片"
+ (imageIndex + 1)
+ ".png";
ImageIO.write(
image,
"PNG",
new File(fileName)
);
}
}
}
pdf.dispose();
}
}
生成结果:
第1页_图片1.png
第1页_图片2.png
第2页_图片1.png
这样可以快速定位图片在原始 PDF 中的位置。
实际应用场景
文档资源归档
对于包含大量图片的 PDF 文件,可以自动提取图片并建立索引。
例如:
- 技术资料归档;
- 产品手册图片整理;
- 工程文档资源管理。
PDF 内容分析
图片信息可以作为分析 PDF 结构的一部分。
例如:
- 判断文档是否主要由扫描图片组成;
- 统计不同页面的图片数量;
- 提取图片用于 OCR 或图像处理。
知识库数据整理
在构建文档知识库时,可以将 PDF 中的图片单独提取,与文本内容分别管理。
例如:
- 文档检索系统;
- 企业知识库;
- AI 文档分析流程。
常见问题
扫描版 PDF 可以提取单独图片吗?
需要注意,扫描版 PDF 通常是一整页图片,而不是多个独立图片对象。
例如:
- 普通 PDF:
- 文本对象
- 图片对象
- 扫描 PDF:
- 一张完整页面图片
因此,提取结果可能是一整页图片。
提取出的图片数量为什么和看到的不一样?
PDF 内部可能包含:
- 背景图片;
- 隐藏资源;
- 重复引用的图片对象。
因此,程序获取到的图片数量可能与打开 PDF 后看到的图片数量不同。
如何处理大型 PDF?
如果 PDF 包含大量页面或高清图片,建议:
- 按页面处理;
- 避免一次加载大量图片;
- 及时释放
PdfDocument对象。
这样可以降低内存占用,提高程序稳定性。
总结
从 PDF 中提取图片不仅仅是保存图片文件。在实际开发中,图片所在页面、图片数量以及尺寸信息同样具有重要价值。
通过 Java 遍历 PDF 页面并获取图片资源信息,可以实现自动化图片提取和分析,为文档管理、知识库建设以及数据处理流程提供更加灵活的支持。
相比人工打开 PDF 后逐张复制图片,程序化处理更适合批量文档处理场景。