1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > springboot下 上传PPT文件转pdf再转图片

springboot下 上传PPT文件转pdf再转图片

时间:2023-11-25 00:52:32

相关推荐

springboot下 上传PPT文件转pdf再转图片

背景:

项目需要加新功能,所以查了一下博客里的相关资料,但是感觉很多写的都不够详细,需要参考很多篇文章才能写出来,于是就写这篇文章当作是笔记记录下来,以防以后项目需要用到又忘记了。

开发步骤(直接上代码):

一、下载并安装openoffice(以4.1.6版本为例)

openoffice有Windows和Linux系统的相应安装文件,下载地址:

/download/index.html

1、Windows安装

直接运行下载的Apache_OpenOffice_4.1.6_Win_x86_install_zh-CN.exe文件,需要记住安装的目录,因为要配置到代码中,我这里是默认安装到C盘

C:\Program Files (x86)\OpenOffice 4

2、Linux安装(以centos7为例)

在centos下,将Apache_OpenOffice_4.1.6_Linux_x86-64_install-rpm_zh-CN.tar.gz文件解压出来,会得到一个zh-CN文件夹,开始执行安装命令,安装目录为/opt/openoffice4

# 安装cd zh-CN/RPMSrpm -ivh *.rpmcd desktop-integrationrpm -ivh openoffice4.1.6-redhat-menus-4.1.6-9790.noarch.rpm# 启动cd /opt/openoffice4/programnohup soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &# 查看启动结果,有记录则表示运行成功netstat -lnp |grep 8100

二、整合springboot

pom.xml文件添加相关依赖

<!-- PDF转图片 --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.12</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.12</version></dependency><!-- PDF转图片 --><!-- PPT转PDF --><!--jodconverter 核心包 --><!-- /artifact/org.jodconverter/jodconverter-core --><dependency><groupId>org.jodconverter</groupId><artifactId>jodconverter-core</artifactId><version>4.2.2</version></dependency><!--springboot支持包,里面包括了自动配置类 --><!-- /artifact/org.jodconverter/jodconverter-spring-boot-starter --><dependency><groupId>org.jodconverter</groupId><artifactId>jodconverter-spring-boot-starter</artifactId><version>4.2.2</version></dependency><!--jodconverter 本地支持包 --><!-- /artifact/org.jodconverter/jodconverter-local --><dependency><groupId>org.jodconverter</groupId><artifactId>jodconverter-local</artifactId><version>4.2.2</version></dependency><!-- PPT转PDF -->

application.yml添加配置

jodconverter:local:# linux(centos)环境下的openoffice安装目录# office-home: /opt/openoffice4# windows环境下的openoffice安装目录office-home: C:/Program Files (x86)/OpenOffice 4max-tasks-per-process: 10port-numbers: 8100enabled: true

创建工具类

package com.hq.pms.utils;import lombok.Data;import lombok.extern.slf4j.Slf4j;import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.rendering.PDFRenderer;import org.jodconverter.DocumentConverter;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.ponent;import org.springframework.web.multipart.MultipartFile;import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/*** @ClassName OfficeUtil* @Author: Winston* @Description: TODO* @Date:Create:in /8/20 11:57* @Version:*/@Slf4j@Componentpublic class OfficeUtil {private String OFFICE_SAVE_PATH = "J:/DEV-TOOLS/nginx-1.14.0/html/images/";# 该注入可能会出现红色波浪线报错,但不影响,能够正常编译和运行@Autowiredprivate DocumentConverter converter;/*** @Description: * @param: 上传office文件* @return: * @auther: Winston* @date: /8/20 17:49*/public Map<String, String> excuteUpload(MultipartFile file) {if (!file.isEmpty()) {Map<String, String> res = new HashMap<>();String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);String filename = file.getOriginalFilename();File path = new File(OFFICE_SAVE_PATH);try {if (!path.exists()) {path.mkdirs();}String uploadPath = OFFICE_SAVE_PATH + filename;File excelFile = new File(uploadPath);file.transferTo(excelFile);res.put("fileName", filename);res.put("filePath", uploadPath);res.put("fileType", fileType);return res;} catch (Exception e) {e.printStackTrace();}}return null;}/*** @Description: PPT转PDF* @param:* @return:* @auther: Winston* @date: /8/20 16:25*/public String pptToPdf(String pptPath){File file = new File(pptPath);File pdfFile = null;String pdfPath = "";try {String randomString = StringUtil.getRandomString(5);File newFile = new File(OFFICE_SAVE_PATH);//转换之后文件生成的地址if (!newFile.exists()) {newFile.mkdirs();}pdfPath = OFFICE_SAVE_PATH + randomString + ".pdf";pdfFile = new File(pdfPath);//文件转化converter.convert(file).to(pdfFile).execute();} catch (Exception e) {e.printStackTrace();}return pdfPath;}/*** @Description: PDF转图片* @param:* @return:* @auther: Winston* @date: /8/20 14:23*/public List<Map<String, String>> pdfToImage(String pdfPath) {List<Map<String, String>> list = new ArrayList<>();Map<String, String> resultMap = null;File file = null;PDDocument pdDocument = null;try {int dpi = 296;file = new File(pdfPath);pdDocument = PDDocument.load(file);PDFRenderer renderer = new PDFRenderer(pdDocument);int pageCount = pdDocument.getNumberOfPages();/* dpi越大转换后越清晰,相对转换速度越慢 */for (int i = 0; i < pageCount; i++) {resultMap = new HashMap<>();String randomString = StringUtil.getRandomString(8);String fileName = randomString+ "-" + i+".png";String filePath = OFFICE_SAVE_PATH+ fileName;File dstFile = new File(filePath);BufferedImage image = renderer.renderImageWithDPI(i, dpi);ImageIO.write(image, "png", dstFile);resultMap.put("fileName", fileName);resultMap.put("filePath", filePath);list.add(resultMap);}}catch (Exception e){e.printStackTrace();}finally {try {// 这里需要关闭PDDocument,不然如果想要删除pdf文件时会提示文件正在使用,无法删除的情况pdDocument.close();} catch (IOException e) {e.printStackTrace();}}return list;}}

到这里已经基本完成了,由于我这里的项目需要保存上传的PPT原文件,所以单独写了上传的方法,然后只需要自行添加控制器,上传MultipartFile文件,然后得到本地的文件PPT文件路径,再将该路径传入下一个方法pptToPdf(String pptPath)即可得到转化后的pdf文件,之后再将pdf文件的路径传入pdfToImage(String pdfPath)方法即可按顺序得到pdf里面的图片。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。