近有一個業務是前端要上傳word格式的文稿,然后用戶上傳完之后,可以用瀏覽器直接查看該文稿,并且可以在富文本框直接引用該文稿,所以上傳word文稿之后,后端保存到db的必須是html格式才行,所以涉及到word格式轉html格式。
通過調查,這個word和html的處理,有兩種方案,方案1是前端做這個轉換。方案2是把word文檔上傳給后臺,后臺轉換好之后再返回給前端。至于方案1,看到大家的反饋都說很多問題,所以就沒采用前端轉的方案,最終決定是后端轉化為html格式并返回給前段預覽,待客戶預覽的時候,確認格式沒問題之后,再把html保存到后臺(因為word涉及到的格式太多,比如圖片,visio圖,表格,圖片等等之類的復雜元素,轉html的時候,可能會很多格式問題,所以要有個預覽的過程)。
對于word中普通的文字,問題倒不大,主要是文本之外的元素的處理,比如圖片,視頻,表格等。針對我本次的文章,只處理了圖片,處理的方式是:后臺從word中找出圖片(當然引入的jar包已經帶了獲取word中圖片的功能),上傳到服務器,拿到絕對路徑之后,放入到html里面,這樣,返回給前端的html內容,就可以直接預覽了。
maven引入相關依賴包如下:
<poi-scratchpad.version>3.14</poi-scratchpad.version>
<poi-ooxml.version>3.14</poi-ooxml.version>
<xdocreport.version>1.0.6</xdocreport.version>
<poi-ooxml-schemas.version>3.14</poi-ooxml-schemas.version>
<ooxml-schemas.version>1.3</ooxml-schemas.version>
<jsoup.version>1.11.3</jsoup.version>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>${poi-scratchpad.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi-ooxml.version}</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>xdocreport</artifactId>
<version>${xdocreport.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>${poi-ooxml-schemas.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>${ooxml-schemas.version}</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>${jsoup.version}</version>
</dependency>
word轉html,對于word2003和word2007轉換方式不一樣,因為word2003和word2007的格式不一樣,工具類如下:
使用方法如下:
public String uploadSourceNews(MultipartFile file) {
String fileName = file.getOriginalFilename();
String suffixName = fileName.substring(fileName.lastIndexOf("."));
if (!".doc".equals(suffixName) && !".docx".equals(suffixName)) {
throw new UploadFileFormatException();
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMM");
String dateDir = formatter.format(LocalDate.now());
String directory = imageDir + "/" + dateDir + "/";
String content = null;
try {
InputStream inputStream = file.getInputStream();
if ("doc".equals(suffixName)) {
content = wordToHtmlUtil.Word2003ToHtml(inputStream, imageBucket, directory, Constants.HTTPS_PREFIX + imageVisitHost);
} else {
content = wordToHtmlUtil.Word2007ToHtml(inputStream, imageBucket, directory, Constants.HTTPS_PREFIX + imageVisitHost);
}
} catch (Exception ex) {
logger.error("word to html exception, detail:", ex);
return null;
}
return content;
}
關于doc和docx的一些存儲格式介紹:
docx 是微軟開發的基于 xml 的文字處理文件。docx 文件與 doc 文件不同, 因為 docx 文件將數據存儲在單獨的壓縮文件和文件夾中。早期版本的 microsoft office (早于 office 2007) 不支持 docx 文件, 因為 docx 是基于 xml 的, 早期版本將 doc 文件另存為單個二進制文件。
DOCX is an XML based word processing file developed by Microsoft. DOCX files are different than DOC files as DOCX files store data in separate compressed files and folders. Earlier versions of Microsoft Office (earlier than Office 2007) do not support DOCX files because DOCX is XML based where the earlier versions save DOC file as a single binary file.
可能你會問了,明明是docx結尾的文檔,怎么成了xml格式了?
很簡單:你隨便選擇一個docx文件,右鍵使用壓縮工具打開,就能得到一個這樣的目錄結構:
所以你以為docx是一個完整的文檔,其實它只是一個壓縮文件。
參考:
https://www.cnblogs.com/ct-csu/p/8178932.html
AVA中將WORD轉換為HTML導入到WANGEDITOR編輯器中(解決圖片問題,樣式,非常完美),wangEditor如何導入word文檔,如何實現導入WORD文檔到WANGEDITOR編輯器中?WANGEDITOR導入WORD文檔 WANGEDITOR WORD導入插件,HTML富文本編輯器導入WORD,Web富文本編輯器導入WORD,WANGEDITOR富文本編輯器導入WORD,WANGEDITOR導入WORD,WANGEDITORWORD導入編輯,wangEditor集成word導入功能,
后端是用的JAVA,SpringBoot框架,實際上前端在集成的時候是不關心后端具體是用什么語言實現的。
它這個版本有幾個wangEditor3,wangEditor4,wangEditor5,好用的是就3和4,5不支持插入HTML。但是用戶用插入HTML這個功能用的比較多。
vue-cli-wangEditor3,vue3-cli-wangEditor4集成word導入功能。在VUE框架下面集成了WORD導入功能。
用戶選擇word文件后,自動轉換成html,自動將word里面的圖片上傳到服務器中,自動將HTML添加到編輯器中。
主要的方案就是提供一個轉換接口,轉換接口使用RESTful協議,這樣的話兼容性更好一點,其它的平臺用起來的話更方便簡單一點,而且測試起來也方便。
現有項目需要為TinyMCE增加導入word文件的功能,導入后word文件里面的圖片自動上傳到服務器中,返回圖片和文字HTML,word里面的文本樣式保留
用戶一般在發新聞和發文章時用到,算是一個高頻使用功能,用戶體驗上來講確實是很好,和以前的發新聞或者發文章的體驗比起來要方便許多,用戶用的更爽。
1.下載示例
https://gitee.com/xproer/zyoffice-vue3-cli-wang-editor4
2.引入組件
3.添加按鈕
4.配置轉換接口
效果
開發文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAwsDazDKJ
產品比較:https://drive.weixin.qq.com/s?k=ACoAYgezAAwh8oq8Zf
產品源代碼:https://drive.weixin.qq.com/s?k=ACoAYgezAAwjJM8412
報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwsfyDdrf
近在工作中遇到一個bug,將word轉換成html,轉換成功之后在瀏覽器中打開其中圖片不顯示,使用img標簽,src指定圖片相對地址又是能顯示的,排除圖片問題。
網上能搜索到的demo
打開轉碼之后的html代碼發現,生成的是vml圖片標簽,這個在IE9以后就不支持了,更別說現在的主流瀏覽器了。
生成的html中使用的是vml標簽
將這個跟大佬分析分析,各種文檔一查,咔咔咔大致分析出問題所在。原來jacob使用的是word本身自帶的功能,相當于把word打開另存為html,于是手動將word轉為html試了一下,果然效果與代碼轉換一致,這時候注意到word另存為時有一個web選項,里面有個使用vml渲染圖片默認是選中的,去掉這個選項,再次生成,圖片正常顯示。
到這里基本已經確定了問題的解決思路,另存為時不勾選這個選項,那么問題來了,怎么利用jacob操作另存為時去掉這個選項呢,想去搜搜看jacob相關的文檔,結果不知道是不是因為這個很老了,網上大多數都是demo,根本沒有相關的文檔可看,Github上也是只言片語,根本無從查起。
jacob github 地址:https://github.com/joval/jacob
微軟官網文檔
官方文檔連接:https://docs.microsoft.com/zh-cn/office/vba/api/word.weboptions.relyonvml
微軟官網查詢相關文檔,發現其實是可以關閉的,于是代碼變成這樣
關閉relyOnVml
再次運行程序,這次轉出來的html就能在瀏覽器打開了。
總結,在這次解決問題的過程中,學會了往更深層次去想問題,找對方向,迎難而上。
記錄一下這個問題解決的經驗,也希望能幫到同樣遇到這個問題的人。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。