解决jodconverter 2.2.1 版本不支持docx、xlsx、pptx 转换成PDF格式异常
文章目錄
- 一、基礎對比
- 1.版本對比
- 2.異常現象
- 二、分析定位
- 2.1. 找異常輸出處
- 2.2. 找異常源頭
- 2.3. api源頭
- 三、實現流程
- 3.1. 思路
- 3.2. 新建包重寫類
- 3.3. 完整類
一、基礎對比
1.版本對比
| .doc | .docx |
| .xls | .xlsx |
| .ppt | .pptx |
2.異常現象
搭建好 SpringBoot + OpenOffice + jodconverter2.2.1 后,轉換07版本及高版本(.docx/.xlsx/.pptx)時,轉換 docx、xlsx、pptx 時報了以下錯誤:
SocketOpenOfficeConnection : connected
java.lang.IllegalArgumentException: inputFormat is null at com.artofsolving.jodconverter.openoffice.converter.AbstractOpenOfficeDocumentConverter.ensureNotNull(AbstractOpenOfficeDocumentConverter.java:113)
二、分析定位
2.1. 找異常輸出處
找到輸出異常的代碼處
在AbstractOpenOfficeDocumentConverter 抽象類中的79行代碼的convert方法處輸出的異常
2.2. 找異常源頭
為什么會輸出這個異常信息?
從上圖中可以看出由于inputFormat參數為null,導致inputFormat is null 校驗異常,進一步分析,既然是由于參數為null觸發的這個異常,那這個參數到底從獲取的呢?對吧
從上圖中可以看出,這個類的第95行獲取的對吧,那就好辦了,進入源碼,一探究竟。
從圖中可以看到BasicDocumentFormatRegistry抽象類的getFormatByFileExtension方法,功能就是提供文件擴展名
從上圖可以看出,支持文件格式有21種,但是,咱們傳入的文件類型xlsx、docx、pptx這3種格式,均不在這21種格式之內,因此,導致返回的sourceFormat參數是null
2.3. api源頭
小伙伴們現在跟著我考慮以下二個問題哈?
問題1:
是由于以前默認提供了21種文件格式,不包括07版本及高版本的文件格式,但是,支持轉換xlsx、docx、pptx文件格式的文件?
問題2:只支持默認的21種文件格式的文件轉換呢?
下面小伙伴們跟著我一起來探究一下真相到底如何?
咱們先假設:預期結果問題1
那咱們又該如何解決呢?找源頭
從圖中可以看出下面獲取文件后綴名和DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry();有關系,是最開始的地方,對吧!進入源碼一探究竟
從山圖中可以看出DefaultDocumentFormatRegistry定義了默認支持的后綴名對吧。不僅如此,還extends BasicDocumentFormatRegistry,進入BasicDocumentFormatRegistry
發現又回到了剛才獲取文件后綴名的地方,對吧!
這個校驗是由于傳入的文件類型,不在默認21種文件格式之內,才會被觸發對吧?
咱們需要想個辦法,讓他跳過這個校驗,既然默認提供的21種格式,又不能新增文件格式,能不能讓咱們傳入的格式在默認提供的21種格式之內呢?可以的
當傳入的參數為xlsx、docx、pptx文件格式時,返回的對應的文件格式為xls、doc、ppt格式后綴名,就可實現了對吧!
三、實現流程
3.1. 思路
既然DefaultDocumentFormatRegistry繼承BasicDocumentFormatRegistry類,那咱們就重寫BasicDocumentFormatRegistry類,在判斷后綴名之前對傳入的文件后綴名做處理“返回的對應的文件格式為xls、doc、ppt格式后綴名”
3.2. 新建包重寫類
新建com.artofsolving.jodconverter重寫BasicDocumentFormatRegistry類
3.3. 完整類
package com.artofsolving.jodconverter;import java.util.ArrayList; import java.util.Iterator; import java.util.List;/*** @description: 重寫 BasicDocumentFormatRegistry 文檔格式* @Author: gblfy* @Data: 2021-10-27**/ public class BasicDocumentFormatRegistry implements DocumentFormatRegistry {private List/* <DocumentFormat> */ documentFormats = new ArrayList();public void addDocumentFormat(DocumentFormat documentFormat) {documentFormats.add(documentFormat);}protected List/* <DocumentFormat> */ getDocumentFormats() {return documentFormats;}/*** @param extension the file extension* @return the DocumentFormat for this extension, or null if the extension* is not mapped*/@Overridepublic DocumentFormat getFormatByFileExtension(String extension) {if (extension == null) {return null;}//將文件名后綴統一轉化if (extension.indexOf("doc") >= 0) {extension = "doc";}if (extension.indexOf("ppt") >= 0) {extension = "ppt";}if (extension.indexOf("xls") >= 0) {extension = "xls";}String lowerExtension = extension.toLowerCase();for (Iterator it = documentFormats.iterator(); it.hasNext(); ) {DocumentFormat format = (DocumentFormat) it.next();if (format.getFileExtension().equals(lowerExtension)) {return format;}}return null;}@Overridepublic DocumentFormat getFormatByMimeType(String mimeType) {for (Iterator it = documentFormats.iterator(); it.hasNext(); ) {DocumentFormat format = (DocumentFormat) it.next();if (format.getMimeType().equals(mimeType)) {return format;}}return null;} }總結
以上是生活随笔為你收集整理的解决jodconverter 2.2.1 版本不支持docx、xlsx、pptx 转换成PDF格式异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Typora 常用技巧
- 下一篇: 使用canal实现MySQL 8 增量同