Java利用PDFBox實現(xiàn)PDF文檔基本操作
一、PDFBox組件
1.1、什么是PDFBox
PDFBox是Apache提供的一款專門用于操作PDF文檔的工具組件,使用PDFBox可以很方便對PDF文檔進行各種操作,例如:創(chuàng)建PDF文檔、讀取PDF文檔內(nèi)容、加載PDF文檔內(nèi)容、合并PDF文檔、拆分PDF文檔等等,使用PDFBox需要引入對應(yīng)的依賴,這篇文章就基于下面的依賴,介紹一下PDFBox中一些常見的方法及其使用方式。
PDFBox所需依賴:
<dependencies>
<!-- 引入 PDFBox 相關(guān)的依賴 開始 -->
<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 相關(guān)的依賴 結(jié)束 -->
</dependencies>1.2、創(chuàng)建PDF文檔
pdf,英文全稱是:Portable Document File,便攜式文檔文件,又叫做pdf文檔,一個文檔里面包含了多個頁面,每一個頁面里面又包含了很多的文字、段落、圖像等內(nèi)容。
創(chuàng)建PDF文檔只需要創(chuàng)建一個【PDDocument】對象即可,這個對象就表示PDF文檔對象,使用這種方式創(chuàng)建的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、創(chuàng)建文檔對象
PDDocument doc = new PDDocument();
// 2、生成pdf文件,保存pdf文件
// 這里會在D盤下生成一個 demo.pdf 空白的pdf文檔
doc.save("D:\\demo.pdf");
// 3、關(guān)閉文檔流
doc.close();
}
}1.3、加載PDF文檔
有時候,我們需要加載一個已經(jīng)創(chuàng)建好的PDF文檔,這個時候就可以使用PDDocument類中的【load()】方法,加載指定的pdf文件,代碼如下:
(1)加載本地PDF文檔
// 1、加載文檔對象
File file = new File("D:\\demo.pdf");
PDDocument doc = PDDocument.load(file);
// TODO 做一些操作
// ....
// 關(guān)閉文檔
doc.close();
(2)加載網(wǎng)絡(luò)PDF文檔
PDFBox也可以通過流的方式加載網(wǎng)絡(luò)上的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、加載網(wǎng)絡(luò)PDF文檔
PDDocument doc = PDDocument.load(new URL("https://ip:port/demo.pdf").openStream());
// .....
// 關(guān)閉文檔
doc.close();
}
}1.4、添加空白頁面
當我們創(chuàng)建好了一個PDF文檔對象,就可以繼續(xù)向這個文檔里面添加空白的Page頁面,Page頁面就是可以看得見的內(nèi)容區(qū)域啦,頁面有大小可以設(shè)置,例如:A4、A5、A6等尺寸,一般情況下,都是使用A4大小尺寸就可以滿足需求了。創(chuàng)建Page頁面,只需要創(chuàng)建一個【PDPage】對象即可,在構(gòu)造方法中可以傳遞一個【PDRectangle.A4】參數(shù),用于設(shè)置頁面大小。
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、創(chuàng)建文檔對象
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、關(guān)閉文檔流
doc.close();
}
}1.5、刪除某個頁面
PDDocument文檔對象提供了一個【removePage()】方法,可以用于刪除指定下標的頁面(從0開始)、刪除指定Page頁面對象。
// 1、創(chuàng)建文檔對象
PDDocument doc = new PDDocument();
// TODO 刪除第1個頁面
doc.removePage(0);
// 或者刪除指定的Page對象頁面
// PDPage page = new PDPage(PDRectangle.A4);
// doc.removePage(page);
1.6、獲取PDF總頁數(shù)
PDDocument文檔對象提供了一個【getNumberOfPages()】方法,這個方法可以獲取當前PDF中總共有多少個Page頁面,返回int類型。
// 1、創(chuàng)建文檔對象
PDDocument doc = new PDDocument();
// TODO 獲取文檔總頁數(shù)
int pages = doc.getNumberOfPages();
System.out.println("總頁數(shù): " + pages);
1.7、添加文本內(nèi)容
前面已經(jīng)介紹了創(chuàng)建PDF文檔、添加PDF空白頁面、獲取PDF頁數(shù)等內(nèi)容,但是還沒有介紹如何向PDF頁面中寫入內(nèi)容,我們可以向PDF文檔中寫入文本內(nèi)容、圖像內(nèi)容、表單內(nèi)容等,這里先介紹一下如何寫入純文本內(nèi)容。
PDFBox將一個Page頁面中的內(nèi)容抽象成內(nèi)容流的形式,所以我們在對Page頁面內(nèi)容進行操作的時候,也需要通過內(nèi)容流來完成,內(nèi)容流是采用PDPageContentStream對象表示的。
(1)寫入單行內(nèi)容
寫入單行內(nèi)容,也就是說,無論我們寫入的文本內(nèi)容有多長,這個內(nèi)容只會顯示在一行上面,超出PDF頁面范圍之外的內(nèi)容會被遮擋,案例代碼如下:
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、創(chuàng)建文檔對象
PDDocument doc = new PDDocument();
// 2、添加空白頁面,大小是 A4 紙那么大
PDPage page = new PDPage(PDRectangle.A4);
doc.addPage(page);
// TODO 添加文本內(nèi)容【單行】,指定文檔對象、頁面對象
PDPageContentStream stream = new PDPageContentStream(doc, page);
stream.beginText(); // 文本開始
stream.setFont(PDType1Font.TIMES_ROMAN, 14); // 設(shè)置文本的字體、字體大小
stream.newLineAtOffset(10, 200); // 設(shè)置文本顯示的起始坐標位置
String content = "hello world.hello world.hello world.hello world.hello world." +
"hello world.hello world.hello world.hello world.";
stream.showText(content); // 設(shè)置需要添加的文本內(nèi)容,注意:中文內(nèi)容寫入時候,需要保證字體支持中文
stream.endText(); // 文本結(jié)束
stream.close(); // 關(guān)閉內(nèi)容流
// 3、生成pdf文件,保存pdf文件
// 這里會在D盤下生成一個 demo.pdf 空白的pdf文檔
doc.save("D:\\demo.pdf");
// 4、關(guān)閉文檔流
doc.close();
}
}運行效果:

(2)寫入多行內(nèi)容
PDFBox顯示多行文本內(nèi)容,需要使用【setLeading()】方法和【newLine()】方法,【setLeading()】方法用于設(shè)置文本的行距,【newLine()】方法用于換行顯示,需要注意的是,雖然這里是寫入多行內(nèi)容,但是同一行中的內(nèi)容如果超過了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、創(chuàng)建文檔對象
PDDocument doc = new PDDocument();
// 2、添加空白頁面,大小是 A4 紙那么大
PDPage page = new PDPage(PDRectangle.A4);
doc.addPage(page);
// TODO 添加文本內(nèi)容,指定文檔對象、頁面對象
PDPageContentStream stream = new PDPageContentStream(doc, page);
stream.beginText(); // 文本開始
stream.setFont(PDType1Font.TIMES_ROMAN, 14); // 設(shè)置內(nèi)容流文本的字體、字體大小
stream.newLineAtOffset(10, 350); // 設(shè)置內(nèi)容流文本顯示的起始坐標位置
for (int i = 0; i < 10; i++) {
stream.setLeading(20 + i*2); // 設(shè)置文本的前導,也就是文本行距,不設(shè)置這個行距,文本會重疊在一起
String content = "hello world.hello world.hello world.hello world.hello world." +
"hello world.hello world.hello world.hello world.";
stream.showText(content); // 設(shè)置需要添加的文本內(nèi)容,注意:中文內(nèi)容寫入時候,需要保證字體支持中文
stream.newLine(); // 新增一個新行顯示
}
stream.endText(); // 文本結(jié)束
stream.close(); // 關(guān)閉內(nèi)容流
// 3、生成pdf文件,保存pdf文件
// 這里會在D盤下生成一個 demo.pdf 空白的pdf文檔
doc.save("D:\\demo.pdf");
// 4、關(guān)閉文檔流
doc.close();
}
}運行效果:

1.8、PDFBox中的坐標系
PDFBox中的坐標位置:PDFBox中是以頁面左下腳為坐標圓點,水平方向是x軸,垂直方向是y軸,如下圖所示:

另外,PDFBox中一般是使用【pt】作為單位,有時候我們可能會遇到【px】像素單位,所以就需要將pt和px單位進行換算,pt和px單位轉(zhuǎn)換關(guān)系是:【1pt= 1px * 3 / 4】。
以上就是Java利用PDFBox實現(xiàn)PDF文檔基本操作的詳細內(nèi)容,更多關(guān)于Java PDFBox操作pdf的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ArrayList和LinkedList的區(qū)別、擴容機制以及底層的實現(xiàn)方式
這篇文章主要介紹了ArrayList和LinkedList的區(qū)別、擴容機制以及底層的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
Elasticsearch中store field與non-store field的區(qū)別說明
這篇文章主要介紹了Elasticsearch中store field與non-store field的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
一鍵清除maven倉庫中下載失敗的jar包的實現(xiàn)方法
這篇文章主要介紹了一鍵清除maven倉庫中下載失敗的jar包的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
SpringBoot中循環(huán)依賴問題的原理與解決方案
在Spring Boot開發(fā)中,依賴注入(DI)是核心特性之一,本文將通過一個實際錯誤案例,深入分析Spring Boot循環(huán)依賴的成因、解決方案,并提供最佳實踐建議,希望對大家有所幫助2025-07-07

