Java利用PDFBox实现PDF文档基本操作

 更新时间:2023年11月20日 17:01:28   作者:朱友斌  
这篇文章主要为大家详细介绍了java如何利用PDFBox实现PDF文档基本操作,例如创建PDF文档、加载PDF文档、获取总页数等,需要的小伙伴可以参考下

一、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】。

以上就是Java利用PDFBox实现PDF文档基本操作的详细内容,更多关于Java PDFBox操作pdf的资料请关注脚本之家其它相关文章!

相关文章

  • java 制作验证码并进行验证实例详解

    java 制作验证码并进行验证实例详解

    这篇文章主要介绍了java 制作验证码并进行验证实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java中EnumMap和EnumSet枚举操作类的简单使用详解

    Java中EnumMap和EnumSet枚举操作类的简单使用详解

    这篇文章主要介绍了Java中EnumMap和EnumSet枚举操作类的简单使用详解,EnumMap是Map接口的一种实现,专门用于枚举类型的键,所有枚举的键必须来自同一个枚举 EnumMap不允许键为空,允许值为空,需要的朋友可以参考下
    2023-11-11
  • Fluent Mybatis如何做到代码逻辑和sql逻辑的合一

    Fluent Mybatis如何做到代码逻辑和sql逻辑的合一

    对比原生Mybatis, Mybatis Plus或者其他框架,FluentMybatis提供了哪些便利呢?很多朋友对这一问题不是很清楚,今天小编给大家带来一篇教程关于Fluent Mybatis如何做到代码逻辑和sql逻辑的合一,一起看看吧
    2021-08-08
  • 详解java关于对象的比较

    详解java关于对象的比较

    这篇文章主要为大家介绍了java关于对象的比较,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Java四种访问控制修饰符知识点总结

    Java四种访问控制修饰符知识点总结

    本篇文章给大家详细分析了Java四种访问控制修饰符的相关知识点,有兴趣的朋友可以参考学习下。
    2018-03-03
  • Spring实现拥有者权限验证的方法示例

    Spring实现拥有者权限验证的方法示例

    这篇文章主要介绍了Spring实现拥有者权限验证的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java多线程中Lock锁的使用小结

    Java多线程中Lock锁的使用小结

    这篇文章主要介绍了Java多线程中Lock锁的使用小结,本节主要讲了它的基本使用,大家可以举一反三,试试什么条件下会导致死锁,需要的朋友可以参考下
    2022-06-06
  • 关于request.getRequestDispatcher().forward()的妙用及DispatcherType对Filter配置的影响

    关于request.getRequestDispatcher().forward()的妙用及DispatcherType

    这篇文章主要介绍了关于request.getRequestDispatcher().forward()的妙用及DispatcherType对Filter配置的影响,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • eclipse构建和发布maven项目的教程

    eclipse构建和发布maven项目的教程

    这篇文章主要为大家详细介绍了eclipse构建和发布maven项目的教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 一篇文章带你入门java变量与类型

    一篇文章带你入门java变量与类型

    这篇文章主要给大家介绍了关于Java基本知识点之变量和数据类型的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08

最新评论