使用PDFBox调整PDF每页格式
目录
一、内容没有图片
二、内容有图片
maven依赖,这里使用的是pdfbox的2.0.30版本
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-tools</artifactId><version>2.0.30</version></dependency>
一、内容没有图片
如果内容没有图片,可以直接将纸张改为A4大小
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;public class AdjustPdfPageWidthToA4 {public static void main(String[] args) {// 输入的PDF文件路径String inputFilePath = "input.pdf";// 输出的PDF文件路径String outputFilePath = "output.pdf";try {// 加载PDF文件PDDocument document = PDDocument.load(new File(inputFilePath));// 遍历每一页for (PDPage page : document.getPages()) {// 将页面宽度调整为A4尺寸page.setMediaBox(PDRectangle.A4);}// 保存修改后的PDF文件document.save(outputFilePath);document.close();System.out.println("PDF页面宽度已调整为A4尺寸,并保存为新的PDF文件。");} catch (IOException e) {e.printStackTrace();}}
}
但是如果有图片的话,会出现图片被截断,显示不全的情况出现,所以我们需要对图片元素按比例缩放
二、内容有图片
首先要对页面内容进行判断,如果页面是图片的话,对图片进行比例缩放,比如A4,就缩放到可以放进A4
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.text.PDFTextStripper;import javax.imageio.ImageIO;/*** @author zjy* @describe 调整PDF每页为A4格式*/
public class AdjustPdfPageWidthToA4Util {static String inputFilePath = "C:\\xxx\\xxx\\xx.pdf";// 输出的PDF文件路径static String outputFilePath = "D:\\result.pdf";public static void main(String[] args) {try {// 加载PDF文件PDDocument document = PDDocument.load(new File(inputFilePath));// 遍历每一页int totalPages = document.getNumberOfPages();for (int i = 0; i < totalPages; i++) {// 获取当前Page页面PDPage page = document.getPage(i);// 获取对应页面的资源对象PDResources resources = page.getResources();// 遍历当前页面所有内容,找出图片对象for (COSName cosName : resources.getXObjectNames()) {PDXObject pdxObject = resources.getXObject(cosName);// 判断是不是图片对象if (pdxObject instanceof PDImageXObject) {// 获取图片对象PDImageXObject pdxObject1 = (PDImageXObject) pdxObject;BufferedImage image = pdxObject1.getImage();// 4、创建页面内容流,指定操作哪个文档中的哪个页面PDPageContentStream stream = new PDPageContentStream(document, page);float[] imageWH = getImageWH(image, PDRectangle.A4);stream.drawImage(pdxObject1, imageWH[0], imageWH[1], imageWH[2], imageWH[3]); // 绘制图片到PDF页面里面stream.close(); // 关闭页面内容流page.setMediaBox(PDRectangle.A4);} else {page.setMediaBox(PDRectangle.A4);}}}// 保存修改后的PDF文件document.save(outputFilePath);document.close();System.out.println("PDF页面宽度已调整为A4尺寸,并保存为新的PDF文件。");} catch (IOException e) {e.printStackTrace();}}/*** 获取图片的宽度、高度,单位是【pt】** @param box PDF文档页面矩形区域对象,可以获取到矩形区域的宽高* @return 返回缩放之后的图片宽高*/public static float[] getImageWH(BufferedImage img, PDRectangle box) {try {// px 转换成 pt 单位float xAxis;float yAxis;int w = img.getWidth();int h = img.getHeight();float width = (float) (w * 3.0 / 4); // 这里是因为 1pt = 3/4 px,pt和px单位转换float height = (float) (h * 3.0 / 4);float pw = box.getWidth() - 60; // 设置图片与文档边缘的空白间距float ph = box.getHeight() - 60; // 设置图片与文档边缘的空白间距if (width > pw) {float scale = pw / width; // 缩放比列width = pw; // 宽度等于页面宽度height = height * scale; // 高度自动缩放} else {float scale = ph / height; // 缩放比列height = ph; // 高度等于页面高度width = width * scale; // 宽度自动缩放}// 计算图片在X、Y轴上的显示位置xAxis = (box.getWidth() - width) / 2; // X轴居中对齐
// yAxis = box.getHeight() - height - 10; // 距离页面顶部10个ptyAxis = (box.getHeight() - height) / 2; // Y轴垂直居中对齐return new float[]{xAxis, yAxis, width, height};} catch (Exception e) {e.printStackTrace();}return new float[]{0, 0, 0, 0};}
}
运行完如下图所示,图片缩小至能放入A4,放在正中间
三、改进
上面的代码是将图片等比例缩小到A4能够放得下,也就是上下或者左右可能有很大的空白,图片比较小,难以看清,因此改进
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.text.PDFTextStripper;import javax.imageio.ImageIO;/*** @author zjy* @describe 调整PDF每页为A4格式*/
public class AdjustPdfPageWidthToA4Util {static String inputFilePath = "C:\\xxx\\xxx\\xx.pdf";// 输出的PDF文件路径static String outputFilePath = "D:\\result.pdf";public static void main(String[] args) {try {// 加载PDF文件PDDocument document = PDDocument.load(new File(inputFilePath));// 遍历每一页int totalPages = document.getNumberOfPages();for (int i = 0; i < totalPages; i++) {// 获取当前Page页面PDPage page = document.getPage(i);// 获取对应页面的资源对象PDResources resources = page.getResources();// 遍历当前页面所有内容,找出图片对象for (COSName cosName : resources.getXObjectNames()) {PDXObject pdxObject = resources.getXObject(cosName);// 判断是不是图片对象if (pdxObject instanceof PDImageXObject) {// 获取图片对象PDImageXObject pdxObject1 = (PDImageXObject) pdxObject;BufferedImage image = pdxObject1.getImage();// 4、创建页面内容流,指定操作哪个文档中的哪个页面PDPageContentStream stream = new PDPageContentStream(document, page);float[] imageWH = getImageWH(image, PDRectangle.A4);stream.drawImage(pdxObject1, 0, 0, imageWH[0], imageWH[1]); // 绘制图片到PDF页面里面stream.close(); // 关闭页面内容流
// page.setMediaBox(PDRectangle.A4);page.setMediaBox(new PDRectangle(imageWH[0], imageWH[1]));} else {page.setMediaBox(PDRectangle.A4);}}}// 保存修改后的PDF文件document.save(outputFilePath);document.close();System.out.println("PDF页面宽度已调整为A4尺寸,并保存为新的PDF文件。");} catch (IOException e) {e.printStackTrace();}}/*** 获取图片的宽度、高度,单位是【pt】** @param box PDF文档页面矩形区域对象,可以获取到矩形区域的宽高* @return 返回缩放之后的图片宽高*/public static float[] getImageWH(BufferedImage img, PDRectangle box) {try {// px 转换成 pt 单位float xAxis;float yAxis;int w = img.getWidth();int h = img.getHeight();float width = (float) (w * 3.0 / 4); // 这里是因为 1pt = 3/4 px,pt和px单位转换float height = (float) (h * 3.0 / 4);float pw = box.getWidth() ;float ph = box.getHeight() ;if (width > pw) {float scale = pw / width; // 缩放比列width = pw; // 宽度等于页面宽度height = height * scale; // 高度自动缩放} else {float scale = ph / height; // 缩放比列height = ph; // 高度等于页面高度width = width * scale; // 宽度自动缩放}// 计算图片在X、Y轴上的显示位置return new float[]{width, height};} catch (Exception e) {e.printStackTrace();}return new float[]{0, 0};}
}
这样子图片的宽度是A4的,长度就是原图片的长度了

以上内容参考以下博客【PDFBox】PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐-支持Android_pdfbox缩放比例-CSDN博客文章浏览阅读322次,点赞2次,收藏3次。PDImageXObject类中提个了一些静态方法createFromFile(imagePath,doc)方法:采用File文件的方式读取本地磁盘中的图片。imagePath参数:图片的路径。doc参数:PDF文档对象。getImage()方法:返回BufferedImage图片对象。getSuffix()方法:返回图片的后缀类型,例如:jpg、png等。_pdfbox缩放比例https://blog.csdn.net/qq_27489007/article/details/134451128
相关文章:
使用PDFBox调整PDF每页格式
目录 一、内容没有图片 二、内容有图片 maven依赖,这里使用的是pdfbox的2.0.30版本 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version></dependency>…...
【3D reconstruction 学习笔记】
三维重建 3D reconstruction 1. 相机几何针孔相机摄像机几何 2. 相机标定线性方程组的解齐次线性方程组的解非线性方程组的最小二乘解透镜相机标定带畸变的相机标定 3. 单视图重建2D平面上的变换3D空间上的变换单视测量无穷远点 无穷远线 无穷远平面影消点 影消线单视重构 4. 三…...
(附源码)基于Spring Boot与Vue的宠物用品销售系统设计与实现
前言 💗博主介绍:✌专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2024年Java精品实战案例《100套》 🍅文末获取源码联系🍅 ἱ…...
Qwen及Qwen-audio大模型微调项目汇总
Qwen及Qwen-audio可微调项目调研 可用来微调方法/项目汇总ps.大语言模型基础资料 可用来微调方法/项目汇总 Qwen github 项目自带的finetune脚本 可以参考https://blog.csdn.net/qq_45156060/article/details/135153920PAI-DSW中微调千问大模型(阿里云的一个产品&a…...
浅析ArcGis中的软件——ArcMap、ArcScene、 ArcGlobe、ArcCatalog
为什么要写这么一篇介绍ArcGis的文章呢?因为大部分人也包括ArcGisdada,在使用ArcMap应用程序创建工程时总以为我们就是使用了ArcGis这个软件的所有。其实不然,在后期的接触和使用中慢慢发现原来ArcMap只是ArcGis这个综合平台的一部分…...
AndroidStudio插件出现“Compatible with IntelliJ IDEA only“错误时的解决方案
原因:插件比较老,配置可能存在问题 1.修改plugins文件夹下的jar包(插件) 找到AndroidStudio所在位置 打开plugins文件夹,找到需要修改的jar包,通过压缩软件用zip方式打开,找到\META-INF\plugin.xml并编辑,在<version>xxxx</versi…...
探索未来的编程趋势与挑战
摘要: 本文将探讨未来编程领域可能面临的挑战和发展趋势,包括人工智能、量子计算、区块链等新兴技术对编程的影响,以及程序员需要具备的新技能和素质。 随着人工智能技术的快速发展,机器学习、深度学习等算法在编程领域的应用越来…...
第十二届蓝桥杯省赛CC++ 研究生组
十二届省赛题 第十二届蓝桥杯省赛C&C 研究生组-卡片 第十二届蓝桥杯省赛C&C 研究生组-直线 第十二届蓝桥杯省赛C&C 研究生组-货物摆放 第十二届蓝桥杯省赛C&C 研究生组-路径 第十二届蓝桥杯省赛C&C 研究生组-时间显示 第十二届蓝桥杯省赛C&C 研究生组…...
Ubuntu自启GUI程序
问题描述 最近搞了一个项目,程序需要自动启动,系统是Ubuntu,先搞了成服务方式(配置的文章很多,可以自己找找),程序还是不启动 ,最后加到/etc/rc.local文件里面启动,看调试信息,需要…...
【光标精灵】让您享受鼠标皮肤多样化快捷更换
鼠标作为我们日常使用频率最高的“小伙伴”,扮演着至关重要的角色。尤其是在女生群体中,对于打造一个个性化、可爱的电脑桌面和软件界面的需求日益增长。然而,尽管电脑默认提供了一些可更换的光标图案,但仍显得有些单调和呆板。想…...
Vue 常见面试题(一)
目录 1、Vue 的最大的优势是什么?(必会) 2、Vue 和 jQuery 两者之间的区别是什么?(必会) 3、MVVM 和 MVC 区别是什么?哪些场景适合?(必会) 1、基本定义 2…...
Elasticsearch 的 scroll API
对于大量数据,可以使用 Elasticsearch 的 scroll API 来分批次地读取数据,以避免一次性读取所有数据造成的内存负担。这段代码使用滚动查询(scroll)来分批次地读取数据。首先,它发送初始的搜索请求,并获取第…...
Leedcode刷题——2 字符串
注:以下代码均为c 1. 反转字符串 void reverseString(vector<char>& s) {int n s.size();int i, j;for(i 0, j n - 1; i < j; i, j--){swap(s[i], s[j]);}}2. 整数反转 int reverse(int x) {int rev 0;while(x ! 0){if(rev < INT_MIN / 10 || …...
2016年认证杯SPSSPRO杯数学建模B题(第二阶段)多帧图像的复原与融合全过程文档及程序
2016年认证杯SPSSPRO杯数学建模 B题 多帧图像的复原与融合 原题再现: 数码摄像技术被广泛使用于多种场合中。有时由于客观条件的限制,拍摄设备只能在较低的分辨率下成像。为简单起见,我们只考虑单色成像。假设成像的分辨率为 32 64&#x…...
WMI接口设计实现
WMI是Windows操作系统管理数据和操作的基础设施,系统管理员可以使用VB Script、PowerShell及Windows API(C、C#等)管理本地或远程计算机。 使用WMI框架应用程序可以直接访问EC RAM、 I/O端口、Memory地址、寄存器、Setup NV设定值,…...
前端项目,个人笔记(二)【Vue-cli - 引入阿里矢量库图标 + 吸顶交互 + setup语法糖】
目录 1、项目中引入阿里矢量库图标 2、实现吸顶交互 3、语法糖--<script setup> 3.1、无需return 3.2、子组件接收父组件的值-props的使用 3.3、注册组件 1、项目中引入阿里矢量库图标 步骤一:进入阿里矢量库官网中:iconfont-阿里巴巴矢量…...
OpenCV 介绍使用
返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV4.9.0开源计算机视觉库使用简要说明 下一篇: OpenCV(开源计算机视觉库:http://opencv.org)是一个开源库,包含数百种计算机视觉算法。…...
Python 10个面试题实例
当然!以下是10个Python面试题及其示例解决方案的中题目: 1.反转字符串: string "Hello, World!" reversed_string string[::-1] print(reversed_string)2.检查字符串是否为回文: def is_palindrome(string):return string string[::-1]r…...
Python:熟悉简单的skfuzzy构建接近生活事件的模糊控制器”(附带详细注释说明)+ 测试结果
参考资料:https: // blog.csdn.net / shelgi / article / details / 126908418 ————通过下面这个例子,终于能理解一点模糊理论的应用了,感谢原作。 熟悉简单的skfuzzy构建接近生活事件的模糊控制器 假设下面这样的场景, 我们希望构建一套…...
opencv函数使用查找
opencv官方文档地址:https://docs.opencv.org/4.x/index.html 先选对应的版本opencv-python 以这个函数为例子 model cv2.face.LBPHFaceRecognizer.create() 点开后找face类的LBP里面就有create函数的用法...
Avalonia UI ..-RC正式发布次
一、什么是 Q 饱和运算? 1. 核心痛点:普通运算的 “数值回绕” 普通算术运算(如 ADD/SUB)溢出时,数值会按补码规则 “回绕”,导致结果完全错误: 示例:int8_t 类型最大值 127 1 → 结…...
本地大模型的春天,真的来了!
过去几年,本地部署大模型始终面临一个核心矛盾:想要高性能,就必须用百亿甚至千亿参数的大模型,算力成本高到普通用户和中小团队难以承受;想要低成本,就只能用小参数模型,推理能力和智能体表现又…...
SpaceClaim 流体域建模实战:从零到一构建CFD仿真几何
1. SpaceClaim流体域建模基础概念 第一次接触CFD仿真时,我完全被复杂的几何建模难住了。直到发现SpaceClaim这个神器,才明白原来流体域建模可以如此直观高效。SpaceClaim作为ANSYS旗下的直接建模工具,彻底改变了传统参数化建模的繁琐流程&am…...
创新实训个人工作-初步搭建(二)
一、思考在完成 AI 问答页的基础搭建后,我开始思考:如果这个页面真的面向用户使用,它应该像什么?我觉得他的回答必须要更加专业,可以在生活中可以真实可用。所以后续打磨,我主要围绕两条线展开:…...
忍者像素绘卷保姆级教程:从Docker Compose启动到UI界面汉化配置
忍者像素绘卷保姆级教程:从Docker Compose启动到UI界面汉化配置 1. 环境准备与快速部署 在开始使用忍者像素绘卷之前,我们需要先准备好运行环境并完成部署。这个步骤非常简单,即使你是Docker新手也能轻松完成。 1.1 系统要求 确保你的系统…...
go语言Windows安装教程(安装go安装Golang安装)(GOPATH、Go Modules)
文章目录Go 在 Windows 上的安装与环境配置指南一、简介二、下载安装 Go1. 下载 Go 安装包2. 运行安装程序三、验证安装四、配置环境变量1. 配置 GOROOT(通常不需要手动设置)2. 配置 GOPATH(推荐设置)设置方法:3. 配置…...
智能解锁付费内容:信息获取革命的完整解决方案
智能解锁付费内容:信息获取革命的完整解决方案 在当今数字化信息时代,你是否也曾面临优质内容被付费墙阻挡的困扰?智能解锁付费内容技术作为信息获取领域的重要突破,正在重新定义我们的阅读体验。通过创新的技术架构,这…...
卷积神经网络原理详解:使用Phi-3-mini进行交互式学习与代码生成
卷积神经网络原理详解:使用Phi-3-mini进行交互式学习与代码生成 1. 引言:为什么选择CNN作为深度学习入门 卷积神经网络(CNN)是计算机视觉领域的基石技术,从人脸识别到自动驾驶都离不开它。但对于初学者来说,…...
密码学知识点梳理
密码学知识点梳理 目录 第一章 概论 第二章 古典密码 第三章 分组密码 第四章 流密码 第五章 杂凑函数 第六章 公钥密码 第一章 概论 密码学发展历史: 经历了五个发展阶段。 (1)从远古到二战之前为第一阶段,以手工和简单器械…...
阿里Z-Image中文文生图实战:ComfyUI可视化操作,3分钟生成第一张图
阿里Z-Image中文文生图实战:ComfyUI可视化操作,3分钟生成第一张图 1. 快速了解Z-Image-ComfyUI Z-Image是阿里巴巴最新开源的中文文生图大模型,它让普通用户也能在消费级显卡上快速生成高质量图像。这个镜像集成了Z-Image模型和ComfyUI可视…...

