用Aspose-Java免费实现 PDF、Word、Excel、Word互相转换并将转换过得文件上传OSS,返回转换后的文件路径
嘿嘿嘿、嘿嘿,俺又回来了!
github代码地址 | https://github.com/Tom-shushu/work-study |
接口文档有道云 | https://note.youdao.com/s/GShGsYE8 |
接口文档离线版本 | https://files.cnblogs.com/files/Tom-shushu/%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3.rar?t=1682958343&download=true |
一、为什么停更了四五个月
怎么说呢,从去年十二月份(就是我发最后一篇文章时间)到现在已经四五个月了,这段时间感觉生活很乱,我在安安心心上班、边上班边学习新知识新技术然后跳槽到大厂、边上班边考《系统架构设计师》这三件事情之间徘徊犹豫一直持续到现在,所以导致一样事情也没有干好 ------- 总结一句:为什么没有更博客呢?一个字,就是懒,嘿嘿~
还有一个原因:就是最近朋友给介绍了一个对象,比较忙(*^▽^*)
为什么发布这篇文档转换的文章呢?因为上周我要将一个PDF转换为Word,结果百度谷歌了所有文章,最终的结果都是“能转换,但是只能转换一点点,多了就要收费”,于是乎我突发奇想、心血来潮在放假的那天打算开发一款小程序实现各种文档的转换,在百度了一下午后发现目前都是借助Aspose实现的,但是好像要收费,在我新建项目时偶然间发现原来Maven仓库里面居然有人将破解好的Jar包上传到Maven中央仓库了,于是我测试了一下,哈哈真香,于是就有了这篇文章。至于小程序做的怎么样了呢?暂时又搁置了,因为我调查了一下已经有现成的好多优秀的微信小程序可以实现各种文档转换了,还有就是个人小程序没法上线,可能暂时不会做小程序了,大家有想法的可以按照自己的想法使用我的源码,直接和前端对接做出优秀的小程序。
二、PDF相关文件操作
1.引入依赖
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-pdf</artifactId>
<version>23.1</version>
</dependency>
2.代码实现(只贴关键代码,代码我会放到GitHub跟Gitee上面,大家自取、还有完整的接口文档我都会放出来)
① 上传OSS工具类 OssUpLoadTools
/**
* @description: 获取文件保存地址
* @return: java.lang.String
* @author: zhouhong
* @date: 2023/4/30 12:36
*/
public String getSavePath() {
ApplicationHome applicationHome = new ApplicationHome(this.getClass());
// 保存目录位置根据项目需求可随意更改
return applicationHome.getDir().getParentFile()
.getParentFile().getAbsolutePath() + "\\src\\main\\resources\\templates\\";
} /**
* @description: 上传文件到阿里云OSS
* @return: java.lang.String
* @author: zhouhong
* @date: 2023/5/1 22:55
*/
public String uploadOssFile(String fileName, File file){
// 创建OSSClient实例。
OSS ossClient = ossConfig.getOssClient();
try {
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(ossConfig.getBucketName(),
fileName, file);
putObjectRequest.setProcess("true");
// 上传文件。
PutObjectResult result = ossClient.putObject(putObjectRequest);
// 如果上传成功,则返回200。
if (result.getResponse().getStatusCode() == 200) {
return result.getResponse().getUri();
}
} catch (OSSException oe) {
} catch (ClientException ce) {
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return null;
}
② PDF转其他文件
/**
* @description: PDF 转其他文件
* @return: java.util.List<java.lang.String>
* @author: zhouhong
* @date: 2023/5/1 23:34
*/
@Override
public List<String> pdfToFile(MultipartFile file,String type) {
List<String> res = new ArrayList<>();
String checkType = FilenameUtils.getExtension(file.getOriginalFilename());
if (!"pdf".equals(checkType)) {
throw new ServiceException(1, "输入文件不是PDF文件!");
}
try {
switch (type.toUpperCase()) {
case "WORD" : {
return switchFile(file, com.aspose.pdf.SaveFormat.DocX, "docx");
}
case "XML" : {
return switchFile(file, SaveFormat.PdfXml, "xml");
}
case "EXCEL" : {
return switchFile(file, com.aspose.pdf.SaveFormat.Excel, "xlsx");
}
case "PPT" : {
return switchFile(file, com.aspose.pdf.SaveFormat.Pptx, "pptx");
}
case "PNG" : {
// 图片类型的需要获取每一页PDF,一张一张转换
Document pdfDocument = new Document(file.getInputStream());
//分辨率
Resolution resolution = new Resolution(130);
PngDevice pngDevice = new PngDevice(resolution);
//
if (pdfDocument.getPages().size() <= 10) {
for (int index = 0; index < pdfDocument.getPages().size(); index++) {
String fileName = UUID.randomUUID() + ".png";
String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
File tmpFile = new File(filePath);
FileOutputStream fileOS = new FileOutputStream(tmpFile);
pngDevice.process(pdfDocument.getPages().get_Item(index), fileOS);
res.add(ossUpLoadTools.uploadOssFile(fileName, tmpFile));
fileOS.close();
tmpFile.delete();
}
} else {
throw new ServiceException(2, "抱歉超过10页暂时无法转图片");
}
return res;
}
case "HTML" : {
String fileName = UUID.randomUUID() + ".html";
String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
Document doc = new Document(file.getInputStream()); HtmlSaveOptions saveOptions = new HtmlSaveOptions();
saveOptions.setFixedLayout(true);
saveOptions.setSplitIntoPages(false);
saveOptions.setRasterImagesSavingMode(HtmlSaveOptions.RasterImagesSavingModes.AsExternalPngFilesReferencedViaSvg);
doc.save(filePath , saveOptions);
doc.close();
File outputfile = new File(filePath);
res.add(ossUpLoadTools.uploadOssFile(fileName, outputfile));
outputfile.delete();
return res;
}
default:{}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
} private List<String> switchFile(MultipartFile file, SaveFormat saveFormat, String suffix) {
List<String> resUrl = new ArrayList<>();
try {
long old = System.currentTimeMillis();
// 输出路径
String fileName = UUID.randomUUID() + "." + suffix;
String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
FileOutputStream os = new FileOutputStream(filePath);
Document doc = new Document(file.getInputStream());
doc.save(os, saveFormat);
os.close();
doc.close();
File outputfile = new File(filePath);
resUrl.add(ossUpLoadTools.uploadOssFile(fileName, outputfile));
outputfile.delete();
long now = System.currentTimeMillis();
log.info("共耗时:" + ((now - old) / 1000.0) + "秒"); }catch (IOException e) {
e.printStackTrace();
}
return resUrl;
}
③ 合并两个、多个PDF文件
/**
* @description: 合并两个PDF文件
* @return: java.lang.String
* @author: zhouhong
* @date: 2023/5/1 23:40
*/
@Override
public String mergeTwoPdfFile(MultipartFile file1, MultipartFile file2) {
try {
Document doc1 = new Document(file1.getInputStream());
Document doc2 = new Document(file2.getInputStream());
doc1.getPages().add(doc2.getPages()); String fileName = UUID.randomUUID() + ".pdf";
String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
doc1.save(filePath);
doc1.close();
File outputfile = new File(filePath);
String res = ossUpLoadTools.uploadOssFile(fileName, outputfile);
outputfile.delete();
return res;
} catch (IOException e){
e.printStackTrace();
}
return null;
}
/**
* @description: 合并对个PDF文件
* @return: java.lang.String
* @author: zhouhong
* @date: 2023/5/1 23:40
*/
@Override
public String mergeMorePdfFile(MultipartFile ... file) {
try {
String mergeFileName = UUID.randomUUID() + ".pdf";
String mergePdfPath = ossUpLoadTools.getSavePath() + "/" + mergeFileName;
String[] chilPdfPath = new String[file.length];
// 读取PDF并获取路径
for (int i = 0; i < file.length; i++) {
String fileName = UUID.randomUUID() + ".pdf";
String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
FileOutputStream os = new FileOutputStream(filePath);
Document doc = new Document(file[i].getInputStream());
doc.save(os);
chilPdfPath[i] = filePath;
os.close();
doc.close();
}
// 合并多个PDF
PdfFileEditor pdfFileEditor = new PdfFileEditor();
pdfFileEditor.concatenate(chilPdfPath, mergePdfPath); // 读取文件上传OSS
File outputfile = new File(mergePdfPath);
String resUrl = ossUpLoadTools.uploadOssFile(mergeFileName, outputfile);
outputfile.delete();
return resUrl;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
三、Excel相关操作
1.引入相关依赖
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-cells</artifactId>
<version>22.10</version>
</dependency>
2.相关关键代码
/**
* @description: Excel转其他文件
* @return: java.lang.String
* @author: zhouhong
* @date: 2023/5/1 23:44
*/
@Override
public String excelToFile(MultipartFile file, String type) {
String checkType = FilenameUtils.getExtension(file.getOriginalFilename());
if (!"xlsx".equals(checkType) && !"xls".equals(checkType)) {
throw new ServiceException(1, "输入文件不是Excel文件!");
}
try {
switch (type.toUpperCase()) {
/******************** 文档类型 ***************/
case "WORD" : {
return SwitchFile(file, com.aspose.cells.SaveFormat.DOCX, "docx");
}
case "PDF" : {
return SwitchFile(file, com.aspose.cells.SaveFormat.PDF, "pdf");
}
case "PPT" : {
return SwitchFile(file, com.aspose.cells.SaveFormat.PPTX, "pptx");
}
case "HTML" : {
return SwitchFile(file, com.aspose.cells.SaveFormat.HTML, "html");
}
case "JSON" : {
return SwitchFile(file, com.aspose.cells.SaveFormat.JSON, ".json");
}
case "MARKDOWN" : {
return SwitchFile(file, com.aspose.cells.SaveFormat.MARKDOWN, "md");
}
/***************** 图片类型 (注意图片格式的默认只转换第一个 Sheet1)*********************/
case "PNG" : {
return SwitchFile(file, com.aspose.cells.SaveFormat.PNG, "png");
}
case "JPG" : {
return SwitchFile(file, com.aspose.cells.SaveFormat.JPG, "jpg");
}
case "BMP" : {
return SwitchFile(file, com.aspose.cells.SaveFormat.BMP, "bmp");
}
case "CSV" : {
return SwitchFile(file, com.aspose.cells.SaveFormat.CSV, "csv");
}
case "SVG" : {
return SwitchFile(file, com.aspose.cells.SaveFormat.SVG, "svg");
}
// 好像有问题,有需要大家自己调试一下
// case "XML" : {
// return SwitchFile(file, com.aspose.cells.SaveFormat.XML, "xml");
// }
default:{}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private String SwitchFile(MultipartFile file, int saveFormat, String suffix) {
String url = "";
try {
long old = System.currentTimeMillis();
String fileName = UUID.randomUUID() + "." + suffix;
String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
FileOutputStream os = new FileOutputStream(filePath);
//加载源文件数据
Workbook excel = new Workbook(file.getInputStream());
//设置转换文件类型并转换
excel.save(os, saveFormat);
os.close();
File outputfile = new File(filePath);
url = ossUpLoadTools.uploadOssFile(fileName, outputfile);
outputfile.delete();
long now = System.currentTimeMillis();
log.info("共耗时:" + ((now - old) / 1000.0) + "秒");
} catch (Exception e) {
e.printStackTrace();
}
return url;
}
四、Word相关操作
1.引入相关依赖
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-words</artifactId>
<version>23.1</version>
</dependency>
2.关键代码
@Override
public String wordToFile(MultipartFile file, String type) {
String checkType = FilenameUtils.getExtension(file.getOriginalFilename());
if (!"doc".equals(checkType) && !"docx".equals(checkType)) {
throw new ServiceException(1, "输入文件不是Word文件!");
}
try {
switch (type.toUpperCase()) {
case "TEXT" : {
return switchFile(file, SaveFormat.TEXT, "txt");
}
case "PDF" : {
return switchFile(file, com.aspose.words.SaveFormat.PDF, "pdf");
}
/*************** 需要操作每一页Word文件,一般Word类的直接电脑操作,应该用不上************/
// case "PNG" : {
// return switchFile(file, com.aspose.words.SaveFormat.PNG, "png");
// }
// case "JPG" : {
// return switchFile(file, com.aspose.words.SaveFormat.JPEG, "jpg");
// }
default:{}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private String switchFile(MultipartFile file, int saveFormat, String suffix){
String url = "";
try {
long old = System.currentTimeMillis();
// 输出路径
String fileName = UUID.randomUUID() + "." + suffix;
String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
FileOutputStream os = new FileOutputStream(filePath);
com.aspose.words.Document doc = new com.aspose.words.Document(file.getInputStream());
doc.save(os, saveFormat);
os.close();
File outputfile = new File(filePath);
url = ossUpLoadTools.uploadOssFile(fileName, outputfile);
outputfile.delete();
long now = System.currentTimeMillis();
log.info("共耗时:" + ((now - old) / 1000.0) + "秒");
}catch (Exception e) {
e.printStackTrace();
}
return url;
}
五、PPT相关操作
1.引入相关依赖
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-slides</artifactId>
<version>23.1</version>
</dependency>
2.关键部分代码
@Override
public String PptToFile(MultipartFile file, String type) {
// 获取文件后缀名
String checkType = FilenameUtils.getExtension(file.getOriginalFilename());
if (!"ppt".equals(checkType) && !"pptx".equals(checkType)) {
throw new ServiceException(1, "输入文件不是PPT文件!");
}
try {
switch (type.toUpperCase()) {
case "HTML" : {
return SwitchFile(file, com.aspose.slides.SaveFormat.Html, "html");
}
case "HTML5" : {
return SwitchFile(file, com.aspose.slides.SaveFormat.Html5, "html");
}
case "PDF" : {
return SwitchFile(file, com.aspose.slides.SaveFormat.Pdf, "pdf");
}
default:{}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private String SwitchFile(MultipartFile file, int saveFormat, String suffix) {
String url = "";
try {
long old = System.currentTimeMillis();
String fileName = UUID.randomUUID() + "." + suffix;
String filePath = ossUpLoadTools.getSavePath() + "/" + fileName;
FileOutputStream os = new FileOutputStream(filePath);
//加载源文件数据
Presentation ppt = new Presentation(file.getInputStream());
//设置转换文件类型并转换
ppt.save(os, saveFormat);
os.close();
File outputfile = new File(filePath);
url = ossUpLoadTools.uploadOssFile(fileName, outputfile);
// 删除临时文件
outputfile.delete();
long now = System.currentTimeMillis();
log.info("共耗时:" + ((now - old) / 1000.0) + "秒");
return url;
}catch (IOException e) {
e.printStackTrace();
}
return url;
}
六、同时我还找到了一个几乎所有文件转换图片的工具类,被我稍作修改,就可以实现文件转图片,返回阿里云图片的储存地址集合啦
七、演示(演示有两个意思一下,别的大家自行测试)
1.PDF转Word
我有一个 cs.pdf 的PDF文件,通过调用PDF 转其他文件的接口,将其转换为 Wprd 形式
通过访问返回的地址就可以发现,文件已经被转换为Word格式的文件啦~
用Aspose-Java免费实现 PDF、Word、Excel、Word互相转换并将转换过得文件上传OSS,返回转换后的文件路径的更多相关文章
- Java 实现文件上传、下载、打包、文件copy、文件夹copy。
文件and文件夹copy package org.test; import java.io.*; public class FileCopy { /** * 复制单个文件 * * @param old ...
- 【java】[文件上传jar包]commons-fileUpload组件解决文件上传(文件名)乱码问题
response.setContentType("text/html; charset=UTF-8"); Boolean isMultipart = ServletFileUpl ...
- Java Web文件上传原理分析(不借助开源fileupload上传jar包)
Java Web文件上传原理分析(不借助开源fileupload上传jar包) 博客分类: Java Web 最近在面试IBM时,面试官突然问到:如果让你自己实现一个文件上传,你的代码要如何写,不 ...
- java大文件上传解决方案
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...
- 求超大文件上传方案( Java )
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...
- 【Java EE 学习 72 上】【数据采集系统第四天】【增加调查logo】【文件上传】【动态错误页指定】【上传限制】【国际化】
增加logo的技术点:文件上传,国际化 文件上传的功能在struts2中是使用文件上传拦截器完成的. 1.首先需要在页面上添加一个文件上传的超链接. 点击该超链接能够跳转到文件上传页面.我给该表单页面 ...
- Java FTPClient实现文件上传下载
在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件 ...
- JAVA Web 之 struts2文件上传下载演示(二)(转)
JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...
- Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题 swfUpload多文件上传
Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题(转) 我们都知道普通的文件上传是通过表单进行文件上传的,还不能达到异步上传的目的.通过使用某些技术手段,比如jqu ...
- Java实现文件上传
最近自己在做一个小系统玩的时候涉及到了文件的上传,于是在网上找到Java上传文件的方案,最后确定使用common-fileupload实现上传操作. 需求说明 用户添加页面有一个“上传”按钮,点击按钮 ...
随机推荐
- Angular Material TreeTable Component 使用教程
一. 安装 npm i ng-material-treetable --save npm i @angular/material @angular/cdk @angular/animations -- ...
- cesium 3d tileset 问题总结
Cesium 3d Tileset 中 i3dm 中存储的模型坐标为笛卡尔坐标,占四个字节,因为地球半径比较大,所以只有整数位和小数点后1位有效,因此会损失精度.对于要求精度比较高的模型,会发现位置偏 ...
- Go_day06
Go基础语法 错误和异常 什么是错误error 错误是指可鞥出现问题的地方出现了问题,这种情况在预料之中 func main() { //打开一个文件 file, err := os.Open(&qu ...
- el-admin角色编辑功能详解
1.首先el-admin中的编辑和删除功能重新写成为了一个组件 data和permission都是父组件向子组件传参.data传的是当前表格中选中行的这条数据,permission是定义的一个对象. ...
- 基于声网 Flutter SDK 实现多人视频通话
前言 本文是由声网社区的开发者"小猿"撰写的Flutter基础教程系列中的第一篇.本文除了讲述实现多人视频通话的过程,还有一些 Flutter 开发方面的知识点.该系列将基于声网 ...
- 当基础设施故障后,声网 SD-RTN™ 如何保障 RTE 服务的高可用性
云计算的出现为企业的管理.业务开展.资源整合等带来了极大的便利性,也是数字化建设的核心基建之一,然而局部宕机或者大面积宕机事件对于云厂商来说却也无法避免,全球领先的计算平台也不例外.例如,美国东部时间 ...
- 虚拟办公、虚拟展会、虚拟偶像,RTE+XR 还能做什么?
2021年6月10日,HTC VIVE 在北京举办以"融合·至界"为主题的新品体验会暨开发者客户大会.近 300 位 XR 行业精英齐聚一堂,共同见证了 HTC VIVE 全能 V ...
- 一次spark任务提交参数的优化
起因 新接触一个spark集群,明明集群资源(core,内存)还有剩余,但是提交的任务却申请不到资源. 分析 环境 spark 2.2.0 基于yarn集群 参数 spark任务提交参数中最重要的几个 ...
- Kingpin Private Browser - 隐私保护浏览器,隐身模式、广告拦截做你的私人浏览器
Kingpin Private Browser 是一个功能齐全的浏览器,隐身模式和广告拦截总是启用.它不会记住历史记录.密码或cookie.默认情况下,浏览器使用谷歌搜索(您可以在设置中将其更改为Du ...
- .NetCore中使用分布式事务DTM的二阶段消息
一.概述 二阶段消息是DTM新提出的,可以完美代替现有的事务消息和本地消息表架构.无论从复杂度.性能.便利性还是代码量都是完胜现有的方案. 相比现有的消息架构借助于各种消息中间件比如RocketMQ等 ...