当前位置: 首页 > news >正文

国产化PDF处理控件Spire.PDF教程:Java 提取 PDF 图片,高质量提取与图片过滤技巧

在处理包含图片的 PDF 文件时,例如扫描文档、产品手册或宣传资料,我们经常需要将其中的图像提取出来,用于保存、识别或再加工。E-iceblue旗下Spire系列产品,是文档处理领域的佼佼者,支持国产化信创本文将介绍如何使用 Spire.PDF for Java 实现 从 PDF 中提取图片,并提供基础操作方法与高级提取技巧。无论你是在开发一个图像提取工具,还是希望通过 Java 从 PDF 中获取嵌入图像,本教程都将提供实用的代码示例和详尽的解读。

Spire.PDF for Java免费试用下载 

环境配置与依赖库

在 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>

用 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 页面会包含水印、边框、按钮等装饰性图像。为避免提取这些不必要内容,可通过以下策略进行优化:

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);

常见问题解答

Java 可以提取 PDF 中的图像吗?

可以。Spire.PDF for Java 提供专门的图像提取接口,能够快速获取页面中的嵌入图像。

提取的图片是否保持原始质量?

是的。提取后的图像保持原始分辨率与编码。推荐使用 PNG 或 BMP 以获取无损质量。

图像提取与页面渲染有何区别?

图像提取是将 PDF 中嵌入的原始图像提取出来;而页面渲染是将整个 PDF 页面(包括文字与排版)转换为一张图像,前者更轻量,后者更全面。

扫描版 PDF 是否也能提取图像?

可以。大多数扫描 PDF 其实是嵌入了整页位图(如 JPG/TIFF),可以直接提取。

结语

通过本文的讲解,我们了解了如何使用 Spire.PDF for Java 通过 Java 代码从 PDF 文件中提取图像,包括基础提取方法和过滤背景图、小图标等进阶技巧。无论是处理扫描件、设计图,还是提取营销资料中的图片,我们都可以通过 Java 程序轻松提取。

http://www.dtcms.com/a/302635.html

相关文章:

  • ros2的package.xml和rosdep
  • 青少年编程高阶课程介绍
  • LangGraph智能体(天气和新闻助手)开发与部署
  • 嵌入式Linux:注册线程清理处理函数
  • 墨者:SQL过滤字符后手工绕过漏洞测试(万能口令)
  • 婚纱摄影管理系统(发送邮箱、腾讯地图API、物流API、webSocket实时聊天、协同过滤算法、Echarts图形化分析)
  • Android15广播ANR的源码流程分析
  • 【Unity】Application类常见路径一览表
  • 05 OpenCV--图像预处理之图像轮廓、直方图均衡化、模板匹配、霍夫变化、图像亮度变化、形态学变化
  • Jenkins流水线部署+webhook2.0
  • Rust/Tauri 优秀开源项目推荐
  • Flutter渲染引擎:Impeller和Skia
  • RPC 详解
  • 鱼皮项目简易版 RPC 框架开发(二)
  • 基于Spring Boot和Vue电脑维修平台整合系统的设计与实现
  • 计算机网络(基础篇)
  • linux内核中kfifo实现队列
  • 并发安全之锁机制一
  • Day22-二叉树的迭代遍历
  • kruscal重构树
  • 【Spring Boot 快速开发】一、入门
  • React 服务器端渲染原理
  • 基于AFLFast的fuzz自动化漏洞挖掘(2)
  • 结合项目阐述 设计模式:单例、工厂、观察者、代理
  • 面向对象设计原则和设计模式分类
  • RTC时钟详解
  • 【智慧物联网平台】安装部署教程——仙盟创梦IDE
  • GitLab 公共仓库:coding 用到的 git 命令
  • PhpStorm + PHP8.1 + XDebug3 实现断点调试(亲测可用)
  • gitlab 在线合并分支a-分支b,解决冲突后,反向合并分支b-分支a