日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

解决jodconverter 2.2.1 版本不支持docx、xlsx、pptx 转换成PDF格式异常

發布時間:2024/9/27 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决jodconverter 2.2.1 版本不支持docx、xlsx、pptx 转换成PDF格式异常 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

          • 一、基礎對比
            • 1.版本對比
            • 2.異?,F象
          • 二、分析定位
            • 2.1. 找異常輸出處
            • 2.2. 找異常源頭
            • 2.3. api源頭
          • 三、實現流程
            • 3.1. 思路
            • 3.2. 新建包重寫類
            • 3.3. 完整類

一、基礎對比
1.版本對比
03版本office07版本及高版本office
.doc.docx
.xls.xlsx
.ppt.pptx
2.異?,F象

搭建好 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格式异常的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。