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è)置文本的前導(dǎo),也就是文本行距,不設(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)文章
Java 實戰(zhàn)圖書管理系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現(xiàn)一個圖書管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11使用HandlerMethodArgumentResolver用于統(tǒng)一獲取當前登錄用戶
這篇文章主要介紹了使用HandlerMethodArgumentResolver用于統(tǒng)一獲取當前登錄用戶實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12SpringBoot啟動時自動執(zhí)行代碼的幾種實現(xiàn)方式
這篇文章主要給大家介紹了關(guān)于SpringBoot啟動時自動執(zhí)行代碼的幾種實現(xiàn)方式,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-02-02java實現(xiàn)將ftp和http的文件直接傳送到hdfs
前面幾篇文章,我們已經(jīng)做了很好的鋪墊了,幾個要用到的工具我們都做了出來,本文就是將他們集合起來,說下具體的用法,小伙伴們可以參考下。2015-03-03從源碼角度簡單看StringBuilder和StringBuffer的異同(全面解析)
下面小編就為大家分享一篇從源碼角度簡單看StringBuilder和StringBuffer的異同(全面解析),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12使用原生JDBC動態(tài)解析并獲取表格列名和數(shù)據(jù)的方法
這篇文章主要介紹了使用原生JDBC動態(tài)解析并獲取表格列名和數(shù)據(jù),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08