如何使用 Java 从 PDF 中提取图片及获取图片信息

0 阅读6分钟

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 后逐张复制图片,程序化处理更适合批量文档处理场景。