一文詳解如何使用Java獲取PDF頁(yè)面信息
引言
了解 PDF 頁(yè)面屬性是我們?cè)谔幚砦臋n、內(nèi)容提取、打印設(shè)置或頁(yè)面重組等任務(wù)時(shí)不可或缺的一環(huán)。PDF 文件可能包含多個(gè)頁(yè)面,而這些頁(yè)面可能具有不同的寬高、旋轉(zhuǎn)角度、方向模式甚至自定義標(biāo)簽和邊框信息。
本文將介紹如何使用 Java 讀取 PDF 頁(yè)面信息,包括:
- 獲取 PDF 頁(yè)數(shù)
- 獲取頁(yè)面尺寸(寬高)
- 獲取頁(yè)面旋轉(zhuǎn)角度
- 判斷頁(yè)面方向(橫向 / 縱向)
- 獲取頁(yè)面標(biāo)簽
- 獲取頁(yè)面邊框信息(MediaBox、CropBox 等)
一、安裝和引入PDF處理庫(kù)
要在 Java 中獲取 PDF 頁(yè)面信息,可使用 Spire.PDF for Java 庫(kù)。它支持加載、解析、編輯和導(dǎo)出 PDF 文件。
引入依賴
1. Maven項(xiàng)目
如果你使用 Maven 構(gòu)建項(xiàng)目,可在 pom.xml 中添加如下依賴:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>11.7.0</version>
</dependency>2. 非Maven項(xiàng)目
對(duì)于非 Maven 項(xiàng)目,你可以前往 官網(wǎng) 下載 jar 包并手動(dòng)導(dǎo)入項(xiàng)目。
二、獲取 PDF 頁(yè)數(shù)
了解 PDF 的總頁(yè)數(shù)是處理文檔的第一步,它可以幫助我們執(zhí)行分頁(yè)提取、范圍打印或頁(yè)面遍歷等操作。
實(shí)現(xiàn)步驟:
- 創(chuàng)建 PdfDocument 對(duì)象;
- 使用 PdfDocument.loadFromFile() 方法打開(kāi) PDF 文檔;
- 調(diào)用 PdfDocument.getPages().getCount() 獲取頁(yè)數(shù)。
示例代碼:
import com.spire.pdf.*;
public class GetPageCount {
public static void main(String[] args) {
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("測(cè)試.pdf");
int pageCount = pdf.getPages().getCount();
System.out.println("該 PDF 共 " + pageCount + " 頁(yè)。");
pdf.close();
}
}
三、獲取頁(yè)面尺寸(寬高)
頁(yè)面的尺寸決定了內(nèi)容的排版范圍,不同的 PDF 頁(yè)面可能采用不同的紙張標(biāo)準(zhǔn),如 A4、Letter 或自定義大小。
實(shí)現(xiàn)步驟:
- 打開(kāi) PDF 文檔;
- 使用PdfDocument.getPages().get()方法獲取指定頁(yè)面(通過(guò)索引);
- 調(diào)用 PdfPageBase.getSize().getWidth() 和 PdfPageBase.getSize().getHeight() 方法獲取寬高信息;
- 輸出尺寸數(shù)據(jù)。
示例代碼:
import com.spire.pdf.*;
public class GetPageSize {
public static void main(String[] args) {
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("測(cè)試.pdf");
PdfPageBase page = pdf.getPages().get(0); // 獲取第一頁(yè)
double width = page.getSize().getWidth();
double height = page.getSize().getHeight();
System.out.printf("第一頁(yè)尺寸為:%.2f x %.2f pt%n", width, height);
pdf.close();
}
}注意,頁(yè)面尺寸默認(rèn)單位為 pt(磅),1 英寸 = 72 磅。如果你需要將尺寸轉(zhuǎn)換為英寸、像素、厘米或毫米進(jìn)行打印適配或前端渲染,可以使用 PdfUnitConvertor 類進(jìn)行單位轉(zhuǎn)換:
float pointValue = 595.0f; // 示例:A4 寬度為 595 pt
PdfUnitConvertor converter = new PdfUnitConvertor();
float inch = converter.convertUnits(pointValue, PdfGraphicsUnit.Point, PdfGraphicsUnit.Inch);
float pixel = converter.convertUnits(pointValue, PdfGraphicsUnit.Point, PdfGraphicsUnit.Pixel);
float mm = converter.convertUnits(pointValue, PdfGraphicsUnit.Point, PdfGraphicsUnit.Millimeter);
float cm = converter.convertUnits(pointValue, PdfGraphicsUnit.Point, PdfGraphicsUnit.Centimeter);
System.out.printf("595 pt 對(duì)應(yīng):%.2f 英寸,%.2f 像素,%.2f 毫米,%.2f 厘米%n", inch, pixel, mm, cm);四、獲取頁(yè)面旋轉(zhuǎn)角度
頁(yè)面旋轉(zhuǎn)信息可以幫助我們判斷是否需要在程序中進(jìn)行角度還原或頁(yè)面調(diào)整,避免內(nèi)容呈現(xiàn)異常。
實(shí)現(xiàn)步驟:
- 打開(kāi) PDF 文檔;
- 獲取目標(biāo)頁(yè)面;
- 使用 PdfPageBase.getRotation().getValue() 方法獲取旋轉(zhuǎn)角度;
- 輸出角度信息。
示例代碼:
import com.spire.pdf.*;
public class GetPageRotation {
public static void main(String[] args) {
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("測(cè)試.pdf");
PdfPageBase page = pdf.getPages().get(0);
int rotation = page.getRotation().getValue();
System.out.println("第一頁(yè)旋轉(zhuǎn)角度為:" + rotation + "°");
pdf.close();
}
}五、判斷頁(yè)面方向(橫向 / 縱向)
PDF 頁(yè)面可分為 Portrait(縱向)和 Landscape(橫向),不同方向適用于不同類型的內(nèi)容展示(如文字或表格)。
實(shí)現(xiàn)步驟:
- 打開(kāi) PDF 文檔;
- 獲取目標(biāo)頁(yè)面;
- 調(diào)用 PdfPageBase.getSize().getWidth() 和 PdfPageBase.getSize().getHeight() 方法獲取頁(yè)面的寬高信息;
- 比較寬度與高度。若寬度 > 高度,則為橫向,否則為縱向;
- 輸出頁(yè)面方向信息。
示例代碼:
import com.spire.pdf.*;
public class GetPageOrientation {
public static void main(String[] args) {
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("測(cè)試.pdf");
PdfPageBase page = pdf.getPages().get(0);
double width = page.getSize().getWidth();
double height = page.getSize().getHeight();
String orientation = width > height ? "橫向" : "縱向";
System.out.println("第一頁(yè)頁(yè)面方向?yàn)椋? + orientation);
pdf.close();
}
}六、獲取頁(yè)面標(biāo)簽
PDF 頁(yè)面標(biāo)簽(Page Label)可用于自定義頁(yè)碼(如 i, ii, iii, A-1, A-2),對(duì)于章節(jié)分隔、目錄定位等功能尤為常見(jiàn)。
實(shí)現(xiàn)步驟:
- 打開(kāi) PDF 文檔并獲取目標(biāo)頁(yè)面;
- 使用 PdfPageBase.getPageLabel() 方法獲取目標(biāo)頁(yè)的標(biāo)簽文字;
- 判斷標(biāo)簽文字是否存在。若存在,輸出標(biāo)簽信息,否則輸出“無(wú)標(biāo)簽”。
示例代碼:
import com.spire.pdf.*;
public class GetPageLabel {
public static void main(String[] args) {
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("示例.pdf");
PdfPageBase page = pdf.getPages().get(0);
String label = page.getPageLabel();
String labelText = (label != null && !label.trim().isEmpty()) ? label : "無(wú)標(biāo)簽";
System.out.println("第一頁(yè)頁(yè)面標(biāo)簽為:" + labelText);
pdf.close();
}
}七、獲取頁(yè)面邊框信息
PDF 頁(yè)面所定義的邊框不僅用于限制內(nèi)容的顯示范圍,還涵蓋多個(gè)與印刷和裁切相關(guān)的區(qū)域。這些邊框各自承擔(dān)不同的功能,例如用于標(biāo)識(shí)紙張尺寸、設(shè)置可視區(qū)域、預(yù)留出血位置以及定義裁切和內(nèi)容區(qū)域等。下圖展示了這些邊框在頁(yè)面中的分布情況:

| 邊框類型 | 說(shuō)明 |
| MediaBox | 頁(yè)面介質(zhì)框,表示紙張的實(shí)際物理尺寸范圍 |
| CropBox | 裁剪框,定義最終用于顯示或打印的區(qū)域 |
| BleedBox | 出血框,用于印刷時(shí)預(yù)留的出血區(qū)域 |
| TrimBox | 成品框,表示裁剪后的頁(yè)面成品大小 |
| ArtBox | 作品框,限定頁(yè)面中有效的內(nèi)容區(qū)域 |
實(shí)現(xiàn)步驟:
- 打開(kāi)PDF文檔并獲取目標(biāo)頁(yè)面;
- 分別使用PdfPageBase類的 getMediaBox()、getCropBox()、getBleedBox()、getTrimBox()、getArtBox() 方法獲取各個(gè)對(duì)應(yīng)的邊框信息;
- 分別使用 Rectangle2D類的getWidth()、getHeight()、getX()、getY() 方法讀取每個(gè)邊框的寬度、高度、以及X和Y坐標(biāo)等屬性值,輸出結(jié)果。
示例代碼:
import com.spire.pdf.*;
import java.awt.geom.Rectangle2D;
public class GetPageBoxes {
public static void main(String[] args) {
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("測(cè)試.pdf");
PdfPageBase page = pdf.getPages().get(0);
Rectangle2D mediaBox = page.getMediaBox();
Rectangle2D cropBox = page.getCropBox();
Rectangle2D bleedBox = page.getBleedBox();
Rectangle2D trimBox = page.getTrimBox();
Rectangle2D artBox = page.getArtBox();
System.out.printf("MediaBox: 寬 %.2f, 高 %.2f, X %.2f, Y %.2f%n",
mediaBox.getWidth(), mediaBox.getHeight(), mediaBox.getX(), mediaBox.getY());
System.out.printf("CropBox: 寬 %.2f, 高 %.2f, X %.2f, Y %.2f%n",
cropBox.getWidth(), cropBox.getHeight(), cropBox.getX(), cropBox.getY());
System.out.printf("BleedBox: 寬 %.2f, 高 %.2f, X %.2f, Y %.2f%n",
bleedBox.getWidth(), bleedBox.getHeight(), bleedBox.getX(), bleedBox.getY());
System.out.printf("TrimBox: 寬 %.2f, 高 %.2f, X %.2f, Y %.2f%n",
trimBox.getWidth(), trimBox.getHeight(), trimBox.getX(), trimBox.getY());
System.out.printf("ArtBox: 寬 %.2f, 高 %.2f, X %.2f, Y %.2f%n",
artBox.getWidth(), artBox.getHeight(), artBox.getX(), artBox.getY());
pdf.close();
}
}
到此這篇關(guān)于一文詳解如何使用Java獲取PDF頁(yè)面信息的文章就介紹到這了,更多相關(guān)Java獲取PDF信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ IDEA 2021 Tomcat 8啟動(dòng)亂碼問(wèn)題的解決步驟
很多朋友遇到過(guò)IntelliJ IDEA 2021 Tomcat 8啟動(dòng)的時(shí)候出現(xiàn)各種奇葩問(wèn)題,最近有童鞋反映IntelliJ IDEA 2021 Tomcat 8啟動(dòng)亂碼,正好我也遇到這個(gè)問(wèn)題,下面我把解決方法分享給大家需要的朋友參考下吧2021-06-06
SpringMVC使用@Valid注解實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證的代碼示例
在 Web 開(kāi)發(fā)中,數(shù)據(jù)驗(yàn)證是一個(gè)非常重要的環(huán)節(jié),它可以確保數(shù)據(jù)的合法性和正確性,保護(hù)系統(tǒng)不受到惡意攻擊或用戶誤操作的影響,在 SpringMVC 中,我們可以使用 @Valid 注解來(lái)實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證,所以本文就給大家介紹具體的使用方法,需要的朋友可以參考下2023-07-07
java發(fā)送http請(qǐng)求時(shí)如何處理異步回調(diào)結(jié)果
這篇文章主要介紹了java發(fā)送http請(qǐng)求時(shí)如何處理異步回調(diào)結(jié)果問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Java源碼解析阻塞隊(duì)列ArrayBlockingQueue介紹
今天小編就為大家分享一篇關(guān)于Java源碼解析阻塞隊(duì)列ArrayBlockingQueue介紹,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
一次 Java 內(nèi)存泄漏的排查解決過(guò)程詳解
這篇文章主要介紹了一次 Java 內(nèi)存泄漏的排查過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07

