使用 Apache PDFBox 提取 PDF 中的文本和图像
在许多应用中,我们需要从 PDF 文件中提取文本内容和嵌入的图像。为了实现这一目标,Apache PDFBox
是一个非常实用的开源工具库。它提供了丰富的 API,可以帮助我们轻松地读取 PDF 文件、提取其中的文本、图像以及其他资源。
本文将介绍如何使用 Apache PDFBox 来提取 PDF 文件中的文本和图像,并将图像保存为文件。通过实际代码示例,您将学会如何高效地处理 PDF 文件中的内容。
1. Apache PDFBox 简介
Apache PDFBox 是一个用于创建、操作和提取 PDF 内容的 Java 库。它提供了一些重要的功能,包括:
- 提取 PDF 文件中的文本内容。
- 提取 PDF 文件中的图像。
- 创建和修改 PDF 文档。
- 操作 PDF 表单、数字签名等。
PDFBox 是完全开源的,适用于 Java 开发者,用于处理 PDF 文档中的各种数据。
2. 目标
在本文中,我们的目标是使用 PDFBox 从 PDF 文件中提取:
- 文本内容:每一页的文本信息。
- 图像:嵌入到 PDF 中的图像并保存为文件。
3. 示例代码
以下是使用 Apache PDFBox 提取 PDF 中文本和图像的完整代码示例:
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.text.PDFTextStripper;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;public class PdfboxTest {// 提取PDF中的文本和图像private static void readTextAndImage(String filePath) {try (PDDocument document = PDDocument.load(new File(filePath))) {// 获取PDF文档的页数int numberOfPages = document.getNumberOfPages();// 遍历每一页提取文本和图像for (int i = 0; i < numberOfPages; i++) {PDPage page = document.getPage(i);// 提取页面文本PDFTextStripper textStripper = new PDFTextStripper();textStripper.setStartPage(i + 1);textStripper.setEndPage(i + 1);String pageText = textStripper.getText(document);System.out.println("Page " + (i + 1) + " Content: \n" + pageText + "\n");// 提取图像资源PDResources resources = page.getResources();for (COSName xObjectName : resources.getXObjectNames()) {if (resources.isImageXObject(xObjectName)) {PDImageXObject imageObject = (PDImageXObject) resources.getXObject(xObjectName);BufferedImage bImage = imageObject.getImage();// 将图像保存为 PNG 格式try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {ImageIO.write(bImage, "png", baos);byte[] imageBytes = baos.toByteArray();String imageFilePath = "image_" + System.currentTimeMillis() + ".png";try (FileOutputStream fos = new FileOutputStream(imageFilePath)) {fos.write(imageBytes);System.out.println("Page " + (i + 1) + " Image saved: " + imageFilePath);}}}}}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {// 输入PDF文件路径String filePath = "/path/to/your/pdf-file.pdf"; // 请替换为实际的 PDF 文件路径readTextAndImage(filePath);}
}
4. 代码分析
1. 加载 PDF 文件
我们通过 PDDocument.load()
方法加载 PDF 文件。该方法会返回一个 PDDocument
对象,表示整个 PDF 文档。
try (PDDocument document = PDDocument.load(new File(filePath))) {int numberOfPages = document.getNumberOfPages();
2. 提取文本内容
PDFTextStripper
类是用于从 PDF 中提取文本的工具。我们通过设置 startPage
和 endPage
来指定提取特定页面的文本。getText()
方法将返回当前页面的文本内容。
PDFTextStripper textStripper = new PDFTextStripper();
textStripper.setStartPage(i + 1);
textStripper.setEndPage(i + 1);
String pageText = textStripper.getText(document);
3. 提取图像
为了提取 PDF 页面中的图像,我们使用 PDPage.getResources()
获取该页面的资源对象。资源对象包含页面的所有资源,包括图像。然后我们通过 resources.getXObject()
方法获取图像对象,并使用 PDImageXObject.getImage()
获取 BufferedImage
,最后将图像保存为字节数组。
PDResources resources = page.getResources();
for (COSName xObjectName : resources.getXObjectNames()) {if (resources.isImageXObject(xObjectName)) {PDImageXObject imageObject = (PDImageXObject) resources.getXObject(xObjectName);BufferedImage bImage = imageObject.getImage();
然后,我们将图像保存为 PNG 格式的文件:
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {ImageIO.write(bImage, "png", baos);byte[] imageBytes = baos.toByteArray();String imageFilePath = "image_" + System.currentTimeMillis() + ".png";try (FileOutputStream fos = new FileOutputStream(imageFilePath)) {fos.write(imageBytes);System.out.println("Page " + (i + 1) + " Image saved: " + imageFilePath);}
}
5. 总结
通过 Apache PDFBox,我们可以轻松地从 PDF 文档中提取文本和图像。上面的示例代码展示了如何遍历 PDF 文件的每一页,提取其中的文本内容,并且提取页面中所有的图像资源并保存为文件。这种方法对于处理 PDF 报告、提取嵌入图像或处理表单数据非常有用。
希望本文的示例能够帮助你更好地使用 PDFBox 处理 PDF 文件。如果你有更多问题或需求,欢迎与我们讨论!
相关文章:
使用 Apache PDFBox 提取 PDF 中的文本和图像
在许多应用中,我们需要从 PDF 文件中提取文本内容和嵌入的图像。为了实现这一目标,Apache PDFBox 是一个非常实用的开源工具库。它提供了丰富的 API,可以帮助我们轻松地读取 PDF 文件、提取其中的文本、图像以及其他资源。 本文将介绍如何使…...

【js逆向_入门】图灵爬虫练习平台 第四题
(base64解码)地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvNC8 请求接口带有加密参数: 全局搜索Sign,找到参数生成位置 一目了然,知道参数是怎么构造生成的 调试代码 测试验证思路是否正确 时间: …...

Redis7——基础篇(三)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二) 接上期内容:上期完成了Redis的基本…...

深度学习中的知识蒸馏
大家好,我是小青 今天给大家分享神经网络中的一个关键概念,知识蒸馏 知识蒸馏(Knowledge Distillation)是一种模型压缩技术,旨在将大型、复杂的模型(通常称为教师模型)的知识迁移到小型、简单…...

【Windows软件 - HeidiSQL】导出数据库
HeidSQL导出数据库 软件信息 具体操作 示例文件 选项分析 选项(1) 结果(1) -- -------------------------------------------------------- -- 主机: 127.0.0.1 -- 服务器版本: …...

苏剑林“闭门造车”之多模态思路浅谈思考
原文来自科学空间苏剑林 “闭门造车”之多模态思路浅谈(一):无损输入和“闭门造车”之多模态思路浅谈(二):自回归,学习后总结。 文章目录 “闭门造车”之多模态思路浅谈(一ÿ…...

绿联nas docker 安装 rocketmq 队列。亲测可用
首先拉取docker 镜像,所需镜像如下: 安装 nameserver docker run -d -p 9876:9876 \ -v ${HOME}/docker/software/rocketmq/data/namesrv/logs:/opt/logs \ -v ${HOME}/docker/software/rocketmq/data/namesrv/store:/opt/store \ --name rmqnamesrv \ …...
C++(23):unreachable
C++23在头文件 "><utility>定义了std::unreachable(),用于指示编译器,该段代码不应该被允许,因此编译器可以对该位置进行优化,如果一旦允许了该位置的代码,行为未定义: #include <utility> #include <iostream>using namespace std;int func(…...
初等数论--欧几里得算法
1. 定义 u 0 u 1 ∈ Z , u 1 ≠ 0 , u 1 ∤ u 0 u_0\ u_1\in Z,u_1 \ne0,u_1 \nmid u_0 u0 u1∈Z,u10,u1∤u0 根据带余除法可得下面一系列等式 u 0 q 0 u 1 u 2 0 < u 2 < ∣ u 1 ∣ u 1 q 0 u 2 u 3 0 < u 3 < u 2 ⋯ u k − 1 q k − 1 u k …...
阿里云前端自动化部署流程指南
本文详细介绍从前端代码开发到阿里云 OSS/CDN 自动化部署的完整流程。 一、流程概览 © ivwdcwso (ID: u012172506) 1.1 部署流程图 #mermaid-svg-H1LBBmwTHAAF3QTL {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermai…...

EXCEL解决IF函数“您已为此函数输入太多个参数”的报错
IF函数的基本结构是IF(条件, 值为真时的结果, 值为假时的结果),所以标准的IF函数最多只能有三个参数。当用户输入的参数超过三个时,Excel就会报这个错误。比如多个IF语句叠加,但可能在嵌套的过程中没有正确关闭每个IF函数的括号,导…...

CAS单点登录(第7版)18.日志和审计
如有疑问,请看视频:CAS单点登录(第7版) 日志和审计 Logging 概述 Logging CAS 提供了一个日志记录工具,用于记录重要信息事件,如身份验证成功和失败;可以对其进行自定义以生成用于故障排除的其他信息。…...

2025年软件测试面试题大全(附答案+文档)
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、测试基础 1、测试策略或测试包括哪些,测试要覆盖哪些方面 UI、功能、性能、可靠性、易用性、兼容性、安全性、安装卸载 2、设计测试用例的办法 …...

太空飞船任务,生成一个地球发射、火星着陆以及下一次发射窗口返回地球的动画3D代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from mpl_toolkits.mplot3d import Axes3D# 天体参数设置(简化模型) AU 1.5e8 # 天文单位(公里) earth_orbital_radius …...
IDEA——Mac版快捷键
目录 按键含义常用组合代码生成快捷键:代码追踪快捷键:高效编辑快捷键:代码重构快捷键:工具类快捷键:常规文件操作快捷键: 按键含义 ⌘ command Command键(⌘)相当于Windows中的Con…...

智能体系统(AI Agent System)是什么?——从概念解析到企业数字化转型的全景落地及投资视角
文章目录 一、 前言1.1 背景介绍1.2 写作目的 二、 智能体系统及相关概念解析2.1 智能体系统定义2.2 关键概念区分2.2.1 自主代理(Autonomous Agent)2.2.2 多智能体系统(MAS)2.2.3 人工智能/机器学习(AI/ML)…...
Vue 前端开发中的路由知识:从入门到精通
文章目录 引言1. Vue Router 简介1.1 安装 Vue Router1.2 配置 Vue Router1.3 在 Vue 实例中使用 Vue Router 2. 路由的基本用法2.1 路由映射2.2 路由视图2.3 路由链接 3. 动态路由3.1 动态路径参数3.2 访问动态参数3.3 响应路由参数的变化 4. 嵌套路由4.1 定义嵌套路由4.2 渲染…...

前端VUE+后端uwsgi 环境搭建
1整体架构 请求流程the web clinet--the web server->the socket->uwsgi--django 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;在nginx上加上安全性或其他的限制,可以达到保护程序的作用;uWSGI本…...

I2C实践开发 ---【STM32-I2C-HDC1080温湿度采集系统】
I2C实践开发 — STM32-I2C-HDC1080温湿度采集系统 目录 I2C实践开发 --- STM32-I2C-HDC1080温湿度采集系统1. 引言2. 系统架构2.1 硬件架构2.2 软件架构 3. 代码分析3.1 I2C驱动文件 (i2c.h 和 i2c.c)3.2 HDC1080传感器驱动文件 (hdc1080.h 和 hdc1080.c) 4. 功能总结【HDC1080…...

【个人开发】deepspeed+Llama-factory 本地数据多卡Lora微调【完整教程】
文章目录 1.背景2.微调方式2.1 关键环境版本信息2.2 步骤2.2.1 下载llama-factory2.2.2 准备数据集2.2.3 微调模式2.2.3.1 zero-1微调2.2.3.2 zero-2微调2.2.3.3 zero-3微调2.2.3.4 单卡Lora微调 2.2.4 实验2.2.4.1 实验1:多GPU微调-zero12.2.4.2 实验2:…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...