使用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函数的用法...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

