Java实现pdf文件合并

在maven项目中引入以下依赖包

    <dependencies><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-examples</artifactId><version>3.0.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.9.0</version></dependency></dependencies>

创建一个工具类

package org.apache.pdfbox.utils;import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.examples.util.PDFMergerExample;
import org.apache.pdfbox.io.RandomAccessRead;
import org.apache.pdfbox.io.RandomAccessReadMemoryMappedFile;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;/*** @author: guanglai.zhou* @date: 2023/12/14 13:15*/
public class PdfMergerUtils {/*** 合并指定目录中的pdf文件** @param fromDir  指定目录* @param descFile 目标pdf文件* @return 目标pdf文件* @throws IOException*/public static File merge(String fromDir, String descFile) throws IOException {final File resultFile = new File(descFile);File file = new File(fromDir);List<File> files = new ArrayList<>();list(file, new Predicate<File>() {@Overridepublic boolean test(File file) {return true;}}, new Predicate<File>() {// 选择pdf文件@Overridepublic boolean test(File file) {return file.getPath().endsWith(".pdf");}}, files);if (files.isEmpty()) {throw new RuntimeException("源文件不存在pdf格式文档?");}
//        files.sort(Comparator.comparing(File::getName));if (resultFile.exists()) {FileUtils.forceDelete(resultFile);}mergePdfs(resultFile, files);return resultFile;}/*** 针对文件进行遍历 如果文件夹满足directoryPredicate,则继续遍历文件夹,如果是文件,则判断是否满足filePredicate,如果满足则添加到* collector结果集当中** @param file               文件夹* @param directoryPredicate 文件夹预期 为null 则不针对文件夹做过滤* @param filePredicate      文件预期 为null 则不针对文件做过滤* @param collector          收集器 收集所有符合条件的文件*/public static void list(File file, Predicate<File> directoryPredicate, Predicate<File> filePredicate, List<File> collector) {File[] childFiles = file.listFiles();if (childFiles == null) {return;}// 根据脚本名称进行排序List<File> fileList = Arrays.stream(childFiles).sorted(Comparator.comparing(File::getName)).collect(Collectors.toList());for (File childFile : fileList) {if (childFile.isDirectory()) {boolean pass = directoryPredicate == null || directoryPredicate.test(childFile);if (pass) {// 继续遍历子文件夹目录list(childFile, directoryPredicate, filePredicate, collector);}} else {boolean pass = filePredicate == null || filePredicate.test(childFile);if (pass) {collector.add(childFile);}}}}private static void mergePdfs(File resultFile, List<File> files) throws IOException {PDFMergerExample example = new PDFMergerExample();List<RandomAccessRead> sources = new ArrayList<>();for (File currFile : files) {sources.add(new RandomAccessReadMemoryMappedFile(currFile));}InputStream inputStream = example.merge(sources);FileUtils.copyInputStreamToFile(inputStream, resultFile);}}

将需要合并的pdf文件都拷贝到指定目录a中,调用该工具类将该目录作为第一个参数,第二个参数传入输出文件对象即可。

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

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

相关文章

全志V3s之显示当前文件路径

新移植的kernel和根文件系统&#xff0c;其终端显示只有一个#号&#xff0c;不方便查看&#xff0c;更改以下配置&#xff0c;使得可以显示全路径。修改如下&#xff1a; export PS1[\u\h \w]\$这个是即时生效的&#xff0c;所以如果要重启或者重新打开窗口也生效的话就要把这…

nginx服务前端访问查看无响应的问题

问题 nginx 启动之后&#xff0c;前端访问无数据&#xff0c;F12 查看&#xff0c;提示挂起。 以为是配置问题&#xff0c;查看配置文件&#xff0c;未发现配置的有问题。 原因 通过查看配置文件&#xff0c;发现转发的服务地址为127.0.0.1&#xff0c;手动ping 127.0.0.1&a…

如何部署Portainer容器管理工具+cpolar内网穿透实现公网访问管理界面

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 本文主要介绍如何本地安装Portainer并结合内网穿透工具实现任意浏览器远程访问管理界面。Portainer 是一个轻量级…

Unity 关于Rigidbody刚体组件的理解

一、基本了解 刚体Rigidbody因具体物理相关的属性&#xff0c;使得实际应用中更有真实感。应用也多&#xff1a; Rigidbody它可以受到重力、碰撞或者力的作用&#xff0c;所以我们可以用它模拟物体的真实物理行为&#xff0c;如受到重力的作用、与其他刚体对象进行碰撞&#…

QT之QTransform

QT之QTransform 成员函数例程 成员函数 QTransform函数&#xff1a; translate(x,y)&#xff1a;平移。 rotate(a)&#xff1a;旋转&#xff08;a为角度值&#xff09;。 scale(sx,sy)&#xff1a;缩放。 shear(shx,shy)&#xff1a;斜切。 setMatrix(m11,m12,m21,m22,dx,dy)&…

ChatGPT Plus重新开启订阅

12月14日凌晨&#xff0c;OpenAI首席执行官Sam Altman在社交平台宣布&#xff0c;终于找到了更多的GPU算力&#xff0c;重新开启订阅ChatGPT Plus。 上个月15日&#xff0c;OpenAI就因为算力不足&#xff0c;以及用户激增等原因暂停了ChatGPT Plus订阅。 Sam表示&#xff0c;在…

php 根据时间排序,接近的时间排在前面,过去的时间排在后面

产品需求&#xff0c;有一个开放日的活动&#xff0c;时间是多选&#xff0c;且一个时间不能超过24小时&#xff0c;不能跨天&#xff0c;不能相等&#xff0c;后台没问题了&#xff0c;接口调取数据的时候麻烦点&#xff0c;因为刚开始时间存的json字段&#xff0c;后面改为添…

【九】python模板方法模式

9.1 模板方法模式概述 模板方法模式是一种行为设计模式&#xff0c;它使用一个抽象的基类定义了一个操作中的算法的骨架&#xff0c;而将一些步骤的实现延迟到子类中。模板方法模式允许子类在不改变算法结构的情况下重新定义算法中的某些步骤。 9.2 代码示例 在Python中使用…

【亚马逊云科技】通过高性能低延迟对象存储 S3实现网站资源托管

本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 文章目录 前言1 S3 介绍1.1 优点 2 使用步骤2.1 注册账户2.2 创建存储桶2.2.1 打开控制…

智能指针管理“newed对象”

为什么要有智能指针&#xff1f; 指针智能是管理管理动态内存分配对象的一种机制。它提供了自动管理内存&#xff0c;避免常见内存泄漏和悬空指针。 对于上述Func函数的操作&#xff0c;一不小心就会产生很多问题。 p1 new时候抛异常 什么都不做p2 new时候抛异常 p1需要被清理…

深入理解JVM虚拟机第三十篇:详解JVM当中栈帧的一些附加信息以及虚拟机栈的5个面试题

😉😉 欢迎加入我们的学习交流群呀: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783824 📚📚 工作微信:BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章…

Vue3后台管理-项目总结

后台管理 1. 动态路由2. 动态侧边栏菜单 持续更新中。。。 1. 动态路由 后台路由模型数据 &#xff08;如果后端不知道怎么转为 这种树结构的路由&#xff0c;可以参考 普通数组转树结构的数组&#xff09; const dynamicRoutes [{path: /,name: Layout,redirect: /home,comp…

如何在Ubuntu的Linux系统上搭建nacos集群

官方给出的集群部署架构图 集群部署说明 (nacos.io)3个或3个以上nacos节点才能构成集群当前示例中包含3个nacos节点&#xff0c;同时一个负载均衡器代理3个nacos&#xff0c;本示例中负载均衡器可使用的是nginx 准备并安装好正常运行的nginx&#xff0c;本示例略准备并安装好正…

Redis权限管理体系(一):客户端名及用户名

在Redis6之前的版本中&#xff0c;因安全认证的主要方式是使用Redis实例的密码进行基础控制&#xff0c;而无法按照不同的应用来源配置不同账号以及更细粒度的操作权限控制来管理。本文先从client list中的信息入手&#xff0c;逐步了解Redis的客户端名设置、用户设置及权限控制…

Numpy库

目录 介绍&#xff1a; 一、生成 1.1普通生成 1.2随机生成 1.3其它生成 二、访问 三、赋值 四、运算 五、其它 介绍&#xff1a; NumPy是一个用于数值计算的Python库&#xff0c;它提供了高效的多维数组对象&#xff08;ndarray&#xff09;、用于数组计算的函数以及用于…

【Monitor, Maintenance Operation, Script code/prgramme】

Summary of M,M&O,Program JD) Monitor & M&O Symbio信必优) Job chance/opportunities on Dec 12th, 20231.1) Content 招聘JD job description:1.2) suggestions from Ms Liang/Winnie on Wechat app1.3) Java微服务是什么&#xff1f;1.3.1) [URL Java 微服务](…

如何使用PHP创建RESTful API?

创建 RESTful API&#xff08;Representational State Transferful Application Programming Interface&#xff09;是通过 HTTP 协议提供对资源的访问和操作的一种常见方式。以下是使用 PHP 创建 RESTful API 的一般步骤&#xff1a; 步骤 1: 设计 API 路由 首先&#xff0c…

QT linux下使用Qt Creator调试附加进程,加快调试

文章目录 一、调试附加进程二、配置流程&#xff08;1&#xff09;开放linux内核配置项&#xff08;2&#xff09;命令行直接启动程序&#xff08;3&#xff09;调试附加到进程 一、调试附加进程 使用附加进程调试要比直接调试速度要快&#xff0c;但是不足之处是&#xff0c;…

京微齐力:基于H7的平衡控制系统(一、姿态解析)

目录 前言一、关于平衡控制系统二、实验效果三、硬件选择1、H7P20N0L176-M2H12、MPU6050 四、理论简述五、程序设计1、Cordic算法2、MPU6050采集数据3、fir&iir滤波4、姿态解算 六、资源消耗&工程获取七、总结 前言 很久之前&#xff0c;就想用纯FPGA做一套控制系统。可…

C++二维数组(2)

图形相似度 题目描述&#xff1a; 给出两幅相同大小的黑白图像&#xff08;用0-1矩阵&#xff09;表示&#xff0c;求它们的相似度。 说明&#xff1a;若两幅图像在相同位置上的像素点颜色相同&#xff0c;则称它们在该位置具有相同的像素点。 两幅图像的相似度定义为相同像素…