Java实现图片转pdf
该方法可以选择多个图片是否合并为一个pdf输出,也可以选择图片为横向或者纵向输出,也可以选择pdf页面为A3或者A4
第一步
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</version></dependency>
第二步
package com.example.demo.file.pdf;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.graphics.image.PDImageXObject;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class ImageConditionToPdfConverter {private static final List<String> SUPPORTED_IMAGE_SUFFIXES = Arrays.asList("png", "jpg", "jpeg", "gif", "bmp", "tiff");public static void main(String[] args) {String imagesFolder = "C:\\Users\\EDY\\Desktop\\测试图片"; // 图片文件夹路径String outputFolder = "C:\\Users\\EDY\\Desktop\\output"; // 输出PDF文件夹路径boolean mergePdf = true; // 是否将所有图片合并到同一个PDF文件中boolean landscape = false; // 图片布局方向,横向为true,纵向为falseString pageSize = "A4"; // 页面大小,可以是"A3"或"A4"List<File> imageFiles = getImageFiles(imagesFolder, SUPPORTED_IMAGE_SUFFIXES);ensureOutputDirectoryExists(outputFolder); // 确保输出目录存在try {if (mergePdf) {// 如果合并到同一个PDF,创建一个文档并添加所有页面PDDocument document = new PDDocument();for (File imageFile : imageFiles) {PDPage page = createPage(pageSize, landscape);document.addPage(page);PDImageXObject pdImage = PDImageXObject.createFromFile(String.valueOf(imageFile), document);PDPageContentStream contentStream = new PDPageContentStream(document, page);drawImage(contentStream, pdImage, page.getMediaBox(), landscape);contentStream.close();}document.save(outputFolder + "\\output.pdf");document.close();} else {// 如果不合并到同一个PDF,为每个图片创建一个文档for (File imageFile : imageFiles) {PDDocument document = new PDDocument();PDPage page = createPage(pageSize, landscape);document.addPage(page);PDImageXObject pdImage = PDImageXObject.createFromFile(String.valueOf(imageFile), document);PDPageContentStream contentStream = new PDPageContentStream(document, page);drawImage(contentStream, pdImage, page.getMediaBox(), landscape);contentStream.close();document.save(outputFolder + "\\output_" + imageFiles.indexOf(imageFile) + ".pdf");document.close();}}System.out.println("PDF created successfully!");} catch (IOException e) {e.printStackTrace();}}private static PDPage createPage(String pageSize, boolean landscape) {PDRectangle mediaBox = "A3".equalsIgnoreCase(pageSize) ? PDRectangle.A3 : PDRectangle.A4;PDPage page = new PDPage(mediaBox);if (landscape) {page.setRotation(90);}return page;}private static void drawImage(PDPageContentStream contentStream, PDImageXObject pdImage, PDRectangle mediaBox, boolean landscape) throws IOException {float imageWidth = pdImage.getWidth();float imageHeight = pdImage.getHeight();float pageWidth = mediaBox.getWidth();float pageHeight = mediaBox.getHeight();if (landscape) {float temp = pageWidth;pageWidth = pageHeight;pageHeight = temp;}float scale = Math.min(pageWidth / imageWidth, pageHeight / imageHeight);imageWidth *= scale;imageHeight *= scale;// Center the image on the pagefloat x = (pageWidth - imageWidth) / 2;float y = (pageHeight - imageHeight) / 2;contentStream.drawImage(pdImage, x, y, imageWidth, imageHeight);}private static List<File> getImageFiles(String folderPath, List<String> supportedSuffixes) {File folder = new File(folderPath);File[] files = folder.listFiles();if (files != null) {List<File> imageFiles = new ArrayList<>();for (File file : files) {if (file.isFile() && isImage(file, supportedSuffixes)) {imageFiles.add(file);}}return imageFiles;}return new ArrayList<>();}private static boolean isImage(File file, List<String> supportedSuffixes) {String fileName = file.getName().toLowerCase();return supportedSuffixes.stream().anyMatch(fileName::endsWith);}private static void ensureOutputDirectoryExists(String directoryPath) {File directory = new File(directoryPath);if (!directory.exists()) {directory.mkdirs();}}
}
相关文章:
Java实现图片转pdf
该方法可以选择多个图片是否合并为一个pdf输出,也可以选择图片为横向或者纵向输出,也可以选择pdf页面为A3或者A4 第一步 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version…...
【iOS】使用AFNetworking进行网络请求
文章目录 前言AFNetworkingAFNetworking 的核心组件AKNetworking库的常用方法使用AKNetworking进行网络请求的步骤和代码示例 总结 前言 在暑假写天气预报项目时,我们已经接触到网络请求,当时我们是使用URLSession类,即Foundation框架中用于管…...

ThingsBoard规则链节点:RPC Call Reply节点详解
引言 1. RPC Call Reply 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 设备控制 3.2 状态查询 3.3 命令执行 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台,提供了设备管理…...

【AI换装整合包及教程】OOTDiffusion:以AI技术引领的时尚换装革命
在当今数字化快速发展的时代,人工智能(AI)技术正以前所未有的速度改变着我们的生活。从智能家居到自动驾驶,从在线教育到虚拟现实,AI的应用范围正在不断扩展。而在时尚领域,一款名为OOTDiffusion࿰…...
排序算法详细总结
算法 定义:算法是解决特定问题的明确步骤集合。算法的效率通常用时间复杂度和空间复杂度来衡量。 排序算法 定义:排序算法是计算机科学中用于对元素序列进行排序的一系列算法。排序算法在各种应用中都非常常见,从简单的数据处理到复杂的数…...
uniapp MD5加密
安装: npm install js-md5 -D 引入: import Md5 from js-md5 需求加密一个对象, login_form: {openId: 123456789,phone: ,scenario: 656677,phoneSessionKey: ,openIdSessionKey: ,timeStamp: , }, //10位时间戳(秒)…...

提升视觉回归测试体验:Cypress 插件推荐
项目介绍 在现代前端开发中,视觉回归测试是确保用户界面在不同版本之间保持一致性的关键步骤。然而,传统的视觉回归测试工具往往复杂且难以使用。为了解决这一问题,我们推荐一款专为 Cypress 设计的插件:Cypress Plugin Visual Re…...

fastbootd模式刷android固件的方法
1. fastbootd追根溯源 Google在Android 10上正式引入了动态分区机制来提升OTA的可扩展性。动态分区使能后:andorid系统可以在开机阶段动态地进行分区创建、分区销毁、分区大小调整等操作,下游厂商只需要规划好super分区的总大小,其内部的各个…...

基于C#实现Windows后台窗口操作与图像处理技术分析
在Windows编程中,操作后台窗口是一项复杂而有用的技术。它可以用来自动化用户界面测试、应用程序机器人等场景。本文将深入探讨如何在C#中绑定后台窗口、获取后台窗口界面图片,以及在图片中寻找指定图标并获取坐标。本技术文章结合最先进的资料与实践经验…...

戴尔电脑 Bios 如何进入?Dell Bios 进入 Bios 快捷键是什么?
BIOS(基本输入输出系统)是计算机启动时运行的第一个程序,它负责初始化硬件并加载操作系统。对于戴尔电脑用户来说,有时可能需要进入 BIOS 进行一些特定的设置调整,比如更改启动顺序、调整性能选项或解决硬件兼容性问题…...

数据结构之二叉树——堆 详解(含代码实现)
1.堆 如果有一个关键码的集合 K { , , , … ,},把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,则称为小堆( 或大堆 ) 。将根节点最大的堆叫做最大堆或大根堆,根节点最小的…...

推荐一款面向增材制造的高效设计平台:nTopology
nTopology是一款面向增材制造的高效设计平台,平台预置了大量增材制造常用的设计工具包,工程师通过调用若干个预置工具包、或自主开发定制的工具包,建立一个工作流,实现复杂几何结构的参数化设计。nTopology集合了的强大几何建模和…...

SQL,力扣题目1767,寻找没有被执行的任务对【递归】
一、力扣链接 LeetCode_1767 二、题目描述 表:Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…...
JavaScript数据类型- Symbol 详解
文章目录 前言1.唯一性2. 描述3. 作为对象属性键4. 全局注册6. 不可变性7. 隐式转换 前言 Symbol是ES6新增内容,代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题 在JavaScript发展的过程中,其中的ES6带…...

WordPress网站添加嵌入B站视频,自适应屏幕大小,取消自动播放
结合bv号 改成以下嵌入式代码(自适应屏幕大小,取消自动播放) <iframe style"width: 100%; aspect-ratio: 16/9;" src"//player.bilibili.com/player.html?isOutsidetrue&bvidBV13CSVYREpr&p1&autoplay0" scrolling…...

11.6 校内模拟赛总结
打的很顺的一场 复盘 7:40 开题,看到题目名很interesting T1 看起来很典,中位数显然考虑二分,然后就是最大子段和;T2 构造?一看数据范围这么小,感觉不是很难做;T3 神秘数据结构;T…...
Redis常用的五大数据类型(列表List,集合set)
简介 List 的特点:单键多值。底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。 Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边ÿ…...

Ubuntu 20.04 部署向量数据库 Milvus + Attu
前言 最开始在自己的办公电脑(无显卡的 windows 10 系统) 上使用 Docker Desktop 部署了 Milvus 容器,方便的很, 下载 Attu 也很方便,直接就把这个向量数据库通过 Attu 这个图形化界面跑了起来,使用起来感…...

实现数传数据转网口(以太网)和遥控器SBUS信号转串口的功能
为了帮助你实现数传数据转网口(以太网)和SBUS信号转串口的功能,这里提供一个基本的框架。我们将使用STM32微控制器来完成这些任务。假设你已经具备了STM32的基本开发经验,并且已经安装了相应的开发环境(如STM32CubeIDE…...

APP 后台广告位配置的关键要素与策略
在当今数字化营销的浪潮中,APP 作为重要的信息传播渠道,其后台广告位的配置显得尤为关键。这不仅影响着广告的展示效果,还直接关系到用户体验和平台收益。 首先,了解目标受众是配置广告位的基础。通过对 APP 用户的行为数据进行分…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...