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

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

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

一、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)文章

最新評論