嘿嘿嘿、嘿嘿,俺又回来了!

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.引入相关依赖

 <dependency>

    <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,返回转换后的文件路径的更多相关文章

  1. Java 实现文件上传、下载、打包、文件copy、文件夹copy。

    文件and文件夹copy package org.test; import java.io.*; public class FileCopy { /** * 复制单个文件 * * @param old ...

  2. 【java】[文件上传jar包]commons-fileUpload组件解决文件上传(文件名)乱码问题

    response.setContentType("text/html; charset=UTF-8");  Boolean isMultipart = ServletFileUpl ...

  3. Java Web文件上传原理分析(不借助开源fileupload上传jar包)

    Java Web文件上传原理分析(不借助开源fileupload上传jar包) 博客分类: Java Web   最近在面试IBM时,面试官突然问到:如果让你自己实现一个文件上传,你的代码要如何写,不 ...

  4. java大文件上传解决方案

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  5. 求超大文件上传方案( Java )

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  6. 【Java EE 学习 72 上】【数据采集系统第四天】【增加调查logo】【文件上传】【动态错误页指定】【上传限制】【国际化】

    增加logo的技术点:文件上传,国际化 文件上传的功能在struts2中是使用文件上传拦截器完成的. 1.首先需要在页面上添加一个文件上传的超链接. 点击该超链接能够跳转到文件上传页面.我给该表单页面 ...

  7. Java FTPClient实现文件上传下载

    在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件 ...

  8. JAVA Web 之 struts2文件上传下载演示(二)(转)

    JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...

  9. Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题 swfUpload多文件上传

    Java 利用SWFUpload多文件上传 session 为空失效,不能验证的问题(转) 我们都知道普通的文件上传是通过表单进行文件上传的,还不能达到异步上传的目的.通过使用某些技术手段,比如jqu ...

  10. Java实现文件上传

    最近自己在做一个小系统玩的时候涉及到了文件的上传,于是在网上找到Java上传文件的方案,最后确定使用common-fileupload实现上传操作. 需求说明 用户添加页面有一个“上传”按钮,点击按钮 ...

随机推荐

  1. springboot项目导出excel实现

    参见:https://blog.csdn.net/duli_0105/article/details/102809936

  2. 拖拽改变div宽、高(转)

    $(function () { //绑定需要拖拽改变大小的元素对象 bindResize(document.getElementById('test')); }); function bindResi ...

  3. Unity各种功能实现之一:对话系统

    最近根据网上的教程学习了一下Unity中的对话系统,将其中一些关键点记录下来作为参考,以后可在此基础上添加更多功能. 1.UI部分的设置. 对话框由一个panel下面的text和image组成.can ...

  4. vs2019升级到16.8编译报razortaghelper 任务意外失败的错误

    为了体验.net 5,把vs升级到了最新版本16.8,然后编译原来的项目(.net core 2.2),报了以下错误: 解决方法如下: 删除C:\Program Files\dotnet\sdk\Nu ...

  5. 实验六 开源控制器实践——RYU

    (一)基本要求 搭建SDN拓扑,协议使用Open Flow 1.0,并连接Ryu控制器,通过Ryu的图形界面查看网络拓扑. 阅读Ryu文档的The First Application一节,运行当中的L ...

  6. Azure DevOps - 团队成员有权限却无法看到 Azure Repo

    ​ 我们需要进入Organization Settings, 在Users中找到相关的用户,确认用户Access Level是否为stakeholder. ​ 点击最右侧三个点,Change Acce ...

  7. Java学习小总结它又又又又来啦!

    又到了输出总结的时候啦,话不多说,直接开始输出! 一.final final修饰符的主要作用就是强调它所修饰的板块的"最后"性: 若是修饰成员方法:那么成员方法不可以再被重写: 若 ...

  8. 基于Sekiro的jsRPC的使用和安装

    什么是jsRPC 说实话在介绍 JSRPC 我向大家推荐一个库 Selenium-wire 感觉和JSrpc的原理很像 RPC指远程过程调用,APP里面的RPC大家比较熟悉了. 那什么是jsRPC,顾 ...

  9. 2021 技术展望丨AV1 在 RTC 应用实践中的现状与展望

    线上会议.在线教育.电商直播等多个场景的兴起,也使得实时互动技术从幕后走到台前,得到了更多人的关注.编解码.网络传输.计算机视觉等 RTE 相关的一系列技术也正焕发出更强的生命力.2021 年,在深度 ...

  10. LeetcodePractice-数组

    目录 88. 合并两个有序数组 思路解析 字节&1. 两数之和 思路解析 腾讯&15. 三数之和 思路解析 18. 四数之和 思路解析 解释下,tmpSum为什么用int不行,需要用i ...