目录

引言

一、安装和引入PDF处理库

二、获取 PDF 页数

三、获取页面尺寸(宽高)

四、获取页面旋转角度

五、判断页面方向(横向 / 纵向)

六、获取页面标签

七、获取页面边框信息

八、总结


引言

了解 PDF 页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环。PDF 文件可能包含多个页面,而这些页面可能具有不同的宽高、旋转角度、方向模式甚至自定义标签和边框信息。

本文将介绍如何使用 Java 读取 PDF 页面信息,包括:

  • 获取 PDF 页数
  • 获取页面尺寸(宽高)
  • 获取页面旋转角度
  • 判断页面方向(横向 / 纵向)
  • 获取页面标签
  • 获取页面边框信息(MediaBox、CropBox 等)

一、安装和引入PDF处理库

要在 Java 中获取 PDF 页面信息,可使用 Spire.PDF for Java 库。它支持加载、解析、编辑和导出 PDF 文件。

引入依赖

1. Maven项目

如果你使用 Maven 构建项目,可在 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项目

对于非 Maven 项目,你可以前往 官网 下载 jar 包并手动导入项目。

二、获取 PDF 页数

了解 PDF 的总页数是处理文档的第一步,它可以帮助我们执行分页提取、范围打印或页面遍历等操作。

实现步骤:

  • 创建 PdfDocument 对象;
  • 使用 PdfDocument.loadFromFile() 方法打开 PDF 文档;
  • 调用 PdfDocument.getPages().getCount() 获取页数。

示例代码:

import com.spire.pdf.*;public class GetPageCount {
public static void main(String[] args) {PdfDocument pdf = new PdfDocument();pdf.loadFromFile("测试.pdf");int pageCount = pdf.getPages().getCount();System.out.println("该 PDF 共 " + pageCount + " 页。");pdf.close();}
}

三、获取页面尺寸(宽高)

页面的尺寸决定了内容的排版范围,不同的 PDF 页面可能采用不同的纸张标准,如 A4、Letter 或自定义大小。

实现步骤:

  • 打开 PDF 文档;
  • 使用PdfDocument.getPages().get()方法获取指定页面(通过索引);
  • 调用 PdfPageBase.getSize().getWidth() 和 PdfPageBase.getSize().getHeight() 方法获取宽高信息;
  • 输出尺寸数据。

示例代码:

import com.spire.pdf.*;public class GetPageSize {public static void main(String[] args) {PdfDocument pdf = new PdfDocument();pdf.loadFromFile("测试.pdf");PdfPageBase page = pdf.getPages().get(0); // 获取第一页double width = page.getSize().getWidth();double height = page.getSize().getHeight();System.out.printf("第一页尺寸为:%.2f x %.2f pt%n", width, height);pdf.close();}
}

注意,页面尺寸默认单位为 pt(磅),1 英寸 = 72 磅。如果你需要将尺寸转换为英寸、像素、厘米或毫米进行打印适配或前端渲染,可以使用 PdfUnitConvertor 类进行单位转换:

float pointValue = 595.0f; // 示例:A4 宽度为 595 ptPdfUnitConvertor 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 对应:%.2f 英寸,%.2f 像素,%.2f 毫米,%.2f 厘米%n", inch, pixel, mm, cm);

四、获取页面旋转角度

页面旋转信息可以帮助我们判断是否需要在程序中进行角度还原或页面调整,避免内容呈现异常。

实现步骤:

  • 打开 PDF 文档;
  • 获取目标页面;
  • 使用 PdfPageBase.getRotation().getValue() 方法获取旋转角度;
  • 输出角度信息。

示例代码:

import com.spire.pdf.*;public class GetPageRotation {public static void main(String[] args) {PdfDocument pdf = new PdfDocument();pdf.loadFromFile("测试.pdf");PdfPageBase page = pdf.getPages().get(0);int rotation = page.getRotation().getValue();System.out.println("第一页旋转角度为:" + rotation + "°");pdf.close();}
}

五、判断页面方向(横向 / 纵向)

PDF 页面可分为 Portrait(纵向)和 Landscape(横向),不同方向适用于不同类型的内容展示(如文字或表格)。

实现步骤:

  • 打开 PDF 文档;
  • 获取目标页面;
  • 调用 PdfPageBase.getSize().getWidth() 和 PdfPageBase.getSize().getHeight() 方法获取页面的宽高信息;
  • 比较宽度与高度。若宽度 > 高度,则为横向,否则为纵向;
  • 输出页面方向信息。

示例代码:

import com.spire.pdf.*;public class GetPageOrientation {public static void main(String[] args) {PdfDocument pdf = new PdfDocument();pdf.loadFromFile("测试.pdf");PdfPageBase page = pdf.getPages().get(0);double width = page.getSize().getWidth();double height = page.getSize().getHeight();String orientation = width > height ? "横向" : "纵向";System.out.println("第一页页面方向为:" + orientation);pdf.close();}
}

六、获取页面标签

PDF 页面标签(Page Label)可用于自定义页码(如 i, ii, iii, A-1, A-2),对于章节分隔、目录定位等功能尤为常见。

实现步骤:

  • 打开 PDF 文档并获取目标页面;
  • 使用 PdfPageBase.getPageLabel() 方法获取目标页的标签文字;
  • 判断标签文字是否存在。若存在,输出标签信息,否则输出“无标签”。

示例代码:

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 : "无标签";System.out.println("第一页页面标签为:" + labelText);pdf.close();}
}

七、获取页面边框信息

PDF 页面所定义的边框不仅用于限制内容的显示范围,还涵盖多个与印刷和裁切相关的区域。这些边框各自承担不同的功能,例如用于标识纸张尺寸、设置可视区域、预留出血位置以及定义裁切和内容区域等。下图展示了这些边框在页面中的分布情况:

PDF边框在页面中的分布情况

PDF页面各类边框说明

边框类型

说明

MediaBox

页面介质框,表示纸张的实际物理尺寸范围

CropBox

裁剪框,定义最终用于显示或打印的区域

BleedBox

出血框,用于印刷时预留的出血区域

TrimBox

成品框,表示裁剪后的页面成品大小

ArtBox

作品框,限定页面中有效的内容区域

实现步骤:

  • 打开PDF文档并获取目标页面;
  • 分别使用PdfPageBase类的 getMediaBox()、getCropBox()、getBleedBox()、getTrimBox()、getArtBox() 方法获取各个对应的边框信息;
  • 分别使用 Rectangle2D类的getWidth()、getHeight()、getX()、getY() 方法读取每个边框的宽度、高度、以及X和Y坐标等属性值,输出结果。

示例代码:

import com.spire.pdf.*;
import java.awt.geom.Rectangle2D;public class GetPageBoxes {public static void main(String[] args) {PdfDocument pdf = new PdfDocument();pdf.loadFromFile("测试.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();}
}

八、总结

本文详细介绍了如何通过 Java 语言结合 Spire.PDF for Java 库获取 PDF 文档中各页面的重要属性信息,包括页数、页面尺寸、旋转角度、页面方向、页面标签以及边框区域等。

如果你有提取表格、添加签名、水印或压缩文件等更复杂的处理需求,也可以使用 Spire.PDF for Java 提供的相关接口。具体使用方法可参考官方文档中的详细说明。

以上就是使用Java 获取 PDF 页面信息的所有内容。感谢阅读!

本文完结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89003.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89003.shtml
英文地址,请注明出处:http://en.pswp.cn/web/89003.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 AI 的大前端安全态势感知与应急响应体系建设

大前端应用&#xff08;Web、APP、小程序&#xff09;作为用户交互的入口&#xff0c;面临日益复杂的安全威胁&#xff1a;从传统的 XSS 攻击、CSRF 伪造&#xff0c;到新型的供应链投毒、AI 驱动的自动化爬虫&#xff0c;再到针对业务逻辑的欺诈攻击&#xff08;如薅羊毛、账号…

Java 与 MySQL 性能优化:MySQL全文检索查询优化实践

文章目录一、引言二、InnoDB引擎下的全文检索功能详解2.1 全文索引的基本概念与原理2.2 全文索引的创建与管理2.3 全文检索的三种查询模式2.4 中文全文检索的挑战与解决方案三、CMS 场景下的全文检索性能瓶颈分析3.1 索引构建与维护开销3.2 查询性能瓶颈3.3 锁机制与并发性能问…

应用软件格式渗透 利用word去渗透(MS10-087)

用到的靶机为&#xff1a;WinXP漏洞原理&#xff1a;一、漏洞触发机制与核心组件 漏洞根源&#xff1a;RTF文件解析逻辑缺陷 触发组件&#xff1a;Microsoft Word的RTF&#xff08;Rich Text Format&#xff09;解析引擎&#xff0c;具体涉及 mso.dll 模块中的 路径规范化函数&…

解密AWS VPC路由表:显式关联与隐式关联,谁决定了网络出口?

大家好&#xff0c;今天我们来聊一个在 AWS 云计算世界里既基础又关键的话题&#xff1a;VPC 路由表。 很多刚接触 AWS 的朋友&#xff0c;在配置网络时可能会遇到这样的困惑&#xff1a;为什么我的 EC2 实例无法访问互联网&#xff1f;为什么某些子网的网络策略和其他子网不一…

LeetCode题解---<203.移除链表元素>

文章目录题目代码及注释关键点题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,…

【JavaScript高级】构造函数、原型链与数据处理

目录构造函数和原型构造函数实例成员和静态成员构造函数的问题构造函数原型 prototype对象原型 \_\_proto\_\_constructor 构造函数构造函数、实例、原型对象三者之间的关系原型链JavaScript 的成员查找机制&#xff08;规则&#xff09;原型对象的this指向扩展内置对象继承cal…

项目进度与预算脱节,如何进行同步管理

项目进度与预算脱节会导致资源浪费、成本超支和项目延期。进行同步管理的方法包括&#xff1a;建立统一的项目进度预算管理体系、实施实时监控与反馈机制、采用项目管理工具辅助同步管理。尤其是实施实时监控与反馈机制&#xff0c;通过持续监测进度与预算的匹配情况&#xff0…

TCP半关闭

理解TCP半关闭&#xff1a;像水管一样的网络连接控制 从全关闭到半关闭&#xff1a;为什么需要这种机制&#xff1f; 想象你和朋友正在通电话讨论一个重要项目&#xff1a; 全关闭&#xff1a;就像突然挂断电话&#xff0c;双方都无法再说话半关闭&#xff1a;你说"我说完…

衡石科技技术手册--仪表盘过滤控件详解

过滤控件说明 过滤控件 的定义 过滤控件用于在仪表盘中过滤图表数据&#xff0c;分为仪表盘内过滤控件和全局过滤控件。 过滤控件结构说明 字段类型描述uidSTRING过滤控件唯一识别 idappIdLONG过滤控件所属的应用 iddataAppIdLONG字段来源是数据包时的数据包 iddashboar…

ASP.NET Core中数据绑定原理实现详解

在ASP.NET Core 中&#xff0c;数据绑定是将 HTTP 请求中的数据&#xff08;如表单、查询字符串、请求体等&#xff09;映射到控制器动作方法参数或模型对象的过程。以下将从原理、核心组件、执行流程及关键机制等方面详细解析其实现逻辑。 一、数据绑定的核心原理与组件 1. 数…

牛客:HJ24 合唱队[华为机考][最长递增子集][动态规划]

学习要点 求最长递增字列求最长递减子列 题目链接 合唱队_牛客题霸_牛客网 题目描述 解法&#xff1a;动归求最长递增子列 #include <iostream> #include <vector> using namespace std;int main() {int n;while (cin >> n) {// 输入的数组int tmp;vect…

C语言的相关基础概念和常用基本数据类型

1.相关概念变量与常量的定义常量&#xff1a;在程序运行中其值不能改变的量。变量&#xff1a;在程序运行中其值可以改变的量。存储器的区分 RAMROM中文名易失存储器不易失存储器特点掉电丢失数据&#xff0c;但存取快掉电不丢失数据&#xff0c;但存取幔标识符标识符只能…

Spring boot整合dubbo+zookeeper

Spring boot整合dubbozookeeper 下文将简述springboot整合dubbozookeeper实现apiproviderconsumer模式&#xff0c;Api用于定于interface,provider和consumer依赖Api,provider实现api接口&#xff0c;consumer调用provider。 spring boot版本&#xff1a;3.5.3 jdk版本&#xf…

ImportError: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32‘ not found

简介&#xff1a;在复现 VLM-R1 项目并尝试将其中的 GRPO 算法应用到自己的任务时&#xff0c;按照官方文档配置好环境后&#xff0c;运行过程中遇到了一个非常离谱的错误&#xff1a; ImportError: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32 not found 这个问题极…

基于Spring Boot的生活用品电商网站的设计与实现

第1章 摘要随着电商行业的飞速发展&#xff0c;生活用品电商网站作为线上购物的一部分&#xff0c;逐渐成为消费者日常购物的重要渠道。为提升网站的管理效率和用户体验&#xff0c;设计并实现了一款基于Spring Boot的生活用品电商网站。该系统通过合理的架构设计&#xff0c;提…

数据结构 单链表(1)

1.概念和结构概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。通过指针链接次序实现的要怎么理解呢?这是一张链表的结构图:与顺序表不同的是&#xff0c;链表里的每节“车厢” (仔细观察这…

Python爬虫实战:研究PyMongo库相关技术

1. 引言 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地获取这些数据并进行存储和分析,成为了数据科学领域的重要研究方向。网络爬虫作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 MongoDB 作为一种流行的 NoSQL 数据库,能够灵…

【世纪龙科技】迈腾B8汽车整车检测与诊断仿真实训系统

在汽车技术日新月异的今天&#xff0c;如何培养既懂理论又精实践的高素质汽修人才&#xff0c;成为职业教育领域亟待突破的课题。江苏世纪龙科技凭借深厚的技术积淀与教育洞察&#xff0c;重磅推出《汽车整车检测与诊断仿真实训系统》&#xff0c;以迈腾B8为原型&#xff0c;通…

.net服务器Kestrel配置Nginx作为反向代理

.NET服务器Kestrel配置Nginx作为反向代理 在ASP.NET Core应用程序的部署过程中&#xff0c;Kestrel是一款轻量级的跨平台Web服务器。不过&#xff0c;直接将其暴露在互联网上并非明智之举。为了增强安全性、提升性能以及提高可伸缩性&#xff0c;我们可以借助Nginx作为反向代理…

MyBatis 在执行 SQL 时找不到名为 name 的参数

MyBatis 在执行 SQL 时找不到名为 name 的参数&#xff0c;因为当接口方法有多个参数时&#xff0c;没有使用 Param(“name”) 明确指定参数名。 其他人说只有springboot1.x的版本才会出现该问题&#xff0c;但是我在使用2.x的版本时也出现了该问题Not found 参数 于是便回根溯…