深入解析 iText 7:从 PDF 文档中提取文本和图像
在现代开发中,PDF 文件的操作是不可避免的一部分。无论是生成报告、解析文档,还是从文件中提取信息,我们常常需要处理 PDF 文件。iText 是一个非常强大的库,广泛应用于 PDF 文件的创建、修改和解析。自 iText 7 发布以来,它的架构、性能和功能有了巨大的提升。本文将深入介绍 iText 7 的使用,特别是如何利用它从 PDF 文档中提取文本和图像,帮助开发者高效地进行 PDF 文件的处理。
iText 7 简介
iText 7 是 iText 库的最新版本,相比于其前身 iText 5,它不仅提供了更多强大的功能,还改进了 API 设计,并引入了模块化结构,使开发者可以根据需要选择所需的功能模块。iText 7 支持更多的 PDF 操作,例如生成 PDF/A、PDF/UA(无障碍 PDF)、数字签名、表单处理等,并且在性能、图形渲染等方面得到了显著优化。
作为一个开源项目,iText 7 采用 AGPL 许可证,如果用于商业项目,则需要购买商业许可证。今天,我们将重点介绍 iText 7 中如何提取 PDF 文件中的文本内容和嵌入的图像。
为什么选择 iText 7?
- 模块化设计:iText 7 将功能模块化,开发者可以根据项目需要选择不同的模块,避免不必要的依赖。
- 强大的文本和图像处理:iText 7 提供了丰富的 API,能够轻松提取文本、图像和其他 PDF 内容。
- 性能优化:iText 7 在内存管理和多线程支持上做了优化,可以高效处理大型 PDF 文档。
- 现代化的 API:iText 7 使用更为现代化的设计,提供了更强的扩展性和灵活性。
使用 iText 7 提取 PDF 中的文本和图像
在 iText 7 中,提取 PDF 文档的内容(包括文本和图像)是一个常见的操作。通过结合 PdfTextExtractor 类和 PdfCanvasProcessor 类,开发者可以很方便地提取 PDF 页面的文本和图像。
核心 API 介绍
- PdfReader:用于读取 PDF 文件。
- PdfDocument:表示一个 PDF 文档,提供对文档内容的访问。
- PdfTextExtractor:用于从 PDF 页面中提取文本。
- PdfCanvasProcessor:用于处理 PDF 页面中的图像、文本或其他元素。
- ImageRenderInfo:包含关于图像的详细信息,可以获取图像的字节数据。
- IEventListener:事件监听器,用于在 PDF 页面中处理各种事件,特别是图像渲染事件。
示例代码
以下示例展示了如何使用 iText 7 提取 PDF 文档中的文本和图像,并将图像保存为文件。
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.canvas.parser.EventType;
import com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor;
import com.itextpdf.kernel.pdf.canvas.parser.PdfTextExtractor;
import com.itextpdf.kernel.pdf.canvas.parser.data.IEventData;
import com.itextpdf.kernel.pdf.canvas.parser.data.ImageRenderInfo;
import com.itextpdf.kernel.pdf.canvas.parser.listener.IEventListener;
import com.itextpdf.kernel.pdf.canvas.parser.listener.ITextExtractionStrategy;
import com.itextpdf.kernel.pdf.canvas.parser.listener.SimpleTextExtractionStrategy;
import com.itextpdf.kernel.pdf.xobject.PdfImageXObject;import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Set;public class IText7Example {private static void readTextAndImage(String filePath) {try {// 使用 iText 7 的 PdfReader 打开 PDF 文件PdfDocument pdfDoc = new PdfDocument(new PdfReader(filePath));// 获取 PDF 页数int numberOfPages = pdfDoc.getNumberOfPages();// 遍历每一页,提取文本for (int i = 1; i <= numberOfPages; i++) {// 创建文本提取策略ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();// 提取当前页面的文本String pageContent = PdfTextExtractor.getTextFromPage(pdfDoc.getPage(i), strategy);// 输出当前页的内容System.out.println("Page " + i + " Content: \n" + pageContent + "\n");// 使用 PdfCanvasProcessor 处理页面内容,提取图像PdfCanvasProcessor processor = new PdfCanvasProcessor(new ImageExtractionListener(i));processor.processPageContent(pdfDoc.getPage(i));}// 关闭 PDF 文档pdfDoc.close();} catch (IOException e) {e.printStackTrace();}}// 定义一个监听器,用于提取图像static class ImageExtractionListener implements IEventListener {private final int pageNum;public ImageExtractionListener(int pageNum) {this.pageNum = pageNum;}@Overridepublic void eventOccurred(IEventData eventData, EventType eventType) {if (eventType == EventType.RENDER_IMAGE) {// 获取图像数据ImageRenderInfo renderInfo = (ImageRenderInfo) eventData;PdfImageXObject imgObj = renderInfo.getImage();try {// 提取图像并保存为文件byte[] imgBytes = imgObj.getImageBytes();String imageFilePath = "image_" + System.currentTimeMillis() + ".png";try (FileOutputStream fos = new FileOutputStream(imageFilePath)) {fos.write(imgBytes);System.out.println("Page " + pageNum + " Image saved: " + imageFilePath);}} catch (IOException e) {e.printStackTrace();}}}@Overridepublic Set<EventType> getSupportedEvents() {return Set.of(EventType.RENDER_IMAGE);}}public static void main(String[] args) {// 输入 PDF 文件路径String inputPdfPath = "/path/to/your/pdf-file.pdf"; // 替换为实际路径readTextAndImage(inputPdfPath);}
}
代码解析
-
PdfDocument 和 PdfReader:
我们使用PdfReader打开一个现有的 PDF 文件,并通过PdfDocument对象获取文件内容。通过pdfDoc.getNumberOfPages()获取 PDF 文件的总页数,方便后续遍历每一页。 -
文本提取:
PdfTextExtractor.getTextFromPage()方法用于从 PDF 页面中提取文本。SimpleTextExtractionStrategy是默认的文本提取策略,它会保留页面上的文本内容并去除图像和其他非文本元素。 -
图像提取:
PdfCanvasProcessor被用来遍历 PDF 页面内容并触发图像提取事件。在ImageExtractionListener中,我们监听EventType.RENDER_IMAGE事件,该事件会在页面渲染图像时触发。图像通过ImageRenderInfo提供,可以通过imgObj.getImageBytes()获取图像的字节数据并保存为文件。 -
文件保存:
提取的图像字节通过FileOutputStream保存为.png格式文件。每次提取图像时,都会保存为一个新文件,并打印出文件路径。
小结
通过上述示例,我们了解了如何使用 iText 7 提取 PDF 文件中的文本和图像。iText 7 提供了强大且灵活的 API,能够轻松处理各种 PDF 操作。通过事件监听和页面处理,我们可以轻松提取 PDF 中的图像数据,并根据需要进行进一步的处理。iText 7 的模块化设计和现代化的 API 使其成为处理 PDF 文件的理想选择,适用于各种业务场景。
在实际开发中,你可以根据自己的需求灵活运用 iText 7 提供的功能,处理各种复杂的 PDF 文件。无论是生成 PDF 文件、提取数据,还是处理图像和表单,iText 7 都能够提供强大的支持,帮助你轻松完成各种任务。
相关文章:
深入解析 iText 7:从 PDF 文档中提取文本和图像
在现代开发中,PDF 文件的操作是不可避免的一部分。无论是生成报告、解析文档,还是从文件中提取信息,我们常常需要处理 PDF 文件。iText 是一个非常强大的库,广泛应用于 PDF 文件的创建、修改和解析。自 iText 7 发布以来ÿ…...
Rust编程语言入门教程 (六)变量与可变性
Rust 系列 🎀Rust编程语言入门教程(一)安装Rust🚪 🎀Rust编程语言入门教程(二)hello_world🚪 🎀Rust编程语言入门教程(三) Hello Cargo…...
事务--实操演示
目录 一、准备工作 二、在MySQL中操作事务(重点) 第一种方式:使用命令的方式 第二种方式:设置MySQL事务不默认提交的方式 结 三、在JDBC中操作事务(掌握) 第一种方式:使用命令的方式 第…...
PHP是如何并行异步处理HTTP请求的?
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
【Spring详解一】Spring整体架构和环境搭建
一、Spring整体架构和环境搭建 1.1 Spring的整体架构 Spring框架是一个分层架构,包含一系列功能要素,被分为大约20个模块 Spring核心容器:包含Core、Bean、Context、Expression Language模块 Core :其他组件的基本核心ÿ…...
在 Vue 3 中使用 Lottie 动画:实现一个加载动画
在现代前端开发中,动画是提升用户体验的重要元素之一。Lottie 是一个流行的动画库,它允许我们使用 JSON 文件来渲染高质量的动画。本文将介绍如何在 Vue 3 项目中集成 Lottie 动画,并实现一个加载动画效果。 如果对你有帮助请帮忙点个&#x…...
深度解析:使用 Headless 模式 ChromeDriver 进行无界面浏览器操作
一、问题背景(传统爬虫的痛点) 数据采集是现代网络爬虫技术的核心任务之一。然而,传统爬虫面临多重挑战,主要包括: 反爬机制:许多网站通过检测请求头、IP地址、Cookie等信息识别爬虫,进而限制…...
MySQL 主从复制原理及其工作过程
一、MySQL主从复制原理 MySQL 主从复制是一种将数据从一个 MySQL 数据库服务器(主服务器,Master)复制到一个或多个 MySQL 数据库服务器(从服务器,Slave)的技术。以下简述其原理,主要包含三个核…...
计算机网络抄手 运输层
一、运输层协议概述 1. 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时&…...
字符串函数和结构题内存对齐
图下为函数使用: #include <ctype.h>int main() {int ret isdigit(Q);printf("%d\n", ret);return 0; }int main() {printf("%c\n", toupper(a));printf("%c\n", tolower(A));return 0; }...
【嵌入式Linux应用开发基础】特殊进程
目录 一、守护进程(Daemon Process) 1.1. 概念 1.2. 特点 1.3. 守护进程的命名 1.4. 创建守护进程的步骤 1.5. 守护进程的实例 1.6. 守护进程的管理 1.7. 影响与处理 二、僵尸进程(Zombie Process) 2.1. 僵尸进程的定义…...
深度学习pytorch之19种优化算法(optimizer)解析
提示:有谬误请指正 摘要 本博客详细介绍了多种常见的深度学习优化算法,包括经典的LBFGS 、Rprop 、Adagrad、RMSprop 、Adadelta 、ASGD 、Adamax、Adam、AdamW、NAdam、RAdam以及SparseAdam等,通过对这些算法的公式和参数说明进行详细解析…...
rust笔记5-derive属性2
在 Rust 中,derive 是一种自动为结构体或枚举实现特定 trait 的机制。通过 #[derive(...)] 属性,Rust 编译器可以自动生成一些常见 trait 的实现代码,从而减少手动编写重复代码的工作量。 以下是对 Copy、Clone、Hash 和 Default 这几个常用 trait 的详细介绍和示例: 1. C…...
DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由
为了让大家实现 DeepSeek 使用自由,今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版:DeepSeek官网与APP 首推,肯定是 DeepSeek 的官网和 APP,可以使用满血版 R1 和 V3 模型,以及联网功能。 网址: htt…...
介绍cherrypick
git cherry-pick 是 Git 中的一个强大命令,用于将一个或多个提交(commit)从一个分支应用到另一个分支。它允许你选择性地将特定的变更引入到当前分支,而无需合并整个分支。以下是对 git cherry-pick 操作的详细介绍: 1…...
HTTP、HTTPS区别可靠性及POST为什么比GET安全的探讨
一、简述HTTP协议 HTTP底层是TCP实现,TCP是一个可靠的传输层网络协议,但是可靠性不是安全性——可靠但不安全 1、为什么TCP可靠?UDP不可靠? 可靠指的是源和目标可以相互访问以及确保数据的传输顺序,我能通过IP端口访…...
从零到一:Spring Boot 与 RocketMQ 的完美集成指南
1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件,最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型,具备高吞吐、低延迟、高可用和强一致性的特点,适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …...
AIGC:开启内容创作新纪元,我们如何看待它的影响与前景?
AIGC的概念 AIGC(Artificial Intelligence Generated Content)的概念主要是指人工智能生成内容。 这是一种新的人工智能技术,它利用人工智能模型,根据给定的主题、关键词、格式、风格等条件,自动生成各种类型的文本、图…...
10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
作者:后端小肥肠 目录 1. 前言 为什么选择DeepSeek? 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…...
mac安装Pyspark并连接Mysql
安装Scala, apache-spark, Hadoop brew install scala brew install apache-spark brew install hadoop pip install pyspark注意不要自己另外安装jdk, 会造成版本对不上报错。因为安装apache-spark的过程中会自动安装openjdk。 配置环境变量 JAVA_HOME/opt/homebrew/Cellar…...
Sqlserver 学习笔记
这次的学习内容主要是关于数据库的使用。数据库和表的创建,增删改查的内容一,数据库(1)数据库的创建create database StudentDB --创建数据库 on primary --定义在主文件组上的文件 ( nameStudentDB_data, --逻辑名称 filenameD:\…...
告别龟速传输:手把手教你用赛普拉斯FX3芯片搞定FPGA与USB3.0高速数据采集
突破数据传输瓶颈:基于赛普拉斯FX3芯片的FPGA与USB3.0高速通信实战 在工业自动化、医疗成像和机器视觉等领域,实时高速数据传输一直是系统设计的核心挑战。传统方案往往让FPGA同时处理算法运算和数据传输,导致性能瓶颈。而赛普拉斯FX3这颗专为…...
WPS-Zotero插件完整指南:3步实现跨平台文献管理革命
WPS-Zotero插件完整指南:3步实现跨平台文献管理革命 【免费下载链接】WPS-Zotero An add-on for WPS Writer to integrate with Zotero. 项目地址: https://gitcode.com/gh_mirrors/wp/WPS-Zotero 还在为学术写作中的文献引用而烦恼吗?WPS-Zotero…...
Django项目上线前必做:用SimpleUI配置专业后台,并解决生产环境静态文件404的坑
Django项目上线前必做:用SimpleUI打造专业后台与解决静态文件404难题 当你完成了一个Django项目的开发,准备将其部署到生产环境时,后台管理界面的专业度和静态文件的正确处理往往是容易被忽视的两个关键点。想象一下,当你把项目交…...
电子健康记录:医疗数据的标准化与隐私保护
电子健康记录:医疗数据的标准化与隐私保护 在数字化时代,电子健康记录(EHR)已成为医疗行业的重要工具。它通过整合患者的医疗信息,提高了诊疗效率,但也面临数据标准化不足和隐私泄露的风险。如何平衡数据共…...
AUTOSAR CANTP配置避坑指南:从状态机到流控参数实战解析
AUTOSAR CANTP配置避坑指南:从状态机到流控参数实战解析 在汽车电子控制单元(ECU)开发中,诊断通信的可靠性直接影响整车调试与售后服务的效率。作为UDS诊断协议的核心传输层,CANTP模块的配置质量往往决定了诊断通信的稳…...
YOLOv11涨点改进| CVPR 2026 | 独家创新首发、卷积改进篇| 引入 AFFN 自相关前馈网络模块,通过频域与空间域的双域融合增强,助力多种目标检测、图像分割、图像分类、图像修复任务涨点
一、本文介绍 🔥本文给大家介绍使用 AFFN 自相关前馈网络模块 改进YOLOv11网络模型,通过在特征提取与融合阶段显式建模特征图内部的周期性结构信息,通过自相关机制强化重复出现的目标纹理与结构特征,从而提升模型对规则性模式的感知能力。在复杂背景或存在噪声干扰的情况…...
避坑指南:解决ORB-SLAM2+D435i稠密建图中的‘核心转储’等常见编译与运行错误
ORB-SLAM2与D435i深度相机实战:从编译报错到稠密建图的完整避坑手册 当视觉SLAM遇上Intel RealSense D435i深度相机,技术组合的强大性能背后往往隐藏着令人头疼的编译陷阱。本文将带您穿越ORB-SLAM2与D435i集成过程中的"雷区",那些…...
重新定义华硕笔记本控制体验:G-Helper的极简设计哲学
重新定义华硕笔记本控制体验:G-Helper的极简设计哲学 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sca…...
从贝叶斯网络到因子图:用大白话图解视觉SLAM后端优化的数学之美
从贝叶斯网络到因子图:用大白话图解视觉SLAM后端优化的数学之美 想象你正在玩一个室内寻宝游戏:蒙着眼睛在未知房间里移动,只能通过触摸墙壁和家具来推测自己的位置。每走一步都记录下动作("向前1米,左转90度&quo…...
