(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"></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自带的字体库,使用时只需要知道引用字体库路径就行,字体库如下图: