掌握iText:轻松处理PDF文档-基础篇
关于iText
iText是一个强大的PDF处理库,可以用于创建、读取和操作PDF文件。它支持PDF表单、加密和签署等操作,同时支持多种字体和编码。maven的中央仓库中的最新版本是5.X,且iText5不是完全免费的,但是基础能力是免费使用的,不过需要遵循AGPLv3协议。iText7是iText5的后继版本,相比之下有更好的性能和更全面的PDF支持。在实际开发中,可以根据需求选择不同的iText版本。
iText核心功能
iText是一个用于在Java中创建和操作PDF文件的开源库。以下是iText的一些主要功能:
- 创建PDF文档:iText可以创建新的PDF文档,并提供了多种方法来添加文本、图像、表格和其他内容。
- 读取和解析PDF文档:iText可以读取和解析现有的PDF文档,提取文本、图像和其他元素。
- 编辑PDF文档:iText可以编辑现有的PDF文档,例如添加水印、合并多个文档、添加页眉和页脚等。
- 加密和解密PDF文档:iText可以对PDF文档进行加密和解密,提供了多种加密算法和安全选项。
- 签名和验证PDF文档:iText可以添加数字签名到PDF文档,并验证文档的完整性。
- 拆分和合并PDF文档:iText可以将PDF文档拆分成单个页面或合并多个文档。
- 压缩和解压缩PDF文档:iText可以压缩和解压缩PDF文档,以减小文件大小。
- 创建和填充PDF表单:iText可以创建和填充PDF表单,包括文本框、单选框、复选框等。
- 生成条形码和二维码:iText可以生成条形码和二维码,并将其添加到PDF文档中。
- 自定义字体和样式:iText支持自定义字体和样式,允许您使用自己的字体、字号和样式来创建PDF文档。
至于收费功能,iText提供了一个商业版本的软件,称为iText Enterprise Edition。这个版本提供了一些额外的功能,例如高级的加密和安全性选项、高级的表单生成选项、高级的文档处理功能等。这些功能在开源版本的iText中可能不可用或受到限制。
iText的依赖
- itextpdf.jar是iText的核心库,提供了用于创建和操作PDF文档的基本功能。
- itext-asian.jar是itext库中关于亚洲编码的类库,特别适用于处理中文字符。
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>
实战示例
创建pdf文档并添加文本
1.创建一个Document对象实例。
2.创建一个PdfWriter对象,并将其与Document对象关联,以便将文档写入硬盘。
3.打开Document对象,以便可以向其中添加内容。
4.向Document对象添加文本内容。这可以通过创建Paragraph对象并使用Document对象的add()方法来完成。
5.关闭Document对象,以完成PDF文档的创建。
@Test
public void test0() {try {Document document = new Document();PdfWriter.getInstance(document, new FileOutputStream("d:/test/hello.pdf"));document.open();Element element = new Paragraph("hello, baby!");document.add(element);document.close();} catch (DocumentException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();}
}
创建pdf文档并添加图片
与添加文本内容的过程比较类似,唯一不同的是,这里添加到文档中的是图片。在实际的业务开发过程中,如果默认使用图片原始的心都,可能会导致在文档中的图片过大或过小,都不好看,最好根据页面的宽度进行一定比例的自适应,这里介绍一种方法:
1.先获取图片的原始宽度和高度
2.再获取PDF页面的宽度和高度
3.然后根据页面宽度计算图片的缩放比例
4.最后根据缩放比例计算图片的新宽度和高度,并重新设置图片的宽度和高度;
@Test
public void test2() {try {Document document = new Document();PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("d:/test/hello2.pdf"));document.open();Image image = Image.getInstance("d:/test/dog.jpg");// 获取图片的原始宽度和高度float originalWidth = image.getWidth();float originalHeight = image.getHeight();// 获取PDF页面的宽度和高度Rectangle pageSize = document.getPageSize();float pageWidth = pageSize.getWidth();// 根据页面宽度计算图片的缩放比例float scaleRatio = pageWidth / originalWidth;// 根据缩放比例计算图片的新宽度和高度float newWidth = originalWidth * scaleRatio;float newHeight = originalHeight * scaleRatio;// 设置图片的新宽度和高度,并保持纵横比不变image.scaleToFit(newWidth, newHeight);image.setAlignment(Element.ALIGN_CENTER);document.add(image);document.close();} catch (DocumentException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}
}
创建pdf文档并添加表格
1.创建PDF文档对象。使用Document类创建一个新的PDF文档对象,并打开它。
2.创建表格对象。使用PdfPTable类创建一个新的表格对象,并设置表格的列数和其他属性。
3.向表格中添加内容。使用PdfPCell类创建单元格对象,并将它们添加到表格中。可以设置单元格的文本、样式和布局等属性。这里需要注意的是:在iText中并没有行的概念,设置完表格的列数后,就是从左至右开始添加单元格内的内容,一般第一行是表头。
4.将表格添加到文档中。使用Document类的add()方法将表格添加到文档中。
5.关闭文档。使用Document类的close()方法关闭文档,并保存到指定的文件路径。
@Test
public void test3() {try {Document document = new Document();PdfWriter.getInstance(document, new FileOutputStream("d:/test/hello3.pdf"));document.open();// 创建PdfPTable对象并设置列宽度和间距PdfPTable table = new PdfPTable(3);float[] columnWidths = {1f, 1f, 1f};table.setWidths(columnWidths);table.setSpacingAfter(10f);table.setWidthPercentage(100); // 设置表格宽度占页面宽度的百分比为100%// 添加表头行PdfPCell headerCell1 = new PdfPCell(new Paragraph("realName"));headerCell1.setBackgroundColor(BaseColor.LIGHT_GRAY);table.addCell(headerCell1);PdfPCell headerCell2 = new PdfPCell(new Paragraph("age"));headerCell2.setBackgroundColor(BaseColor.LIGHT_GRAY);table.addCell(headerCell2);PdfPCell headerCell3 = new PdfPCell(new Paragraph("sex"));headerCell3.setBackgroundColor(BaseColor.LIGHT_GRAY);table.addCell(headerCell3);// 添加数据行table.addCell("zhangsan");table.addCell("18");table.addCell("boy");// 将表格添加到文档中document.add(table);// 关闭文档对象document.close();} catch (Exception e) {e.printStackTrace();}
}
读取pdf内的文本
1.创建一个PDF读取器对象(PdfReader):
2.创建一个PdfTextExtractor对象:
3.逐页提取文本:
4.关闭PDF读取器:
@Test
public void test6() {try {PdfReader pdfReader = new PdfReader(new FileInputStream("d:/test/hello5.pdf"));int numberOfPages = pdfReader.getNumberOfPages();for (int i = 0; i < numberOfPages; i++) {String textFromPage = PdfTextExtractor.getTextFromPage(pdfReader, i + 1);System.out.println(textFromPage);}} catch (Exception e) {e.printStackTrace();}
}
下一篇:掌握iText:轻松处理PDF文档-进阶篇
相关文章:

掌握iText:轻松处理PDF文档-基础篇
关于iText iText是一个强大的PDF处理库,可以用于创建、读取和操作PDF文件。它支持PDF表单、加密和签署等操作,同时支持多种字体和编码。maven的中央仓库中的最新版本是5.X,且iText5不是完全免费的,但是基础能力是免费使用的&…...

小红书民宿文案怎么写?建议收藏
随着民宿市场的日益火爆,如何在众多民宿中脱颖而出,吸引更多租客入住,成为摆在每一位民宿业主面前的难题。一篇优质的小红书民宿文案,不仅能吸引潜在租客的关注,还能提高民宿的知名度。本文伯乐网络传媒将从八个方面教…...

C#教程(一):面向对象
1、介绍 C#是一种多范式编程语言,但其中一个主要的编程范式是面向对象编程(OOP)。面向对象编程有一些特点,而C#提供了丰富的功能来支持这些特点。 2、面向对象特点 封装(Encapsulation): 封装…...

Linux系统中部署minio服务、开启反向代理、二级域名SSL加固
链接: B站1小时-配置指导视频: 一、创建minio 文件目录(/project/minio) 二、下载Minio wget https://dl.min.io/server/minio/release/linux-amd64/minio 三、在minio目录中-创建日志文件 四、对minio(可以理解为windows系统中的.exe可执行文件) 进行授权 chmod 777 min…...

PMP备考总结:项目管理PMP考试提高通过率,轻松上岸~
分享一篇左羊学霸的备考总结,希望能帮到正在备考的友友们~ 前言 作为⼀名通过PMP项⽬管理认证并且拿到3A成绩 ( PMP认证最好成绩) 的 学习者, 来跟⼤家分享下我考取PMP证书的动机与过程 。考证不是主要⽬ 的, 在考证的过程深化⾃⼰的项⽬管理…...

shell脚本中获取当前脚本的绝对路径
说明: PWD 是获取当前脚本的执行路径的,下面的方式是获取文件绝对路径的。 话不多说,直接上硬货!!! #!/bin/bashecho "执行路径 $PWD"absolute_path$(readlink -f "$0") # 获取目录路径 directory$(dirname "$absolute_path&q…...

SSD基础架构与NAND IO并发问题探讨
在我们的日常生活中,我们经常会遇到一些“快如闪电”的事物:比如那场突如其来的雨、那个突然出现在你眼前的前任、还有就是今天我们要聊的——固态硬盘(SSD)。 如果你是一个技术宅,或者对速度有着近乎偏执的追求&…...

激光雷达反射率定标板如何提取障碍信息
随着信息科技技术的发展,自动驾驶技术在移动机器人等智能移动设备领域得到广泛应用。智能移动设备不仅减少了人力劳动,方便生活,而且提高了工作效率。激光雷达作为自动驾驶技术的核心避障传感器,得到迅速发展。 激光雷达通过对发射…...

【开源】基于JAVA的桃花峪滑雪场租赁系统
项目编号: S 036 ,文末获取源码。 \color{red}{项目编号:S036,文末获取源码。} 项目编号:S036,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设…...

将VOC2012格式的数据集转为YOLOV8格式
文章目录 简介1.数据集格式1.1数据集目录格式对比1.2标签格式对比 2.格式转换脚本3.文件处理脚本 简介 将voc2012中xml格式的标签转为yolov8中txt格式将转换后的图像和标签按照yolov8训练的要求整理为对应的目录结构 1.数据集格式 1.1数据集目录格式对比 (1&…...

DevExpress WinForms Pivot Grid组件,一个类似Excel的数据透视表控件(二)
界面控件DevExpress WinForms的Pivot Grid组件是一个类似Excel的数据透视表控件,用于多维(OLAP)数据分析和跨选项卡报表。在上文中(点击这里回顾>>)我们介绍了DevExpress WinForms Pivot Grid组件的性能、分析服务、数据塑造能力等&…...

为什么越来越多的人从事软件测试行业?
1.市场需求增加:随着数字化转型和互联网的普及,各行各业都需要高质量、稳定可靠的软件来支持其业务运作。因此,对软件测试人员的需求也随之增加。同时,新兴技术的发展,如物联网、大数据、区块链、人工智能等࿰…...

ERP数据仓库模型
ERP数据仓库模型建设是一个复杂的过程,涉及到多个主题域。以下是一个详细的设计方案: 确定业务需求和目标 在开始设计数据仓库模型之前,需要了解企业的业务需求和目标。这包括了解企业的运营模式、业务流程、关键绩效指标等。通过与业务部门…...

基于单片机的智能小车 (论文+源码)
1. 系统设计 此次可编程智能小车系统的设计系统,结合STM32单片机,蓝牙模块,循迹模块,电机驱动模块来共同完成本次设计,实现小车的循迹避障功能和手机遥控功能,其整体框架如图2.1所示。其中,采用…...

Redis和MySQL双写一致性实用解析
1、背景 先阐明一下Mysql和Redis的关系:Mysql是数据库,用来持久化数据,一定程度上保证数据的可靠性;Redis是用来当缓存,用来提升数据访问的性能。 关于如何保证Mysql和Redis中的数据一致(即缓存一致性问题…...

win10彻底永久关闭自动更新的方法
win10彻底永久关闭自动更新的方法 文章目录 win10彻底永久关闭自动更新的方法一、禁用Windows Update服务二、在组策略里关闭Win10自动更新相关服务 可以参考这个视频的做法: 教学视频搬用 一、禁用Windows Update服务 1、同时按下键盘 Win R,打开运行…...

【webpack】初始化
webpack 旧项目的问题下一代构建工具 Vite 主角 :webpack安装webpack1,mode的选项2,使用source map 精准定位错误行数3,使用watch mode(观察模式),自动运行4,使用webpack-dev-server工具,自动刷…...

服务器GPU占用,kill -9 PID 用不了,解决办法
PID(progress ID 进程ID) 上图为占用情况,使用下面的指令都不管用 kill -9 PID kill -15 PID # 加入sudo 还是不行 # 等等网上的 chatgpt 提供的其他办法,一圈试了下来还是不管用最后解决办法 首先用下面的指令查看进程的树结构…...

Vue学习笔记-Vue3中的toRaw和markRaw
toRaw 作用:将一个由reactive生成的响应式对象转为普通对象 导入: import {toRaw} from vue 使用方法: let data reactive({k1:v1,k2:v2 }) //将对象变为非响应式的普通对象 let raw_data toRaw(data)使用场景:用于读取响应式…...

【Android Audio Focus 音频焦点】
介绍 Android 中的音频焦点(Audio Focus)是一种机制,用于管理应用程序之间的音频资源竞争。当多个应用程序同时请求使用音频设备时,通过音频焦点机制可以确保最终用户的体验不受影响。 两个或两个以上的 Android 应用可同时向同…...

ChatGPT一周年,一图总结2023生成式AI里程碑大事件时间线
带你探索AI的无限可能!AI一日,人间一年,这句话绝非空谈! AI技术在不断地发展,让我们一起期待它未来更多的可能性吧! 2022 年 11 月 30 日,OpenAI 宣布正式推出 ChatGPT。365 天过去,…...

Python 接口测试response返回数据对比的方法
背景:之前写的接口测试一直没有支持无限嵌套对比key,上次testerhome逛论坛,有人分享了他的框架,看了一下,有些地方不合适我这边自己修改了一下,部署在jenkins上跑完效果还不错,拿出来分享一下。…...

LainChain 原理解析:结合 RAG 技术提升大型语言模型能力
摘要:本文将详细介绍 LainChain 的工作原理,以及如何通过结合 RAG(Retrieval-Aggregated Generation)技术来增强大型语言模型(如 GPT 和 ChatGPT 等)的性能。我们将探讨 COT、TOT、RAG 以及 LangChain 的概…...

6-6 堆排序 分数 10
typedef int Datatype; typedef struct {Datatype* elem; int Length; }SqList; typedef SqList HeapType; void swap(int* a, int* b) {int tmp *a;*a *b;*b tmp; } //建大堆 //m: 结点个数 s: 待下调父结点下标 void HeapAdjust(HeapType H, int s, int m) {int child …...

高翔《自动驾驶与机器人中的SLAM技术》第九、十章载入静态地图完成点云匹配重定位
修改mapping.yaml文件中bag_path: 完成之后会产生一系列的点云文件以及Keyframe.txt文件: ./bin/run_frontend --config_yaml ./config/mapping 生成拼接的点云地图map.pcd文件 : ./bin/dump_map --pose_sourcelidar 。、 完成第一次优…...

英语六级翻译
1. 青海是中国西北部的一个省份,平均海拔 3000 以上,大部分地区为高山和高原。青海省得名全国最大的咸水湖青海湖。青海湖被誉为“中国最美的湖泊”,是最受欢迎的旅游景点之一,也是摄影师和艺术家的天堂。 青海山川壮丽,地大物博。石油和天然气储量丰富,省内许多城市的…...

VMware配置Ubuntu虚拟机
目录标题 1. 相关问题 1. 相关问题 Ubuntu虚拟机与主机能ping通,但是xftp无法连接 解决:Ubuntu安装 OpenSSH 服务器:sudo apt install openssh-server...

Backtrader 文档学习-Platform Concepts
Backtrader 文档学习-Platform Concepts 1.开始之前 导入backtrader ,以及backtrader 的指示器、数据反馈的模块 。 import backtrader as bt import backtrader.indicators as btind import backtrader.feeds as btfeeds看看btind模块下有什么方法和属性&#x…...

策略模式(常用)
策略模式的简介 在软件开发中,设计模式是为了解决常见问题而提供的一套可重用的解决方案。策略模式(Strategy Pattern)是其中一种常见的设计模式,它属于行为型模式。该模式的核心思想是将不同的算法封装成独立的策略类,…...

Express中使用Swagger
Swagger Swagger 是一种规范,用于描述 API 的结构,功能和参数。使用 Swagger 可以提供清晰的可视化 API 文档,可用于 API 交互的文档驱动开发,以及 API 的自动化测试和集成。 使用 npm 或 yarn 下载。 npm install swagger-jsdo…...