欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java利用PDFBox實(shí)現(xiàn)PDF文檔基本操作

 更新時(shí)間:2023年11月20日 17:01:28   作者:朱友斌  
這篇文章主要為大家詳細(xì)介紹了java如何利用PDFBox實(shí)現(xiàn)PDF文檔基本操作,例如創(chuàng)建PDF文檔、加載PDF文檔、獲取總頁(yè)數(shù)等,需要的小伙伴可以參考下

一、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)求處理

    SpringBoot2零基礎(chǔ)到精通之映射與常用注解請(qǐng)求處理

    SpringBoot是一種整合Spring技術(shù)棧的方式(或者說(shuō)是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開(kāi)發(fā)的腳手架,本篇讓我們一起學(xué)習(xí)映射、常用注解和方法參數(shù)的小技巧
    2022-03-03
  • javaweb實(shí)現(xiàn)注冊(cè)登錄頁(yè)面

    javaweb實(shí)現(xiàn)注冊(cè)登錄頁(yè)面

    這篇文章主要為大家詳細(xì)介紹了javaweb實(shí)現(xiàn)注冊(cè)登錄頁(yè)面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • SpringMVC集成Web與MVC執(zhí)行流程和數(shù)據(jù)響應(yīng)及交互相關(guān)介紹全面總結(jié)

    SpringMVC集成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-10
  • Intellij IDEA連接Navicat數(shù)據(jù)庫(kù)的方法

    Intellij IDEA連接Navicat數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了Intellij IDEA連接Navicat數(shù)據(jù)庫(kù)的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Ubuntu 15下安裝JDK1.8教程

    Ubuntu 15下安裝JDK1.8教程

    這篇文章主要為大家詳細(xì)介紹了Ubuntu 15下JDK1.8安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • SpringBoot利用限速器RateLimiter實(shí)現(xiàn)單機(jī)限流的示例代碼

    SpringBoot利用限速器RateLimiter實(shí)現(xiàn)單機(jī)限流的示例代碼

    本文主要介紹了SpringBoot利用限速器RateLimiter實(shí)現(xiàn)單機(jī)限流的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • java制作專屬智能陪聊機(jī)器人詳解

    java制作專屬智能陪聊機(jī)器人詳解

    人工智能一直是最近的熱點(diǎn)話題,,這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)智能陪聊機(jī)器人,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • java實(shí)現(xiàn)郵件發(fā)送

    java實(shí)現(xiàn)郵件發(fā)送

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Mybatis?mysql模糊查詢方式(CONCAT多個(gè)字段)及bug

    Mybatis?mysql模糊查詢方式(CONCAT多個(gè)字段)及bug

    這篇文章主要介紹了Mybatis?mysql模糊查詢方式(CONCAT多個(gè)字段)及bug,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Gradle進(jìn)階使用結(jié)合Sonarqube進(jìn)行代碼審查的方法

    Gradle進(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

最新評(píng)論