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

news2024/11/25 17:33:56

这篇文章,主要介绍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.coloradmin.cn/o/742847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三分钟了解 SpringBoot 的启动流程

一、前言 背景&#xff1a;最近有位开发同学说面试被问到Spring Boot 的启动流程&#xff0c;以及被问到Spring Boot 的嵌入式Web容器是什么时候加载的。如何加载的。是怎么无缝切换的。 这些问题&#xff0c;其实回答起来也是比较复杂的。我们今天就从 SpringApplication.ru…

3D设计建模软件The Foundry Modo 16对Mac和Windows的系统要求

Foundry MODO是一款功能强大的三维建模、动画和渲染软件。它为艺术家和设计师提供了一套全面的工具&#xff0c;可以用来创建令人惊叹的视觉效果。无论是制作电影、电视节目、游戏还是其他数字媒体内容&#xff0c;MODO都可以满足您的需求。 MODO具有直观的用户界面&#xff0…

redis主从配置

从redis配置&#xff1a;redis6386.conf include /data/redis/redis6380.conf #主redis配置文件路径&#xff08;这里是引用主配置文件里的配置在修改从配置&#xff09; daemonize yes #在后台启动 protected-mode no #加密保护关闭 bind 192.168.3.*** requirepas…

云主机安全-私有密钥安全认证

场景描述 云主机凭借其性价比高、生配扩容便利、运维便捷、稳定性高等优势深受用户青睐&#xff0c;越来越多的企业开始租用云主机&#xff0c;将自己的服务器、业务系统等搭建或存储到云主机上。 用户痛点 用户租用或托管的云主机&#xff0c;运维端口&#xff08;远程桌面&…

SSM框架最新整合保姆级教程(IDEA版)

SSM框架最新整合保姆级教程(IDEA版) 一、环境要求 ​ 环境&#xff1a; IDEAMySQL 5.7.19Tomcat 9Maven 3.6 要求&#xff1a; 需要熟练掌握MySQL数据库&#xff0c;Spring&#xff0c;JavaWeb及MyBatis知识&#xff0c;简单的前端知识&#xff1b; 完整代码&#xff1a;…

Openlayers实战:绘制带箭头的线

Openlayers地图中有的时候会用到这样的场景,连续画几段线段,但是要知道绘制的方向,给人以指引的提示作用。 怎么绘制呢? 在本实战中,主要的是处理线段的显示方式,在线段的拐点处附加上箭头图片,具体看实际的源代码。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhu…

4 生成全排列

4 生成全排列 作者: 赵晓鹏时间限制: 1S章节: 递归与分治 输入范例 : 无 输出范例 : Perm1(1):123 Perm1(2):123 Perm1(2):213 Perm1(2):321 Perm1(3):123 Perm1(3):132 Perm1(3):213 Perm1(3):231 Perm1(3):321 Perm1(3):312 Online Judge 1.0 #include<iostream> …

【全栈开发指南】数据权限使用配置

数据权限配置有两种方式&#xff1a; 通过系统配置界面&#xff0c;实时配置生效。 通过代码注解配置。 一、通过系统配置界面配置数据权限 系统配置的数据权限是通过系统配置界面将配置信息保存在数据库&#xff0c;然后系统启动时&#xff0c;将配置信息保存到Redis缓存来…

SpringCloud分布式搜索引擎、数据聚合、ES和MQ的结合使用、ES集群的问题

目录 数据聚合 聚合的分类 ​编辑 DSL实现Bucket聚合 ​编辑 DSL实现Metrics聚合​编辑 RestAPI实现聚合 对接前端接口​编辑 自定义分词器​编辑 Completion suggester查询 Completion suggester查询 酒店数据自动补全 实现酒店搜索框界面输入框的自动补全 数据同步问…

Codeforces Round 875 (Div. 1) A. Copil Copac Draws Trees

题意 Copil Copac 给定了一个由 n−1 条边组成的列表&#xff0c;该列表描述了一棵由 n 个顶点组成的树。他决定用下面的算法来绘制它&#xff1a; 步骤 0&#xff1a;绘制第一个顶点&#xff08;顶点1&#xff09;。转到步骤1。 步骤 1&#xff1a;对于输入中的每一条边&#…

Window10 系统 RabbitMQ的安装和简单使用

1、下载 & 安装 Erlang 因为RabbitMQ的服务端是基于 Erlang编写的&#xff0c;所以&#xff0c;首先需要安装Erlang。 1&#xff09;下载 下载地址如下&#xff1a; https://www.erlang.org/downloads此处下载比较慢&#xff0c;可以参考如下百度网盘&#xff1a; 链接…

常用的缓存工具有ehcache、memcache和redis,这里介绍spring中ehcache的配置。

常用的缓存工具有ehcache、memcache和redis&#xff0c;这里介绍spring中ehcache的配置。 1.在pom添加依赖&#xff1a; <!-- ehcache 相关依赖 --><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId><ve…

正则表达式测试(二)

一、中括号的语法 匹配所有的字符&#xff0c;返回一个数组,包含匹配的所有字符内容&#xff0c;按顺序展开&#xff1b; 注意&#xff1a;空格也会被匹配到 匹配所有符合的字符&#xff0c;返回一个数组。 匹配空白字符 匹配非空白字符 匹配 空白字符 非空白字符 如上所示&am…

二叉树的简单遍历

假设节点数据类如下&#xff1a; public class TreeNode {String val;TreeNode left;TreeNode right;TreeNode() { }TreeNode(String val) {this.val val;}TreeNode(String val, TreeNode left, TreeNode right) {this.val val;this.left left;this.right right;} } 二叉…

Vue3+TS+Vite创建项目,并导入Element-plus和Sass

一、vue3创建项目 1.桌面新建一个文件夹Vue3-app 打开编辑器导入文件夹&#xff0c;编辑器打开终端输入或者命令行工具cd到项目目录下输入 npm init vuelatest 回车运行 这里我选择了TSVite来开发&#xff0c;并选择安装路由 2.cd到 vue-project目录下 输入 npm install 回车…

路径规划算法:基于晶体结构优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于晶体结构优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于晶体结构优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

基于高斯混合模型聚类的风电场短期功率预测方法(Pythonmatlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MySQL 学习笔记 1:存储过程

MySQL 学习笔记 1&#xff1a;存储过程 图源&#xff1a;ubiq.co 存储过程可以看做是将一组 SQL打包执行&#xff0c;并返回最终的执行结果。 其优点是&#xff1a;因为存储过程中的 SQL 是同时一次执行&#xff0c;所以没有数据一致性的问题。其次&#xff0c;不需要由客户端…

【Docker】Centos安装docker-compose

下载 直接从GitHub下载docker到本地的/usr/local/bin/目录下&#xff0c;赋予读写权限&#xff0c;检查&#xff0c;就可以使用了&#xff1b; # 下载到/usr/local/bin/docker-compose目录下 sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1…

实现死锁检测组件

文章目录 一、死锁1.1 死锁的定义1.2 死锁产生的条件 二、死锁检测2.1 资源分配图2.2 有向图2.3 死锁检测组件 -- hook 三、死锁设计3.1 有向图3.1.1 数据结构3.1.2 图的基本操作接口3.1.3 判断有向图是否成环 3.2 hook3.2.1 重载系统的锁接口3.2.2 加锁前——lock_before3.2.3…