Java利用PDFBox實(shí)現(xiàn)PDF文檔基本操作
一、PDFBox組件
1.1、什么是PDFBox
PDFBox是Apache提供的一款專門(mén)用于操作PDF文檔的工具組件,使用PDFBox可以很方便對(duì)PDF文檔進(jìn)行各種操作,例如:創(chuàng)建PDF文檔、讀取PDF文檔內(nèi)容、加載PDF文檔內(nèi)容、合并PDF文檔、拆分PDF文檔等等,使用PDFBox需要引入對(duì)應(yīng)的依賴,這篇文章就基于下面的依賴,介紹一下PDFBox中一些常見(jiàn)的方法及其使用方式。
PDFBox所需依賴:
<dependencies> <!-- 引入 PDFBox 相關(guān)的依賴 開(kāi)始 --> <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文檔,一個(gè)文檔里面包含了多個(gè)頁(yè)面,每一個(gè)頁(yè)面里面又包含了很多的文字、段落、圖像等內(nèi)容。
創(chuàng)建PDF文檔只需要?jiǎng)?chuàng)建一個(gè)【PDDocument】對(duì)象即可,這個(gè)對(duì)象就表示PDF文檔對(duì)象,使用這種方式創(chuàng)建的PDF文檔是不包含任何頁(yè)面的,所以打開(kāi)這個(gè)PDF時(shí)候會(huì)提示錯(cuò)誤。
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)建文檔對(duì)象 PDDocument doc = new PDDocument(); // 2、生成pdf文件,保存pdf文件 // 這里會(huì)在D盤(pán)下生成一個(gè) demo.pdf 空白的pdf文檔 doc.save("D:\\demo.pdf"); // 3、關(guān)閉文檔流 doc.close(); } }
1.3、加載PDF文檔
有時(shí)候,我們需要加載一個(gè)已經(jīng)創(chuàng)建好的PDF文檔,這個(gè)時(shí)候就可以使用PDDocument類中的【load()】方法,加載指定的pdf文件,代碼如下:
(1)加載本地PDF文檔
// 1、加載文檔對(duì)象 File file = new File("D:\\demo.pdf"); PDDocument doc = PDDocument.load(file); // TODO 做一些操作 // .... // 關(guān)閉文檔 doc.close();
(2)加載網(wǎng)絡(luò)PDF文檔
PDFBox也可以通過(guò)流的方式加載網(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、添加空白頁(yè)面
當(dāng)我們創(chuàng)建好了一個(gè)PDF文檔對(duì)象,就可以繼續(xù)向這個(gè)文檔里面添加空白的Page頁(yè)面,Page頁(yè)面就是可以看得見(jiàn)的內(nèi)容區(qū)域啦,頁(yè)面有大小可以設(shè)置,例如:A4、A5、A6等尺寸,一般情況下,都是使用A4大小尺寸就可以滿足需求了。創(chuàng)建Page頁(yè)面,只需要?jiǎng)?chuàng)建一個(gè)【PDPage】對(duì)象即可,在構(gòu)造方法中可以傳遞一個(gè)【PDRectangle.A4】參數(shù),用于設(shè)置頁(yè)面大小。
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)建文檔對(duì)象 PDDocument doc = new PDDocument(); // 2、添加空白頁(yè)面,大小是 A4 紙那么大 PDPage page = new PDPage(PDRectangle.A4); doc.addPage(page); // 3、生成pdf文件,保存pdf文件 // 這里會(huì)在D盤(pán)下生成一個(gè) demo.pdf 空白的pdf文檔 doc.save("D:\\demo.pdf"); // 4、關(guān)閉文檔流 doc.close(); } }
1.5、刪除某個(gè)頁(yè)面
PDDocument文檔對(duì)象提供了一個(gè)【removePage()】方法,可以用于刪除指定下標(biāo)的頁(yè)面(從0開(kāi)始)、刪除指定Page頁(yè)面對(duì)象。
// 1、創(chuàng)建文檔對(duì)象 PDDocument doc = new PDDocument(); // TODO 刪除第1個(gè)頁(yè)面 doc.removePage(0); // 或者刪除指定的Page對(duì)象頁(yè)面 // PDPage page = new PDPage(PDRectangle.A4); // doc.removePage(page);
1.6、獲取PDF總頁(yè)數(shù)
PDDocument文檔對(duì)象提供了一個(gè)【getNumberOfPages()】方法,這個(gè)方法可以獲取當(dāng)前PDF中總共有多少個(gè)Page頁(yè)面,返回int類型。
// 1、創(chuàng)建文檔對(duì)象 PDDocument doc = new PDDocument(); // TODO 獲取文檔總頁(yè)數(shù) int pages = doc.getNumberOfPages(); System.out.println("總頁(yè)數(shù): " + pages);
1.7、添加文本內(nèi)容
前面已經(jīng)介紹了創(chuàng)建PDF文檔、添加PDF空白頁(yè)面、獲取PDF頁(yè)數(shù)等內(nèi)容,但是還沒(méi)有介紹如何向PDF頁(yè)面中寫(xiě)入內(nèi)容,我們可以向PDF文檔中寫(xiě)入文本內(nèi)容、圖像內(nèi)容、表單內(nèi)容等,這里先介紹一下如何寫(xiě)入純文本內(nèi)容。
PDFBox將一個(gè)Page頁(yè)面中的內(nèi)容抽象成內(nèi)容流的形式,所以我們?cè)趯?duì)Page頁(yè)面內(nèi)容進(jìn)行操作的時(shí)候,也需要通過(guò)內(nèi)容流來(lái)完成,內(nèi)容流是采用PDPageContentStream對(duì)象表示的。
(1)寫(xiě)入單行內(nèi)容
寫(xiě)入單行內(nèi)容,也就是說(shuō),無(wú)論我們寫(xiě)入的文本內(nèi)容有多長(zhǎng),這個(gè)內(nèi)容只會(huì)顯示在一行上面,超出PDF頁(yè)面范圍之外的內(nèi)容會(huì)被遮擋,案例代碼如下:
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)建文檔對(duì)象 PDDocument doc = new PDDocument(); // 2、添加空白頁(yè)面,大小是 A4 紙那么大 PDPage page = new PDPage(PDRectangle.A4); doc.addPage(page); // TODO 添加文本內(nèi)容【單行】,指定文檔對(duì)象、頁(yè)面對(duì)象 PDPageContentStream stream = new PDPageContentStream(doc, page); stream.beginText(); // 文本開(kāi)始 stream.setFont(PDType1Font.TIMES_ROMAN, 14); // 設(shè)置文本的字體、字體大小 stream.newLineAtOffset(10, 200); // 設(shè)置文本顯示的起始坐標(biāo)位置 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)容寫(xiě)入時(shí)候,需要保證字體支持中文 stream.endText(); // 文本結(jié)束 stream.close(); // 關(guān)閉內(nèi)容流 // 3、生成pdf文件,保存pdf文件 // 這里會(huì)在D盤(pán)下生成一個(gè) demo.pdf 空白的pdf文檔 doc.save("D:\\demo.pdf"); // 4、關(guān)閉文檔流 doc.close(); } }
運(yùn)行效果:
(2)寫(xiě)入多行內(nèi)容
PDFBox顯示多行文本內(nèi)容,需要使用【setLeading()】方法和【newLine()】方法,【setLeading()】方法用于設(shè)置文本的行距,【newLine()】方法用于換行顯示,需要注意的是,雖然這里是寫(xiě)入多行內(nèi)容,但是同一行中的內(nèi)容如果超過(guò)了Page頁(yè)面的寬度,也是會(huì)被遮擋的,不會(huì)自動(dòng)換行顯示。
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)建文檔對(duì)象 PDDocument doc = new PDDocument(); // 2、添加空白頁(yè)面,大小是 A4 紙那么大 PDPage page = new PDPage(PDRectangle.A4); doc.addPage(page); // TODO 添加文本內(nèi)容,指定文檔對(duì)象、頁(yè)面對(duì)象 PDPageContentStream stream = new PDPageContentStream(doc, page); stream.beginText(); // 文本開(kāi)始 stream.setFont(PDType1Font.TIMES_ROMAN, 14); // 設(shè)置內(nèi)容流文本的字體、字體大小 stream.newLineAtOffset(10, 350); // 設(shè)置內(nèi)容流文本顯示的起始坐標(biāo)位置 for (int i = 0; i < 10; i++) { stream.setLeading(20 + i*2); // 設(shè)置文本的前導(dǎo),也就是文本行距,不設(shè)置這個(gè)行距,文本會(huì)重疊在一起 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)容寫(xiě)入時(shí)候,需要保證字體支持中文 stream.newLine(); // 新增一個(gè)新行顯示 } stream.endText(); // 文本結(jié)束 stream.close(); // 關(guān)閉內(nèi)容流 // 3、生成pdf文件,保存pdf文件 // 這里會(huì)在D盤(pán)下生成一個(gè) demo.pdf 空白的pdf文檔 doc.save("D:\\demo.pdf"); // 4、關(guān)閉文檔流 doc.close(); } }
運(yùn)行效果:
1.8、PDFBox中的坐標(biāo)系
PDFBox中的坐標(biāo)位置:PDFBox中是以頁(yè)面左下腳為坐標(biāo)圓點(diǎn),水平方向是x軸,垂直方向是y軸,如下圖所示:
另外,PDFBox中一般是使用【pt】作為單位,有時(shí)候我們可能會(huì)遇到【px】像素單位,所以就需要將pt和px單位進(jìn)行換算,pt和px單位轉(zhuǎn)換關(guān)系是:【1pt= 1px * 3 / 4】。
以上就是Java利用PDFBox實(shí)現(xiàn)PDF文檔基本操作的詳細(xì)內(nèi)容,更多關(guān)于Java PDFBox操作pdf的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot2零基礎(chǔ)到精通之映射與常用注解請(qǐng)求處理
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說(shuō)是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開(kāi)發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)映射、常用注解和方法參數(shù)的小技巧2022-03-03javaweb實(shí)現(xiàn)注冊(cè)登錄頁(yè)面
這篇文章主要為大家詳細(xì)介紹了javaweb實(shí)現(xiàn)注冊(cè)登錄頁(yè)面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04SpringMVC集成Web與MVC執(zhí)行流程和數(shù)據(jù)響應(yīng)及交互相關(guān)介紹全面總結(jié)
Spring MVC 是 Spring 提供的一個(gè)基于 MVC 設(shè)計(jì)模式的輕量級(jí) Web 開(kāi)發(fā)框架,本質(zhì)上相當(dāng)于 Servlet,Spring MVC 角色劃分清晰,分工明細(xì),這篇文章主要介紹了SpringMVC集成Web與MVC執(zhí)行流程和數(shù)據(jù)響應(yīng)及交互2022-10-10Intellij IDEA連接Navicat數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Intellij IDEA連接Navicat數(shù)據(jù)庫(kù)的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借價(jià)值,需要的朋友可以參考下2021-03-03SpringBoot利用限速器RateLimiter實(shí)現(xiàn)單機(jī)限流的示例代碼
本文主要介紹了SpringBoot利用限速器RateLimiter實(shí)現(xiàn)單機(jī)限流的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Mybatis?mysql模糊查詢方式(CONCAT多個(gè)字段)及bug
這篇文章主要介紹了Mybatis?mysql模糊查詢方式(CONCAT多個(gè)字段)及bug,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Gradle進(jìn)階使用結(jié)合Sonarqube進(jìn)行代碼審查的方法
今天小編就為大家分享一篇關(guān)于Gradle進(jìn)階使用結(jié)合Sonarqube進(jìn)行代碼審查的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12