当前位置: 首页 > news >正文

使用PDFBox实现pdf转其他图片格式

最近在做一个小项目,项目中有一个功能要把pdf格式的图片转换为其它格式,接下来看看用pdfbox来如何实现吧。

首先导入pdfbox相关依赖:

 <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.1</version> </dependency>   <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>2.0.0</version> </dependency><dependency>  <groupId>org.apache.pdfbox</groupId> <artifactId>jempbox</artifactId> <version>1.8.11</version> </dependency> <dependency><groupId>org.apache.pdfbox</groupId> <artifactId>xmpbox</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>preflight</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox-tools</artifactId> <version>2.0.0</version> </dependency>

接下来,控制层里面写一个方法接收三个参数(其中三个参数分别表示上传的文件,要转换的格式,输出路径):

  @ApiOperation("将pdf格式的图片装换为其它格式")@PostMapping("/pdfToimages")public R pdfToimages(@RequestPart("file") MultipartFile file, @RequestParam("type") String type,@RequestParam(value = "outpath",defaultValue = "C:\\PictureTool",required = false) String outpath){return  imagetoolService.convertToImages(file,type,outpath);}

然后是serviceimpl实现层实现对应方法(service接口此处就不做展示了,直接将serviceimpl里面的对应的方法设置为接口就行了):

/*** pdf转多张jpg(转换成多张图片)** @param file* @return*/@Overridepublic R convertToImages(MultipartFile file, String type, String outputPath) {if (file == null || file.isEmpty() || outputPath == null || outputPath.trim().isEmpty()) {// 对传入参数进行基本校验,确保它们不为空return R.Failed("请确保文件不为空且输出路径不为空。");}
//        获取文件名String filename = file.getOriginalFilename();int lastIndexOfDot = filename.lastIndexOf(".");if (lastIndexOfDot != -1) {filename = filename.substring(0, lastIndexOfDot);}System.out.println("文件名称为:" + filename);// 确保路径以分隔符结尾if (!outputPath.endsWith(File.separator)) {outputPath += File.separator;}try {// 加载PDF文件PDDocument document = PDDocument.load(file.getBytes());// 创建PDF渲染器PDFRenderer pdfRenderer = new PDFRenderer(document);// 使用ByteArrayOutputStream来构建ZIP文件的内容ByteArrayOutputStream baosZip = new ByteArrayOutputStream();ZipOutputStream zipOut = new ZipOutputStream(baosZip);// 遍历PDF中的每一页,并将其添加到ZIP流中for (int page = 0; page < document.getNumberOfPages(); page++) {// 使用300 DPI渲染图片BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);// 创建输出流缓存图像数据ByteArrayOutputStream baosImage = new ByteArrayOutputStream();// 保存图片到缓存流ImageIO.write(image, type, baosImage);// 将图像字节添加到ZIP文件中zipOut.putNextEntry(new ZipEntry(file.getOriginalFilename() + "_page_" + (page + 1) + "." + type));zipOut.write(baosImage.toByteArray());zipOut.closeEntry();}// 完成ZIP输出流写入操作并关闭之IOUtils.closeQuietly(zipOut);// 关闭PDF文档IOUtils.closeQuietly(document);// 创建用户指定的文件,用于保存ZIPString zipFilename = filename + "_converted_images_" + type + ".zip";File outputFile = new File(outputPath + zipFilename);FileUtils.writeByteArrayToFile(outputFile, baosZip.toByteArray());// 返回成功的状态响应return R.Success("转换成功,保存路径为:" + outputFile.getAbsolutePath(), 200);} catch (IOException e) {// 发生异常时打印堆栈跟踪并返回错误信息e.printStackTrace();return R.Failed(500, "转换失败:" + e.getMessage());}}

此处的R是我自己做的一个返回响应类,读者可以根据自己项目的实际情况设置自己的响应类,或者后台私信我获取,代码中均做有注释,若有疑问之处请留言~

项目成功运行之后会根据指定文件名的生成规则生成一个压缩包到指定的文件中,若没有指定文件则会用默认的文件生成路径。

接下来使用postman进行运行:

运行成功后,便可以在对应文件夹下面查看对应生成成功的文件:

后面直接将文件解压缩即可~

相关文章:

  • MYSQL笔记:约束条件
  • 【LangChain-04】利用权重和偏差跟踪和检查LangChain代理的提示
  • 国产三维剖面仪—MPAS-100相控参量阵浅地层剖面仪
  • C++单例模式详解
  • 部署tomcat
  • 这种学习单片机的顺序是否合理?
  • 牛客网SQL进阶127: 月总刷题数和日均刷题数
  • Kafka 使用手册
  • 获取视频帧图片
  • Spring Boot配置文件优先级
  • 贪心算法的应用
  • 环境配置:Ubuntu18.04 ROS Melodic安装
  • re:从0开始的CSS学习之路 3. CSS三大特性
  • ctfshow-命令执行(web73-web77)
  • Android kotlin build.gradle.kts配置
  • 78. Subsets
  • co.js - 让异步代码同步化
  • JavaScript实现分页效果
  • Java比较器对数组,集合排序
  • KMP算法及优化
  • Linux gpio口使用方法
  • Node 版本管理
  • Python学习之路13-记分
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 汉诺塔算法
  • 记录一下第一次使用npm
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 批量截取pdf文件
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 入门级的git使用指北
  • 携程小程序初体验
  • 一份游戏开发学习路线
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • Java数据解析之JSON
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (C++17) std算法之执行策略 execution
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (rabbitmq的高级特性)消息可靠性
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (十三)Maven插件解析运行机制
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)认识微服务
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • *** 2003
  • ***检测工具之RKHunter AIDE