用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实现上传操作. 需求说明 用户添加页面有一个“上传”按钮,点击按钮 ...
随机推荐
- mysql-连接路径url参数(随时补充及改错)
1.基本驱动连接url jdbc:mysql://127.0.0.1:3306/demo 2.参数 参数 缺省值 说明 粘贴 useSSL 是否使用ssl加密连接mysql,一般指定false就行,除 ...
- c#和JS数据加密(转)
前台提交按纽 后以赋值后台取值 Base64编解码 C# /* 编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码. 它将需要编码的数据拆分成字节数组. ...
- vs调试导入功能时莫名自动结束调试
新装了vs2022,默认下图所示的地方打勾,导致调试文件导入功能时触发了自动结束调试,真是坑爹~~
- 【BUUCTF】强网杯 2019随便注1 write up
输入万能密码1' or 1=1# ,判断存在sql注入, SQL注入的万能密码实际上是利用了网址后台的漏洞,打开下面的网址不用密码和账号也可以登录后台. 万能密码原理: 万能密码能够绕过sql检测,在 ...
- Python学习笔记-argparse模块
Python学习笔记-argparse模块 optparseargparse 昨天学习了一个简单的端口扫描器的脚本,其中涉及到了optparse模块,网上关于此模块的介绍已有很多,但这个模块已经不更新 ...
- fatal: unable to access 'https://github.com/github-eliviate/papers.git/': Failed to connect to github.com port 443 after 21107 ms: Timed out
fatal: unable to access 'https://github.com/github-eliviate/papers.git/': Failed to connect to githu ...
- 2022中职组网络空间安全 A模块
A-1任务一 登录安全加固 1.密码策略(Windows,Linux) 主要是针对windows和Linux的系统加固,类似于运维的题目 a.设置最短密码长度为15: 这里并没有说明具体是Window ...
- 集训第二周计划:把cf近期的div2除了最后一题给切完
太菜了太菜了,弄个训练计划. 晚上没事干的时候我想把博客园皮肤改一下,搜着搜着不知道怎么回事点进去一些竞赛选手的博客,比如这个 https://www.cnblogs.com/soda-ma/p/13 ...
- IntelliJ IDEA 下载安装及配置使用教程(图文步骤详解)
前言 壹哥在前面的文章中,带大家下载.安装.配置了Eclipse这个更好用的IDE开发工具,并教会了大家如何在Eclipse中进行项目的创建和代码编写.运行.但是实际上,在各种IDE开发工具中,Ecl ...
- python + BeautifulSoup + selenium 实现爬取中医智库的古籍分类的数据
爬取内容为 该图片下的七个分类, 然后对应的每个种类的书本信息(摘要和目录) 效果为 代码如下 import requests from bs4 import BeautifulSoup import ...