用Aspose-Java免费实现 PDFWordExcelWord互相转换并将转换过得文件上传OSS,返回转换后的文件路径
Posted 慢时光~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Aspose-Java免费实现 PDFWordExcelWord互相转换并将转换过得文件上传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格式的文件啦~
本文来自博客园,作者:Tom-shushu,转载请注明原文链接:https://www.cnblogs.com/Tom-shushu/p/17367203.html
老板说“把系统升级到https”,我用一个脚本实现了,而且永久免费!
正文
现在很多站长都会考虑将自己的站点从http升级到https,不仅是基于安全的考虑,有的也是因为第三方平台的限制,如谷歌浏览器会将http站点标记为不安全的站点,微信平台要求接入的微信小程序必须使用https等。
那如何将一个http站点升级为https站点呢?
http与https的区别
为了数据传输的安全,https在http的基础上加入了ssl协议,ssl协议依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。要想将http升级为https,只需要给http站点增加一个CA证书即可。
目前获取CA证书有两种途径:
- 购买收费的CA证书
- 获取免费的证书
收费的CA证书各大服务提供商都有卖,如阿里云、腾讯云等。
【系统架构】如何升级到https?一个脚本帮你搞定,且永久免费
收费的证书不便宜,从阿里云官方网站看,它的价格可以从几千元到上万元不等。
《2020最新Java基础精讲视频教程和学习路线!》
【系统架构】如何升级到https?一个脚本帮你搞定,且永久免费
这对于小公司平台,甚至是个人站点来说,是一个不小的开支。
Letsencrypt是一个免费、自动化和开放的证书颁发机构,其颁发的证书一次有效期为三个月,但是只要能持续更新,基本可以永久使用。
今天推荐的这个脚本acme.sh,实现了 acme 协议, 可以帮你持续自动从Letsencrypt更新CA证书。下载地址如下:
github.com/Neilpang/ac…
安装 acme.sh
安装acme.sh很简单,一个命令即可:
curl get.acme.sh | sh
普通用户和 root 用户都可以安装使用。安装过程进行了以下几步:
1、把acme.sh安装到你的home目录下:
~/.acme.sh/
并创建 一个 bash 的 alias,方便你使用:alias acme.sh=~/.acme.sh/acme.sh
2、自动为你创建 cronjob,每天 0:00 点自动检测所有的证书。如果快过期了,需要更新,则会自动更新证书,安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录中:~/.acme.sh/
生成证书
acme.sh 实现了 acme 协议支持的所有验证协议, 一般有两种方式验证:http 和 dns 验证。
1、http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证,然后就可以生成证书了。
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
acme.sh 会全自动的生成验证文件, 并放到网站的根目录,然后自动完成验证。最后会聪明的删除验证文件,整个过程没有任何副作用。
如果你用的是apache服务器,acme.sh 还可以智能的从 apache的配置中自动完成验证,你不需要指定网站根目录:
acme.sh --issue -d mydomain.com --apache
如果你用的是nginx服务器,或者反代,acme.sh还可以智能的从 nginx的配置中自动完成验证,你不需要指定网站根目录:
acme.sh --issue -d mydomain.com --nginx
注意:无论是 apache 还是 nginx 模式,acme.sh在完成验证之后,会恢复到之前的状态,都不会私自更改你本身的配置。好处是你不用担心配置被搞坏,但也有一个缺点,你需要自己配置 ssl 的配置,否则,只能成功生成证书,你的网站还是无法访问https。但是为了安全,你还是自己手动改配置吧。
如果你还没有运行任何 web 服务,80 端口是空闲的, 那么 acme.sh 还能假装自己是一个webserver, 临时听在80 端口,完成验证:
acme.sh --issue -d mydomain.com --standalone
2、dns 方式,在域名上添加一条 txt 解析记录,验证域名所有权。
这种方式的好处是,你不需要任何服务器,不需要任何公网 ip,只需要 dns 的解析记录即可完成验证。不过,坏处是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
acme.sh --issue --dns -d mydomain.com
然后,acme.sh 会生成相应的解析记录显示出来,你只需要在你的域名管理面板中添加这条 txt 记录即可。
等待解析完成之后, 重新生成证书:
acme.sh --renew -d mydomain.com
注意:第二次这里用的是 --renew
dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证。
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成。
copy/安装 证书
前面证书生成以后,接下来需要把证书 copy 到真正需要用它的地方。
注意:默认生成的证书都放在安装目录下:~/.acme.sh/,请不要直接使用此目录下的文件。例如,不要直接让 nginx/apache 的配置文件使用这下面的文件。这里面的文件都是内部使用,而且目录结构可能会变化。
正确的使用方法是使用 --installcert 命令,并指定目标位置,然后证书文件会被copy到相应的位置,例如:
acme.sh --installcert -d <domain>.com
--key-file /etc/nginx/ssl/<domain>.key
--fullchain-file /etc/nginx/ssl/fullchain.cer
--reloadcmd "service nginx force-reload"
复制代码
一个小提醒,这里用的是 service nginx force-reload,不是 service nginx reload,据测试, reload并不会重新加载证书,所以用的 force-reload。
Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer,而非 /etc/nginx/ssl/.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。
--installcert命令可以携带很多参数,来指定目标文件。并且可以指定 reloadcmd, 当证书更新以后,reloadcmd会被自动调用,让服务器生效。
值得注意的是,这里指定的所有参数都会被自动记录下来,并在将来证书自动更新以后,被再次自动调用。
更新证书
目前证书在 60 天以后会自动更新,你无需任何操作。今后有可能会缩短这个时间,不过都是自动的,你不用关心。
更新 acme.sh
目前由于 acme 协议和 Letsencrypt CA 都在频繁的更新,因此 acme.sh 也经常更新以保持同步。
升级 acme.sh 到最新版 :
acme.sh --upgrade
如果你不想手动升级, 可以开启自动升级:
acme.sh --upgrade --auto-upgrade
之后, acme.sh 就会自动保持更新了。
你也可以随时关闭自动更新:
acme.sh --upgrade --auto-upgrade 0
出错怎么办:
如果出错, 请添加 debug log:
acme.sh --issue ..... --debug
或者:
acme.sh --issue ..... --debug 2
链接:https://juejin.cn/post/686583...
以上是关于用Aspose-Java免费实现 PDFWordExcelWord互相转换并将转换过得文件上传OSS,返回转换后的文件路径的主要内容,如果未能解决你的问题,请参考以下文章
老板说“把系统升级到https”,我用一个脚本实现了,而且永久免费!