昨天晚上想要合并几个pdf文件,首选的wps在这个小功能上收费,无奈又下了其他几个打着“免费”招牌的文档处理软件,结果打开全是要求付费。感觉被戏耍了,这玩意儿又不难,于是就随便写了个简单的pdf工具类合并文件。希望能够帮到有需要的人。
package com.liu.blog.utils;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @Description PDFUtils
* @Author 小草熊
* @Date 2023/9/26 9:06
*/
public class PDFUtils {
/**
* 获取单个文件夹下的全部pdf文件绝对路径
* @param folderPath
* @return
*/
public static List<String> getAllFilePathsInOneFolder(String folderPath) {
File folder = new File(folderPath);
List<String> filePaths = new ArrayList<>();
if (folder.exists() && folder.isDirectory()) {
File[] files = folder.listFiles();
if (files != null) {
//Arrays.sort(files); // 按照原本的排序对文件进行排序
for (File file : files) {
if (file.isFile()&&file.getName().toLowerCase().endsWith(".pdf")){
filePaths.add(file.getAbsolutePath());
}
}
}
}
return filePaths;
}
/**
* 根据文件开头魔法值判断是不是pdf文件
* @param filePath
* @return
*/
public static boolean isPDFFile(String filePath) {
try (FileInputStream inputStream = new FileInputStream(filePath)) {
byte[] header = new byte[5]; // 读取文件的开头5个字节
int bytesRead = inputStream.read(header);
if (bytesRead >= 5) {
String headerString = new String(header);
return headerString.startsWith("%PDF-");
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 根据文件名称判断是不是pdf文件
* @param fileName
* @return
*/
public static boolean isPDFFileName(String fileName) {
// 将文件名转换为小写并检查是否以 ".pdf" 结尾
return fileName.toLowerCase().endsWith(".pdf");
}
/**
* 获得一个文件夹下全部pdf文件绝对路径
* @param folderPath
* @return
*/
public static List<String> getAllFilePaths(String folderPath) {
List<String> filePaths = new ArrayList<>();
getAllFilesInFolder(new File(folderPath), filePaths);
return filePaths;
}
private static void getAllFilesInFolder(File folder, List<String> filePaths) {
if (folder.exists() && folder.isDirectory()) {
File[] files = folder.listFiles();
if (files != null) {
Arrays.sort(files); // 按照原本的排序对文件进行排序
for (File file : files) {
if (file.isFile()) {
filePaths.add(file.getAbsolutePath());
} else if (file.isDirectory()) {
getAllFilesInFolder(file, filePaths); // 递归处理子文件夹
}
}
}
}
}
public static void mergePdfFiles(List<String> pdfFiles, String outputFilePath) {
Document document = new Document();
try {
PdfCopy copy = new PdfCopy(document, new FileOutputStream(outputFilePath));
document.open();
for (String pdfFile : pdfFiles) {
PdfReader reader = new PdfReader(pdfFile);
int numPages = reader.getNumberOfPages();
for (int i = 1; i <= numPages; i++) {
copy.addPage(copy.getImportedPage(reader, i));
}
reader.close();
}
copy.close();
document.close();
System.out.println("PDF files merged successfully!");
} catch (IOException | DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String input="E:\\lj\\baidudownload\\操作系统";
List<String> allFilePaths = getAllFilePaths(input);
String output=input+"\\merge.pdf";
mergePdfFiles(allFilePaths,output);
}
}