首页 > 编程语言 >Java后端实现ppt格式转为pdf格式文件

Java后端实现ppt格式转为pdf格式文件

时间:2024-08-17 16:28:04浏览次数:10  
标签:文件 Java String 格式文件 file ppt pdf 上传

(1)使用场景:将从web前端上传到后端的ppt格式的文件转换为pdf格式的文件。项目框架为springboot+layui

(2)实现方法:

1、步骤1:导入所需jar包,如下

<!--ppt转pdf-->
<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-word</artifactId>
    <version>18.10</version>
</dependency>
<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-cells</artifactId>
    <version>18.9</version>
</dependency>
<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-slides</artifactId>
    <version>19.6</version>
</dependency>

2、步骤2:通过layui文件上传插件将数据传到后端,前端layui代码如下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>文档添加</title>
    <meta charset="utf-8"/>
    <meta name="content-type" content="text/html; charset=UTF-8"/>
    <meta name="renderer" content="webkit"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <meta name="viewport"
          content="width=device-width, initial-scale=1, maximum-scale=1"/>
    <meta name="apple-mobile-web-app-status-bar-style" content="black"/>
    <meta name="apple-mobile-web-app-capable" content="yes"/>
    <meta name="format-detection" content="telephone=no"/>
    <link rel="stylesheet" type="text/css" media="all"
          th:href="@{/layui/css/layui.css}"/>

</head>

<body oncontextmenu=self.event.returnValue=false>
<div style="padding: 30px;" class="layui-layout layui-layout-admin">
    <form class="layui-form layui-form-panel" action="">
        <div class="layui-row">
            <button style="margin: 10px 5px 10px 40px;" type="button" class="layui-btn layui-btn-sm" id="uploadDocument"><i class="layui-icon">&#xe62f;</i>上传文档</button>
            <span style="font-size: 10px ">(支持上传格式ppt)</span>
        </div>


        <div class="layui-form-item">
            <label class="layui-form-label">文档文件</label>
            <div class="layui-input-block">
                <input type="text" name="documentUrl" id="documentUrl" required="" lay-verify="required"
                       placeholder="此项上传文档后所得,不可编辑" autocomplete="off" class="layui-input" readonly="readonly"/>
            </div>
        </div>

        <div class="layui-form-item" style="text-align:center;">
            <div class="layui-input-block">
                <button class="layui-btn layui-btn-sm" lay-submit="" lay-filter="add">保存</button>
                <button type="reset" class="layui-btn layui-btn-sm layui-btn-primary">重置</button>
            </div>
        </div>
    </form>
</div>
<script type="text/javascript" th:src="@{/layui/layui.js}"></script>
<script th:inline="javascript">
	var index = parent.layer.getFrameIndex(window.name); //获取窗口索引
	layui.use([ 'form', 'upload'], function() {
	var form = layui.form,
			layer = layui.layer,
			upload =layui.upload,
			$ = layui.jquery;

	// 外部定一个变量true
        var flag = true;
		//上传document
		upload.render({
		    elem:'#uploadDocument'// 绑定的按钮
		    ,url:'/upload/document'
		    ,accept:'file'
		    ,exts:'ppt' // 大小写一样,都可以上传
            ,size:204800  // 文档限制大小200M-204800
		    ,done:function(res){
		        if(flag == true){
                    // console.log("flag == true")
                    if(res.operationResult == "SUCCESS") {

                        // 文件上传成功后,把文件名返回到input输入框中
                        document.getElementById("documentUrl").value=res.queryData;


                    } else {
                        layer.msg(res.operationMessage, {
                            icon : 5,
                            time : 3000 //3s后自动关闭
                        });

                    }
                }

		    }
		    ,error:function(res){
		        document.getElementById("documentUrl").value="";
		        layer.msg("上传文件过大,默认限制200Mb", {
	    			icon : 5,
	    			time : 3000 //3s后自动关闭
	    		});

		    }
		})

	})
</script>
</body>
</html>

3、步骤3:java后端controller类接受前端传来的数据,调用UploadBusiness.uploadFile(file, documentUrl)方法,代码如下:

/*********************************************************
 * 函数名:uploadDocument
 * 功能描述:上传文档
 * 输入参数:MultipartFile file
 *
 * 输出参数:UploadBusiness.uploadFile
 *
 *********************************************************/
@RequestMapping("/upload/document")
@ResponseBody
public ResultEntity uploadDocument(@RequestParam("file") MultipartFile file) {
    // 参数documentUrl--yml文件中上传过来的文档的存储路径C..\resource_path\doc
    return UploadBusiness.uploadFile(file, documentUrl);
}

4、步骤4:通过UploadBusiness.uploadFile(file, documentUrl)方法将ppt格式转换为pdf格式,代码如下:

public class UploadBusiness {

/************************************************************
 * 函数名:uploadFile
 * 功能描述:处理上传文档,调用格式转换函数将ppt格式转换为pdf,然后将转换后的pdf和原文件存储到指定位置。
 *输入参数:MultipartFile file     layui上传过来的file
 *        fileUrl               上传文件的存储地址
 *返回参数:ResultEntity         上传成功时返回的是重名命的文件名,前端需要读取。
 *                             上传失败时返回错误信息,前端需要读取
 *
 *************************************************************/
    public static ResultEntity uploadFile(MultipartFile file, String fileUrl) {
        // 获得文件名
        String fileName = file.getOriginalFilename();
        // 获得文件名
        String oldFileName = fileName.substring(0, fileName.lastIndexOf(BaseConstants.DOT));
        // 获得文件后缀名
        String suffix = fileName.substring(fileName.lastIndexOf(BaseConstants.DOT) + 1);
        // 返回当前calendar对象中时间的毫秒计时
        long timeInMillis = Calendar.getInstance().getTimeInMillis();
        //文档重命名,反映到数据表document_url中
//        String newName = oldFileName + timeInMillis + BaseConstants.DOT + suffix;

        //文档重命名,不加原来名字
        String newName = timeInMillis + BaseConstants.DOT + suffix;

        // 判断文件内容是否为空
        if (!file.isEmpty()) {
            try {
                // filePath=C:\Users\LC\Documents\hzw\resource_path\doc+ \ +新文件名
                String filePath = fileUrl + File.separator + newName;
                File pictureUrlFile = new File(fileUrl);
                // 如果文件存在,则不执行创建文件操作
                if (!pictureUrlFile.exists()) {
                    pictureUrlFile.getParentFile().mkdirs();
                }
                // File对象,作为 new FileInputStream()的参数要用,作为指向文件的输入流的源。
                File filePathFile = new File(filePath);
                // 如果文件不存在,则执行创建文件操作
                if (!filePathFile.exists()) {
                    filePathFile.getParentFile().mkdirs();
                }
                // 把file文件存储到指定位置
                file.transferTo(filePathFile);

                // 判断上传文件是否为ppt格式
				if (suffix.equals('ppt') ){

                    // ppt 转pdf
                    // 创建输入流
                    FileInputStream in = new FileInputStream(filePathFile);
                    // 获得文件名
                    String prefix = newName.substring(0, newName.lastIndexOf(BaseConstants.DOT));
                    String newFileName = fileUrl + File.separator + prefix + BaseConstants.DOT + BaseConstants.DOCUMENT_TYPE_PDF;

					// 调用工具类将ppt转换为pdf
                    HtmlUtil.ppt2PDF(in, newFileName);
                    in.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
                return ResultEntity.failed("上传失败");
            }
        } else {
            return ResultEntity.failed("请不要上传空文件");
        }
        return ResultEntity.successWithData(newName);
    }
}

5、步骤5:调用工具类HtmlUtil.ppt2PDF(in, newFileName)方法将ppt转换为pdf,工具类代码如下:

public class HtmlUtil {

	@Value("${upload.url.config}")//获取yml中config的值(路径),即字体库的路径,如C:/fonts,用于转换ppt中的文字字体为pdf字体
	private String config;

	private static String configUrl;

	private static InputStream license;
	private Document doc;

	/**
	 *
	 */
	@PostConstruct
	public void getApiToken() {
		configUrl = this.config;
	}

	/**
	 *
	 * @return
	 */
	private static String getConfigUrl() {
		return configUrl;
	}

	/**
	 * 获取该工具类的许可证,没有许可证会导致转换后的文档有水印
	 * @return
	 */
	private static boolean getLicense() {
		boolean result = false;
		try {
			String licenseFile = getConfigUrl() + File.separator + "license.xml";//license.xml文件地址,如C:/license.xml
			System.out.println(licenseFile);
			//创建输入流
			license = new FileInputStream(licenseFile);
			License aposeLic = new License();
			aposeLic.setLicense(license);
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}


	/**
	 *
	 * @param in
	 * @param path
	 */
	public static void ppt2PDF(InputStream in, String path) {
		if (!PPTUtil.getLicenseForPPT()) {
			return;
		}
		// 字体设置
		String fontPath = getConfigUrl() + File.separator + "fonts";
		FontSettings.getDefaultInstance().setFontsFolder(fontPath, true);
		try {
			long old = System.currentTimeMillis();//返回当前计算机时间,表达格式为毫秒
			Presentation ppt= new Presentation(in);
			FileOutputStream fileOS = new FileOutputStream(new File(path));//创建输出流
			// 用输出流往pdf文件里写东西
			ppt.save(fileOS, com.aspose.slides.SaveFormat.Pdf);
			long now = System.currentTimeMillis();
			System.out.println("ppt转PDF共耗时:" + ((now - old) / 1000.0) + "秒\n\n");
			fileOS.close();//关闭输出流
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


}

6、步骤6:工具类HtmlUtil的许可证为license.xml,license.xml代码如下:

<License>
  <Data>
    <Products>
      <Product>Aspose.Total for Java</Product>
      <Product>Aspose.Words for Java</Product>
    </Products>
    <EditionType>Enterprise</EditionType>
    <SubscriptionExpiry>20991231</SubscriptionExpiry>
    <LicenseExpiry>20991231</LicenseExpiry>
    <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
  </Data>
  <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>

7、步骤7:字体库文件为windows自带的字体库,使用时只需要知道引用字体库路径就行,字体库如下图:

7aa4d9ad8c024237bf408c252706119f.png

 

标签:文件,Java,String,格式文件,file,ppt,pdf,上传
From: https://blog.csdn.net/weixin_43848846/article/details/141259934

相关文章

  • java毕业设计-基于springboot+vue的美食分享平台,基于springboot的厨房达人美食分享平
    文章目录前言演示视频项目背景项目架构和内容获取(文末获取)具体实现截图用户前台管理后台技术栈具体功能模块设计系统需求分析可行性分析系统测试为什么我?关于我我自己的网站项目相关文件前言博主介绍:✌️码农一枚,专注于大学生项目实战开发、讲解和毕业......
  • java批量写入数据库
    使用java.sql.DriverManager;进行数据批量写入首先下载mysql-connect连接驱动包,https://dev.mysql.com/downloads/connector/j/5.1.html将驱动包mysql-connector-j-8.2.0.jar放入项目lib下并右键选择addaslibrary。importjava.sql.Connection;importjava.sql.DriverManage......
  • Java中使用lambda表达式自定义排序
    对于一维数组,通常使用Arrays.sort()(默认升序)int[]nums={3,1,4,2};Arrays.sort(nums);对于二维数组,可以lambda表达式实现特定的排序要求。在Arrays.sort()的第二个参数中,写lambda表达式lambda表达式形如(a,b)->{returna-b;},其中a,b表示数组中的元素升序/......
  • [Java SE/JDK] Java 注解机制
    1概述1.0引言面向切面编程思想(aop)与注解的结合,是实现复杂系统解藕的最终良药。软件工程的核心思想、目标追求,6字箴言:高内聚,低耦合。Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。jdk、spring、springbo......
  • java
    8.11(1)学生管理系统菜单搭建代码示例:importjava.util.Scanner;publicclassStudentSystem{publicstaticvoidmain(String[]args){loop:while(true){System.out.println("--------欢迎进入学生管理系统---------");System.out.println("1:添加学生");System.out.p......
  • Java后端面试题(mq相关)(day9)
    目录为什么用MQ?异步、削峰、解耦1.异步处理2.解耦3.削峰填谷Exchange类型什么是死信队列?如何保证消息的可靠性?RabbitMQ中如何解决消息堆积问题?RabbitMQ中如何保证消息有序性?如何防止消息重复消费?(如何保证消息幂等性)为什么用MQ?异步、削峰、解耦MQ(Message......
  • Java中的图算法:如何实现高效的最短路径计算
    Java中的图算法:如何实现高效的最短路径计算大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!作为开头。最短路径算法是图论中的一个核心问题,广泛应用于网络路由、地图导航等领域。在Java中实现高效的最短路径计算通常涉及到Dijkstra算法和Floy......
  • 点亮职场之路,从优化简历开始 —— 专业Java简历优化服务,助您脱颖而出
    手机或电脑浏览器就可以打开,面霸宝典【全拼音】.com这里可以优化简历,模拟面试,企业项目源码,最新最全大厂高并发面试题,项目场景题,算法题,底层原理题在Java技术的浩瀚星海中,每一位求职者都是独特的星辰,但如何让自己在众多候选人中熠熠生辉,成为企业争抢的“宝藏”?答案,就藏在......
  • Java简历优化专家 —— 打造您的职业名片,引领梦想职位之旅
    手机或电脑浏览器就可以打开,面霸宝典【全拼音】.com这里可以优化简历,模拟面试,企业项目源码,最新最全大厂高并发面试题,项目场景题,算法题,底层原理题在Java编程的征途上,每一步都至关重要。而一份精心优化的简历,正是您迈向理想职位的第一步。我们深知,每一位Java求职者都渴望......
  • 面试题:在Java中,JVM(Java虚拟机)的内存模型是如何设计的?请详细解释堆(Heap)、栈(Stack)、方法
    面试题:在Java中,JVM(Java虚拟机)的内存模型是如何设计的?请详细解释堆(Heap)、栈(Stack)、方法区(MethodArea)以及程序计数器(ProgramCounterRegister)的作用和它们之间的关系。更多答案在这里,手机或电脑浏览器就可以打开,面霸宝典【全拼音】.com这里可以优化简历,模拟面试,企业项......