首页 > 编程语言 >java 图片转PDF

java 图片转PDF

时间:2024-12-04 16:44:35浏览次数:4  
标签:java file new static File import PDF 图片

package image;

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
* 功能1:图片转PDF
* 功能2:删除图片
* 注意:转换pdf文件上限约20~30万
*/
public class ImgToPDF {
private static int count = 0;
private static final List<String> IMAGE_EXTENSIONS = Arrays.asList(".tif",".jpg", ".jpeg", ".png", ".gif", ".bmp"); // 支持的图片格式

public static void main(String[] args) throws Exception {
System.setProperty("itext.licensekey.disableagplwarning", "true");//个人用户引入itextpdf临时禁止不需要的提示。

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

count = 0;
System.out.println("任务开始:" + dateFormat.format(new Date()));

String directoryPath = "F:\\数据转换\\11\\two";

// 1、将子目录下所有图片转成PDF
List<File> imageFiles = findImageFiles(directoryPath);
int executors = Runtime.getRuntime().availableProcessors();
int executorSize = 2 * executors;
ExecutorService executor = Executors.newFixedThreadPool(executorSize);
threadPool(imageFiles, executor);

//2、删除子目录所有图片
//findImagesInSubdirectories(directoryPath);
System.out.println("任务结束:" + dateFormat.format(new Date()));
}

public static void threadPool(List<File> excelFilePaths, ExecutorService executor) {
List<Callable<Void>> tasks = new ArrayList<>();
// 将每个Excel文件的转换任务添加到列表中
for (File file : excelFilePaths) {
tasks.add(() -> {
// 在这里实现img到PDF的转换逻辑
boolean result = generatePdfFile(file);
if (result) {
setFileRecord("\n\t文件已转换成功:" + file.getAbsolutePath() + ",已转"+count+"个");
} else {
setFileRecord("\n\t文件已转换失败:" + file.getAbsolutePath() + ",已转"+count+"个");
}
return null;
});
}
try {
// 提交所有任务到线程池,并等待它们完成
executor.invokeAll(tasks);
} catch (InterruptedException e) {
System.out.println("Interrupted while waiting for tasks to complete");
Thread.currentThread().interrupt(); // 重新设置中断标志
} finally {
shutdownExecutor(executor);
}
}
private static void shutdownExecutor(ExecutorService executor) {
executor.shutdown();
try {
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
executor.shutdownNow();
if (!executor.awaitTermination(60, TimeUnit.SECONDS))
System.out.println("Pool did not terminate");
}
} catch (InterruptedException ie) {
executor.shutdownNow();
Thread.currentThread().interrupt(); // 重新设置中断标志
}
}

/**
* 将图片转换为PDF文件
*/
private static boolean generatePdfFile(File file) throws Exception {
try {
String fileName = file.getAbsolutePath();
String pdfFileName = fileName.substring(0, fileName.lastIndexOf(".")) + ".pdf";
Document doc = new Document(PageSize.A4, 20, 20, 20, 20);
PdfWriter.getInstance(doc, new FileOutputStream(pdfFileName));
doc.open();
doc.newPage();
Image image = Image.getInstance(file.getPath());
float height = image.getHeight();
float width = image.getWidth();
int percent = getPercent(height, width);
image.setAlignment(Image.MIDDLE);
image.scalePercent(percent);
doc.add(image);
doc.close();
File pdfFile = new File(pdfFileName);
count++;
System.out.println("File created: " + pdfFile.getAbsolutePath() + ",已转"+count+"个");
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}

}

/**
* 等比压缩,获取压缩百分比
*
* @param height 图片的高度
* @param weight 图片的宽度
* @return 压缩百分比
*/
private static int getPercent(float height, float weight) {
float percent = 0.0F;
if (height > weight) {
percent = PageSize.A4.getHeight() / height * 100;
} else {
percent = PageSize.A4.getWidth() / weight * 100;
}
return Math.round(percent);
}
public static void findImagesInSubdirectories(String rootPath) throws Exception {
File rootDirectory = new File(rootPath);
File[] subDirectories = rootDirectory.listFiles(File::isDirectory); // 只获取子目录
if (subDirectories != null) {
for (File dir : subDirectories) {
searchForImages(dir);
}
}
}

private static void searchForImages(File directory) throws Exception {
File[] files = directory.listFiles((dir, name) -> {
String lowerCaseName = name.toLowerCase();
return IMAGE_EXTENSIONS.stream()
.anyMatch(lowerCaseName::endsWith);
});
if(files != null){
processFiles(files);
}
}


public static List<File> findImageFiles(String directoryPath) {
List<File> imageFiles = new ArrayList<>();
File directory = new File(directoryPath);

if (directory.exists() && directory.isDirectory()) {
File[] files = directory.listFiles();
if (files!= null) {
for (File file : files) {
if (file.isDirectory()) {
// 递归查找子目录中的图片文件
imageFiles.addAll(findImageFiles(file.getAbsolutePath()));
} else {
String fileName = file.getName();
int start = fileName.lastIndexOf(".");
int end = fileName.length();
String fileType = fileName.substring(start, end).toLowerCase();
if (IMAGE_EXTENSIONS.contains(fileType)) {
imageFiles.add(file);
}
}
}
}
}
return imageFiles;
}

public static void setFileRecord(String content){
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
// 创建FileWriter对象,第二个参数true表示追加模式
FileWriter writer = new FileWriter("imgToPdf"+ sdf.format(new Date())+".txt", true);
//String content = "这是要追加到txt文件中的新内容";
writer.write(content);
writer.close();
//System.out.println("内容已成功追加到文件中");
} catch (IOException e) {
e.printStackTrace();
}
}



}

标签:java,file,new,static,File,import,PDF,图片
From: https://www.cnblogs.com/lt3232696/p/18586607

相关文章

  • JavaScript实现tab栏切换
    JavaScript实现tab栏切换代码功能概述这段代码实现了一个简单的选项卡(Tab)切换功能。它通过操作HTML元素的类名(class)来控制哪些选项卡(Tab)和对应的内容板块显示,哪些隐藏。基本思路是先移除所有选项卡和内容板块已有的“激活”类名,然后给指定的选项卡及其对应的内容板块添......
  • lime-echart 一个基于 JavaScript 的开源可视化跨平台图表库
    Lime-echart是一个基于JavaScript的开源可视化图表库,旨在使ECharts图表能够在UniApp各个端中运行。UniApp是一个跨平台的应用程序开发框架,允许开发人员使用Vue.js开发一次,然后部署到多个平台,包括iOS、Android、Web和各种小程序平台。 通过Lime-echart插件,开发人......
  • 求教0基础入门大模型的学习路线?java出身,数学良好,希望入局大模型算法,有无必要从cnn学起
    目录前排提示,文末有大模型AGI-CSDN独家资料包哦!前言本人本科学历java开发出身,数学基础良好,希望入局大模型算法,有无必要从cnn学起?transformer、bert是否必须要学?希望能在最短的时间掌握相关知识…近年来,随着大模型的火爆,他的领域几乎涉及到了生活中的方方面面:那么如何快......
  • 一个Java程序员具备什么样的素质和能力才可以称得上高级工程师?
    前两天在某乎上看到一个问答,说的是:一个Java程序员具备什么样的素质和能力才可以称得上高级工程师?这个问题也引发了我的一些思考,可能很多人会说,“作为高级工程师,基础得过硬、得熟练掌握一门编程语言、至少看过一个优秀开源项目的源代码、有过高并发/性能优化的工作经验、沟通......
  • 毕业生面试Java后端开发都会问些什么问题?
    对于刚入行的或者应届生一般面试前都会刷题或者看面经,这样心里才会有底。但也有人说面试前刷题是很愚蠢的行为,浪费时间效果还不大。但LZ认为,存在即真理!也许在有些人面前,刷题看面经真的没什么用,但谁又不是从刷题刷面经过来的呢,面试前系统的刷题梳理一下知识点还是对面试很有帮助......
  • vxe-table 使用 vxe-upload 在表格中实现非常强大的粘贴上传图片和附件
    看看vxe-table渲染器强大到什么地步;在开发需求中,经常会在表格列表中放入图片展示,例如头像、视频图片,附件列表等,但需要对表格批量操作是,会比较繁琐,那么有没有方便操作一点的放呢,肯定是有的;配合vxe-upload上传;比如复制或者截图一张图片,通过粘贴方式快速粘贴到单元格中,能支持单......
  • 【Java基础语法02】
    目录程序流程控制1.分支结构1.1if分支1.2switch分支1.3 if-switch分支比较2.循环结构2.1for循环2.2while循环2.3do-while循环2.4 三种循环的区别2.5死循环2.6 循环嵌套3.跳转关键字:break、continue4.生成随机数:Random程序流程控制1.分支结构1.1......
  • JAVA开源毕业设计 房屋租赁系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T020,文末自助获取源码\color{red}{T020,文末自助获取源码}......
  • JAVA开源毕业设计 大学生租房平台 Vue.JS+SpringBoot+MySQL
    本文项目编号T019,文末自助获取源码\color{red}{T019,文末自助获取源码}......
  • JAVA开源毕业设计 网上订餐系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T018,文末自助获取源码\color{red}{T018,文末自助获取源码}......