spring boot 实现 PDF转换图片

引入依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version><relativePath/>
</parent><dependencies>   <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--将pdf文件转换为图片的依赖--><dependency><groupId>org.icepdf.os</groupId><artifactId>icepdf-core</artifactId><version>6.2.2</version></dependency>
</dependencies>

前端页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>PDf转换图片</title><style>.submitButton {margin-top: 20px;margin-left: 150px;background-color: #e37e10;border-radius: 10px;border: 1px solid #ff8300;}</style>
</head>
<body>
<div style="text-align: center"><h1>PDF转换图片工具</h1><form action="/pdf/to/image" enctype="multipart/form-data" method="post" onsubmit="return allowFileType()"><input type="file" id="file" name="file" placeholder="请选择PDF文件" onchange="allowFileType()" style="border: 1px solid black;"><br><input type="submit" value="一键转换图片" class="submitButton"></form>
</div>
</body>
<script>function allowFileType() {let file = document.getElementById("file").files[0];let fileName = file.name;let suffix = fileName.substring(fileName.lastIndexOf("."),fileName.length).toLowerCase();if('.pdf' != suffix) {alert("只允许传入PDF格式的文件!");return false;}return true;}
</script>
</html>

控制层接口

/*** @description: 用于处理Pdf相关的请求*/
@Controller
@RequestMapping("pdf")
public class PdfController {@PostMapping("to/image")public void pdfToImage(@RequestParam("file") MultipartFile file,HttpServletResponse response) throws Exception{ImageUtils.pdfToImage(file,response);}}

Image工具类


/*** @description: PDF转换为图片的工具类*/
@Component
public class ImageUtils {/*** 图片文件格式*/public static final String FORMAT_NAME = "png";/*** 图片文件后缀名*/public static final String PNG_SUFFIX = ".png";/*** 压缩文件后缀名*/public static final String ZIP_SUFFIX = ".zip";/*** 对外的开放接口,用于将PDF文件转换为图片文件压缩包进行下载** @param file SpringMVC获取的图片文件* @param response* @throws Exception*/public static void pdfToImage(MultipartFile file, HttpServletResponse response) throws Exception {File zipFile = generateImageFile(file);downloadZipFile(zipFile, response);}/*** 将PDF文件转换为多张图片并放入一个压缩包中** @param file SpringMVC获取的图片文件* @return 图片文件压缩包* @throws Exception 抛出异常*/private static File generateImageFile(MultipartFile file) throws Exception {String fileName = file.getOriginalFilename();Document document = new Document();document.setByteArray(file.getBytes(), 0, file.getBytes().length, fileName);List<File> fileList = new ArrayList<>();for (int i = 0; i < document.getNumberOfPages(); i++) {BufferedImage image = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN,Page.BOUNDARY_CROPBOX, 0F, 2.5F);File imageFile = new File((i + 1) + PNG_SUFFIX);ImageIO.write(image, FORMAT_NAME, imageFile);image.flush();fileList.add(imageFile);}document.dispose();String directoryName = fileName.substring(0, fileName.lastIndexOf("."));File zipFile = new File(directoryName + ZIP_SUFFIX);ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));zipFile(fileList, zos);zos.close();return zipFile;}/*** 下载zip文件** @param zipFile  zip压缩文件* @param response HttpServletResponse* @throws IOException IO异常*/private static void downloadZipFile(File zipFile, HttpServletResponse response) throws IOException {FileInputStream fis = new FileInputStream(zipFile);byte[] bytes = new byte[fis.available()];fis.read(bytes);fis.close();response.reset();response.setCharacterEncoding("UTF-8");response.setHeader("Content-Type", "application/x-msdownload");response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(zipFile.getName(), "UTF-8"));OutputStream out = response.getOutputStream();out.write(bytes);out.flush();out.close();zipFile.delete();}/*** 压缩文件** @param inputFiles 具体需要压缩的文件集合* @param zos        ZipOutputStream对象* @throws IOException IO异常*/private static void zipFile(List<File> inputFiles, ZipOutputStream zos) throws IOException {byte[] buffer = new byte[1024];for (File file : inputFiles) {if (file.exists()) {if (file.isFile()) {BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));zos.putNextEntry(new ZipEntry(file.getName()));int size = 0;while ((size = bis.read(buffer)) > 0) {zos.write(buffer, 0, size);}zos.closeEntry();bis.close();file.delete();} else {File[] files = file.listFiles();List<File> childrenFileList = Arrays.asList(files);zipFile(childrenFileList, zos);}}}}}

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

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

相关文章

Spring MVC中redirect重定向几种方式(重构)

简介 在Web应用开发中&#xff0c;用户在提交表单后刷新页面或点击后退按钮&#xff0c;可能导致表单被重复提交&#xff0c;这会引发多种问题&#xff0c;如重复下订单等。为了避免这种情况&#xff0c;我们可以利用HTTP重定向&#xff08;redirect&#xff09;机制&#xff…

《深入理解Maven:构建工具、常用命令与项目包技巧解析》

文章目录 何为构建工具 | ToolsMaven插件的常用命令 | Commondclean总结 | Summary compile总结 | Summary package总结 | Summary install总结 | Summary build和compile的区别 | Knowledge项目包技巧 | Method 在后端领域开发中&#xff0c;我们构建项目常用到了Maven和Gradl…

Science Robotics 封面论文:美国宇航局喷气推进实验室开发了自主蛇形机器人,用于冰雪世界探索

人们对探索冰冷的卫星&#xff08;如土卫二&#xff09;的兴趣越来越大&#xff0c;这可能具有天体生物学意义。然而&#xff0c;由于地表或冰口内的环境极端&#xff0c;获取样本具有挑战性。美国宇航局的喷气推进实验室正在开发一种名为Exobiology Extant Life Surveyor&…

ChatGPT:激发学术创新,引领论文写作进程!

ChatGPT无限次数:点击跳转 摘要&#xff1a; 随着人工智能技术的不断发展&#xff0c;ChatGPT成为了学术界的一股清新风潮。本文将探讨ChatGPT在学术论文写作方面的独特性和潜力&#xff0c;并通过多个实例展示其独特的优势。通过ChatGPT&#xff0c;我们可以打破论文写作的瓶…

【论文阅读笔记】Split frequency attention network for single image deraining

1.论文介绍 Split frequency attention network for single image deraining 用于单幅图像去噪的分频注意力网络 Paper Code 2023年 SIVP 2.摘要 雨纹对图像质量的影响极大&#xff0c;基于数据驱动的单图像去噪方法不断发展并取得了巨大的成功。然而&#xff0c;传统的卷积…

C/C++动态链接库的封装和调用

1 引言 静态链接库是在编译时被链接到程序中的库文件&#xff0c;在编译时&#xff0c;链接器将静态链接库的代码和数据复制到最终的可执行文件中。动态链接库是在程序运行时加载的库文件&#xff0c;在编译时&#xff0c;可执行文件只包含对动态链接库的引用&#xff0c;而不…

外贸网站文章批量生成器

随着全球贸易的不断发展&#xff0c;越来越多的企业开始关注外贸市场&#xff0c;而拥有高质量的内容是吸引潜在客户的关键之一。然而&#xff0c;为外贸网站生产大量优质的文章内容可能是一项耗时且繁琐的任务。因此&#xff0c;外贸网站文章批量生成软件成为了解决这一难题的…

remote: GitLab: LFS objects are missing(pre-receive hook declined)

Git push 遇到错误&#xff1a; remote: GitLab: LFS objects are missing. Ensure LFS is properly set up or try a manual "git lfs push --all". To http://192.168.x.x/xxxxxx.git! [remote rejected] dev -> dev (pre-receive hook declined) error: faile…

语音识别:whisper部署服务器(远程访问,语音实时识别文字)

Whisper是OpenAI于2022年发布的一个开源深度学习模型&#xff0c;专门用于语音识别任务。它能够将音频转换成文字&#xff0c;支持多种语言的识别&#xff0c;包括但不限于英语、中文、西班牙语等。Whisper模型的特点是它在多种不同的音频条件下&#xff08;如不同的背景噪声水…

做跨境用哪种代理IP比较好?怎么选到干净的IP?

代理IP对于做跨境的小伙伴来说&#xff0c;都是必不可少的工具&#xff0c;目前出海的玩法已经是多种多样&#xff0c;开店、账号注册、短视频运营、直播带货、网站SEO等等都是跨境人需要涉及到的业务。而国外代理IP的获取渠道非常多&#xff0c;那么做跨境到底应该用哪种代理I…

linux开机启动设置方法

开机启动最简单的方法是在/etc/rc.local启动脚本中写入需要执行的命令。另一种方式是在/etc/init.d中编写一个启动脚本。但是这两种方式都不是正规的启动模式。init.d是Linux最早的服务管理方案&#xff0c;命令service start xxx就是去调用init.d中的启动脚本。之后init机制被…

蓝桥杯(3.18 刷真题)

P8697 [蓝桥杯 2019 国 C] 最长子序列 AC import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String s1 sc.nextLine();String s2 sc.nextLine();char[] c1 s1.toCharArray();char[] c2 s2.toCh…

使用 Redisson 实现分布式 CountDownLatch,如何使用RCountDownLatch实现内外网数据互通的超时控制?

闭锁&#xff08;CountDownLatch&#xff09;是一种用于同步多个线程的机制&#xff0c;它可以让一个或多个线程等待其他线程完成某个任务后再继续执行。 在Java中&#xff0c;RCountDownLatch 是 Redisson 提供的分布式闭锁实现&#xff0c;它基于 Redis 的分布式系统&#x…

基于Spring Boot的研究生志愿填报辅助系统

摘 要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一…

掌握请求控制权:Axios 如何取消请求的两种方法

在前端开发中&#xff0c;网络请求是非常常见的操作。而有时候&#xff0c;我们可能需要在发送请求后取消它&#xff0c;比如用户在请求还未完成时离开了当前页面或者执行了其他操作&#xff0c;本文将介绍如何在使用 Axios 发送请求时取消这些请求。 基本概念 在 Axios 中&am…

【NLP03-新闻主题分类任务】

新闻主题分类任务 背景 以一段新闻报道中的文本描述内容为输入&#xff0c;使用模型帮助我们判断它最优可能属于哪一种类型的新闻&#xff0c;这是典型的文本分类问题&#xff0c;这里假定每种类型是互斥的&#xff0c;即文本描述有且只有一种类型 新闻主题分类数据 #通过t…

swagger使用手册

1.导入依赖 <!--引入swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><dependency><groupId>io.springfox</…

什么是集成学习

集成学习是一种机器学习方法&#xff0c;目的是将多个基本学习算法组合起来&#xff0c;以达到更好的预测性能。通过将多个模型的预测结果进行加权平均或投票&#xff0c;集成学习能够减少单个模型的偏差和方差&#xff0c;从而提高整体的泛化能力。常见的集成学习方法包括Bagg…

AR/MR产品设计(二):如何用一双手完成与虚拟对象的自然交互

AR/MR产品设计&#xff08;二&#xff09;&#xff1a;如何用一双手完成与虚拟对象的自然交互 - 知乎 手是我们与现实世界交互最重要的方式&#xff0c;同样在虚实混合的世界中是最重要的交互方式 在AR/MR/VR的交互中&#xff0c;手势交互会作为XR的重要交互动作&#xff0c;因…

鸿蒙开发 一 (一)、框架了解

一、UI框架 开发范式名称 语言生态 UI更新方式 适用场景 适用人群 声明式开发范式 ArkTS语言 数据驱动更新 复杂度较大、团队合作度较高的程序 移动系统应用开发人员、系统应用开发人员 类Web开发范式 JS语言 数据驱动更新 界面较为简单的程序应用和卡片 Web前端…