【PDFBox】PDFBox操作PDF文档之创建PDF文档、加载PDF文档、添加空白页面、删除页面、获取总页数、添加文本内容、PDFBox坐标系

这篇文章,主要介绍PDFBox操作PDF文档之创建PDF文档、加载PDF文档、添加空白页面、删除页面、获取总页数、添加文本内容、PDFBox坐标系。

目录

一、PDFBox组件

1.1、什么是PDFBox

1.2、创建PDF文档

1.3、加载PDF文档

1.4、添加空白页面

1.5、删除某个页面

1.6、获取PDF总页数

1.7、添加文本内容

(1)写入单行内容

(2)写入多行内容

1.8、PDFBox中的坐标系


一、PDFBox组件

1.1、什么是PDFBox

PDFBox是Apache提供的一款专门用于操作PDF文档的工具组件,使用PDFBox可以很方便对PDF文档进行各种操作,例如:创建PDF文档、读取PDF文档内容、加载PDF文档内容、合并PDF文档、拆分PDF文档等等,使用PDFBox需要引入对应的依赖,这篇文章就基于下面的依赖,介绍一下PDFBox中一些常见的方法及其使用方式。

PDFBox所需依赖:

<dependencies><!-- 引入 PDFBox 相关的依赖 开始 --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.29</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.29</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>xmpbox</artifactId><version>2.0.29</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>preflight</artifactId><version>2.0.29</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-tools</artifactId><version>2.0.29</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>jempbox</artifactId><version>1.8.17</version></dependency><!-- 引入 PDFBox 相关的依赖 结束 -->
</dependencies>

1.2、创建PDF文档

pdf,英文全称是:Portable Document File,便携式文档文件,又叫做pdf文档,一个文档里面包含了多个页面,每一个页面里面又包含了很多的文字、段落、图像等内容。

创建PDF文档只需要创建一个【PDDocument】对象即可,这个对象就表示PDF文档对象,使用这种方式创建的PDF文档是不包含任何页面的,所以打开这个PDF时候会提示错误。

package com.pdfbox.demo;import org.apache.pdfbox.pdmodel.PDDocument;
import java.io.IOException;public class PDFBoxExample {public static void main(String[] args) throws IOException {// 1、创建文档对象PDDocument doc = new PDDocument();// 2、生成pdf文件,保存pdf文件// 这里会在D盘下生成一个 demo.pdf 空白的pdf文档doc.save("D:\\demo.pdf");// 3、关闭文档流doc.close();}
}

1.3、加载PDF文档

有时候,我们需要加载一个已经创建好的PDF文档,这个时候就可以使用PDDocument类中的【load()】方法,加载指定的pdf文件,代码如下:

(1)加载本地PDF文档

// 1、加载文档对象
File file = new File("D:\\demo.pdf");
PDDocument doc = PDDocument.load(file);
// TODO 做一些操作
// ....// 关闭文档
doc.close();

(2)加载网络PDF文档

PDFBox也可以通过流的方式加载网络上的PDF文档,如下所示:

package pdfbox.demo;import org.apache.pdfbox.pdmodel.PDDocument;import java.io.IOException;
import java.net.URL;public class PDFDemo {public static void main(String[] args) throws IOException {// 1、加载网络PDF文档PDDocument doc = PDDocument.load(new URL("https://ip:port/demo.pdf").openStream());// .....// 关闭文档doc.close();}
}

1.4、添加空白页面

当我们创建好了一个PDF文档对象,就可以继续向这个文档里面添加空白的Page页面,Page页面就是可以看得见的内容区域啦,页面有大小可以设置,例如:A4、A5、A6等尺寸,一般情况下,都是使用A4大小尺寸就可以满足需求了。创建Page页面,只需要创建一个【PDPage】对象即可,在构造方法中可以传递一个【PDRectangle.A4】参数,用于设置页面大小。

package com.pdfbox.demo;import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;import java.io.IOException;public class PDFBoxExample {public static void main(String[] args) throws IOException {// 1、创建文档对象PDDocument doc = new PDDocument();// 2、添加空白页面,大小是 A4 纸那么大PDPage page = new PDPage(PDRectangle.A4);doc.addPage(page);// 3、生成pdf文件,保存pdf文件// 这里会在D盘下生成一个 demo.pdf 空白的pdf文档doc.save("D:\\demo.pdf");// 4、关闭文档流doc.close();}
}

1.5、删除某个页面

PDDocument文档对象提供了一个【removePage()】方法,可以用于删除指定下标的页面(从0开始)、删除指定Page页面对象。

// 1、创建文档对象
PDDocument doc = new PDDocument();// TODO 删除第1个页面
doc.removePage(0);// 或者删除指定的Page对象页面
// PDPage page = new PDPage(PDRectangle.A4);
// doc.removePage(page);

1.6、获取PDF总页数

PDDocument文档对象提供了一个【getNumberOfPages()】方法,这个方法可以获取当前PDF中总共有多少个Page页面,返回int类型。

// 1、创建文档对象
PDDocument doc = new PDDocument();// TODO 获取文档总页数
int pages = doc.getNumberOfPages();
System.out.println("总页数: " + pages);

1.7、添加文本内容

前面已经介绍了创建PDF文档、添加PDF空白页面、获取PDF页数等内容,但是还没有介绍如何向PDF页面中写入内容,我们可以向PDF文档中写入文本内容、图像内容、表单内容等,这里先介绍一下如何写入纯文本内容。

PDFBox将一个Page页面中的内容抽象成内容流的形式,所以我们在对Page页面内容进行操作的时候,也需要通过内容流来完成,内容流是采用PDPageContentStream对象表示的。

(1)写入单行内容

写入单行内容,也就是说,无论我们写入的文本内容有多长,这个内容只会显示在一行上面,超出PDF页面范围之外的内容会被遮挡,案例代码如下:

package pdfbox.demo;import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType1Font;import java.io.IOException;public class PDFBoxDemo01 {public static void main(String[] args) throws IOException {// 1、创建文档对象PDDocument doc = new PDDocument();// 2、添加空白页面,大小是 A4 纸那么大PDPage page = new PDPage(PDRectangle.A4);doc.addPage(page);// TODO 添加文本内容【单行】,指定文档对象、页面对象PDPageContentStream stream = new PDPageContentStream(doc, page);stream.beginText(); // 文本开始stream.setFont(PDType1Font.TIMES_ROMAN, 14); // 设置文本的字体、字体大小stream.newLineAtOffset(10, 200); // 设置文本显示的起始坐标位置String content = "hello world.hello world.hello world.hello world.hello world." +"hello world.hello world.hello world.hello world.";stream.showText(content); // 设置需要添加的文本内容,注意:中文内容写入时候,需要保证字体支持中文stream.endText(); // 文本结束stream.close(); // 关闭内容流// 3、生成pdf文件,保存pdf文件// 这里会在D盘下生成一个 demo.pdf 空白的pdf文档doc.save("D:\\demo.pdf");// 4、关闭文档流doc.close();}
}

运行效果:

(2)写入多行内容

PDFBox显示多行文本内容,需要使用【setLeading()】方法和【newLine()】方法,【setLeading()】方法用于设置文本的行距,【newLine()】方法用于换行显示,需要注意的是,虽然这里是写入多行内容,但是同一行中的内容如果超过了Page页面的宽度,也是会被遮挡的,不会自动换行显示

package pdfbox.demo;import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;import java.io.IOException;public class PDFBoxExample {public static void main(String[] args) throws IOException {// 1、创建文档对象PDDocument doc = new PDDocument();// 2、添加空白页面,大小是 A4 纸那么大PDPage page = new PDPage(PDRectangle.A4);doc.addPage(page);// TODO 添加文本内容,指定文档对象、页面对象PDPageContentStream stream = new PDPageContentStream(doc, page);stream.beginText(); // 文本开始stream.setFont(PDType1Font.TIMES_ROMAN, 14); // 设置内容流文本的字体、字体大小stream.newLineAtOffset(10, 350); // 设置内容流文本显示的起始坐标位置for (int i = 0; i < 10; i++) {stream.setLeading(20 + i*2); // 设置文本的前导,也就是文本行距,不设置这个行距,文本会重叠在一起String content = "hello world.hello world.hello world.hello world.hello world." +"hello world.hello world.hello world.hello world.";stream.showText(content); // 设置需要添加的文本内容,注意:中文内容写入时候,需要保证字体支持中文stream.newLine(); // 新增一个新行显示}stream.endText(); // 文本结束stream.close(); // 关闭内容流// 3、生成pdf文件,保存pdf文件// 这里会在D盘下生成一个 demo.pdf 空白的pdf文档doc.save("D:\\demo.pdf");// 4、关闭文档流doc.close();}
}

运行效果:


 

1.8、PDFBox中的坐标系

PDFBox中的坐标位置:PDFBox中是以页面左下脚为坐标圆点,水平方向是x轴,垂直方向是y轴,如下图所示:

另外,PDFBox中一般是使用【pt】作为单位,有时候我们可能会遇到【px】像素单位,所以就需要将pt和px单位进行换算,pt和px单位转换关系是:【1pt= 1px * 3 / 4】。

综上,这篇文章结束了,主要介绍PDFBox操作PDF文档之创建PDF文档、加载PDF文档、添加空白页面、删除页面、获取总页数、添加文本内容、PDFBox坐标系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/19198.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派使用Nginx 搭建轻量级网站远程访问

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 转载自cpolar极点云文章&#xff1a;树莓派使用Nginx 搭建轻量级网站远程访问 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#…

【力扣算法07】之 2.两数相加 python

文章目录 问题描述示例1示例2示例 3提示 思路分析代码分析完整代码详细分析 完结 问题描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同…

机器学习 day25(softmax在神经网络模型上的应用,提高数据精度的方法)

输出层采用softmax 在识别手写数字的模型中&#xff0c;预测y只有两个结果&#xff0c;所以输出层采用sigmoid激活函数且只有一个神经元。若预测y有10个结果&#xff08;0-9&#xff09;&#xff0c;该模型的前向传播计算方式与识别数字的模型完全相同&#xff0c;即隐藏层的…

第4集丨JavaScript 使用原型(prototype)实现继承——最佳实战2

目录 一、临时构造器方式1.1 代码实现1.2 代码分析 二. 增加uber属性&#xff0c;用于子对象访问父对象2.1 实现分析2.2 代码实现 三. 将继承封装成extend()函数3.1 代码实现3.1.1 临时构造器实现extend()3.1.2 原型复制实现extend2() 3.2 代码测试3.2.1 测试extend()函数3.2.1…

【实战项目】c++实现基于reactor的高并发服务器

基于Reactor的高并发服务器&#xff0c;分为反应堆模型&#xff0c;多线程&#xff0c;I/O模型&#xff0c;服务器&#xff0c;Http请求和响应五部分 全局 反应堆模型 Channel 描述了文件描述符以及读写事件&#xff0c;以及对应的读写销毁回调函数&#xff0c;对应存储arg读…

优化SQL查询实现高效数据检索(二)

大家好&#xff0c;本文将接着上文&#xff0c;继续介绍SQL查询优化的重要性以及如何优化SQL查询以实现更快的数据检索。 适当使用通配符 适当使用通配符对于优化SQL查询尤为重要&#xff0c;特别是在匹配字符串和模式方面。通配符是用于SQL查询中查找特定模式的特殊字符&…

K8s(kubernetes)集群搭建及dashboard安装、基础应用部署

基础介绍 概念 本质是一组服务器集群&#xff0c;在集群每个节点上运行特定的程序&#xff0c;来对节点中的容器进行管理。实现资源管理的自动化。 功能 自我修复弹性伸缩服务发现负载均衡版本回退存储编排 组件 控制节点(master)-控制平面 APIserver&#xff1a;资源操作…

Linux ❀ Openssh 8.9p1源码升级教程

文章目录 升级操作注意事项&#xff1a;1. 安装依赖2. 执行升级2.1 上传压缩包并保存配置2.2 开始升级 升级操作注意事项&#xff1a; 编译过程需要依赖&#xff0c;必须安装完成!!!SSH服务升级过程可能会导致无法远程连接服务器!!!若必须远程登录必须确认telnet服务可用!!!升…

第四十六章Java包(package)

在编写 Java 程序时&#xff0c;随着程序架构越来越大&#xff0c;类的个数也越来越多&#xff0c;这时就会发现管理程序中维护类名称也是一件很麻烦的事&#xff0c;尤其是一些同名问题的发生。有时&#xff0c;开发人员还可能需要将处理同一方面的问题的类放在同一个目录下&a…

Android - AIDL

一、概念 二、使用 2.1 Server 端 2.1.1 创建 .aidl 文件 Module右键→New→AIDL→AIDL File&#xff08;如果不可选&#xff0c;在build.gradle的buildFeatures节点添加aidl true&#xff09;。 在创建的接口中定义抽象方法。 interface IDemoAidlInterface {//自己的业…

【STM32MP135】修复EMMC模式启动时,uboot启动识别为usb0设备问题

文件路径&#xff1a;u-boot-stm32mp-v2021.10-stm32mp1-r1/arch/arm/dts/stm32mp135d-atk.dts 文件路径&#xff1a;u-boot-stm32mp-v2021.10-stm32mp1-r1/configs/stm32mp13_defconfig

基于霍夫变换的航迹起始算法研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 一、设计内容 利用Hough变换处理量测得到的含杂波的二维坐标&#xff0c;解决多目标航迹起始问题。使用Matlab进行仿真&#x…