Java后端实现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

 

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值