整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          細(xì)品pdf.js實(shí)踐解決含水印、電子簽章問題「Vue

          細(xì)品pdf.js實(shí)踐解決含水印、電子簽章問題「Vue篇」


          者:jerryWu

          轉(zhuǎn)發(fā)連接:https://juejin.im/post/5ec48f84e51d45788266753a

          接:https://juejin.im/book/5b936540f265da0a9624b04b

          《高性能網(wǎng)站建設(shè)指南》的作者 Steve Souders 曾在一篇博客中提到:

          我的大部分性能優(yōu)化工作都集中在 JavaScript 和 CSS 上,從早期的 Move Scripts to the Bottom 和 Put Stylesheets at the Top 規(guī)則。為了強(qiáng)調(diào)這些規(guī)則的重要性,我甚至說過,“JS 和 CSS 是頁面上最重要的部分”。

          幾個(gè)月后,我意識(shí)到這是錯(cuò)誤的。圖片才是頁面上最重要的部分。

          我關(guān)注 JS 和 CSS 的重點(diǎn)也是如何能夠更快地下載圖片。圖片是用戶可以直觀看到的。他們并不會(huì)關(guān)注 JS 和 CSS。確實(shí),JS 和 CSS 會(huì)影響圖片內(nèi)容的展示,尤其是會(huì)影響圖片的展示方式(比如圖片輪播,CSS 背景圖和媒體查詢)。但是我認(rèn)為 JS 和 CSS 只是展示圖片的方式。在頁面加載的過程中,應(yīng)當(dāng)先讓圖片和文字先展示,而不是試圖保證 JS 和 CSS 更快下載完成。

          這段話可謂字字珠璣。此外,雅虎軍規(guī)和 Google 官方的最佳實(shí)踐也都將圖片優(yōu)化列為前端性能優(yōu)化必不可少的環(huán)節(jié)——圖片優(yōu)化的優(yōu)先級(jí)可見一斑。

          就圖片這塊來說,與其說我們是在做“優(yōu)化”,不如說我們是在做“權(quán)衡”。因?yàn)槲覀円龅氖虑椋褪侨嚎s圖片的體積(或者一開始就選取體積較小的圖片格式)。但這個(gè)優(yōu)化操作,是以犧牲一部分成像質(zhì)量為代價(jià)的。因此我們的主要任務(wù),是盡可能地去尋求一個(gè)質(zhì)量與性能之間的平衡點(diǎn)。

          2019 年,圖片依然很大

          這里先給大家介紹 HTTP-Archive 這個(gè)網(wǎng)站,它會(huì)定期抓取 Web 上的站點(diǎn),并記錄資源的加載情況、Web API 的使用情況等頁面的詳細(xì)信息,并會(huì)對這些數(shù)據(jù)進(jìn)行處理和分析以確定趨勢。通過它我們可以實(shí)時(shí)地看到世界范圍內(nèi)的 Web 資源的統(tǒng)計(jì)結(jié)果。

          截止到 2018 年 8 月,過去一年總的 web 資源的平均請求體積是這樣的:

          而具體到圖片這一類的資源,平均請求體積是這樣的:

          當(dāng)然,隨著我們工程師在性能方面所做的努力越來越有成效,平均來說,不管是資源總量還是圖片體積,都在往越來越輕量的方向演化。這是一種值得肯定的進(jìn)步。

          但同時(shí)我們不得不承認(rèn),如圖所示的這個(gè)圖片體積,依然是太大了。圖片在所有資源中所占的比重,也足夠“觸目驚心”了。為了改變這個(gè)現(xiàn)狀,我們必須把圖片優(yōu)化提上日程。

          不同業(yè)務(wù)場景下的圖片方案選型

          時(shí)下應(yīng)用較為廣泛的 Web 圖片格式有 JPEG/JPG、PNG、WebP、Base64、SVG 等,這些格式都是很有故事的,值得我們好好研究一把。此外,老生常談的雪碧圖(CSS Sprites)至今也仍在一線的前端應(yīng)用中發(fā)光發(fā)熱,我們也會(huì)有所提及。

          不談業(yè)務(wù)場景的選型都是耍流氓。下面我們就結(jié)合具體的業(yè)務(wù)場景,一起來解開圖片選型的神秘面紗!

          前置知識(shí):二進(jìn)制位數(shù)與色彩的關(guān)系

          在計(jì)算機(jī)中,像素用二進(jìn)制數(shù)來表示。不同的圖片格式中像素與二進(jìn)制位數(shù)之間的對應(yīng)關(guān)系是不同的。一個(gè)像素對應(yīng)的二進(jìn)制位數(shù)越多,它可以表示的顏色種類就越多,成像效果也就越細(xì)膩,文件體積相應(yīng)也會(huì)越大。

          一個(gè)二進(jìn)制位表示兩種顏色(0|1 對應(yīng)黑|白),如果一種圖片格式對應(yīng)的二進(jìn)制位數(shù)有 n 個(gè),那么它就可以呈現(xiàn) 2^n 種顏色。

          JPEG/JPG

          關(guān)鍵字:有損壓縮、體積小、加載快、不支持透明

          JPG 的優(yōu)點(diǎn)

          JPG 最大的特點(diǎn)是有損壓縮。這種高效的壓縮算法使它成為了一種非常輕巧的圖片格式。另一方面,即使被稱為“有損”壓縮,JPG的壓縮方式仍然是一種高質(zhì)量的壓縮方式:當(dāng)我們把圖片體積壓縮至原有體積的 50% 以下時(shí),JPG 仍然可以保持住 60% 的品質(zhì)。此外,JPG 格式以 24 位存儲(chǔ)單個(gè)圖,可以呈現(xiàn)多達(dá) 1600 萬種顏色,足以應(yīng)對大多數(shù)場景下對色彩的要求,這一點(diǎn)決定了它壓縮前后的質(zhì)量損耗并不容易被我們?nèi)祟惖娜庋鬯煊X——前提是你用對了業(yè)務(wù)場景。

          使用場景

          JPG 適用于呈現(xiàn)色彩豐富的圖片,在我們?nèi)粘i_發(fā)中,JPG 圖片經(jīng)常作為大的背景圖、輪播圖或 Banner 圖出現(xiàn)。

          兩大電商網(wǎng)站對大圖的處理,是 JPG 圖片應(yīng)用場景的最佳寫照:

          打開淘寶首頁,我們可以發(fā)現(xiàn)頁面中最醒目、最龐大的圖片,一定是以 .jpg 為后綴的:

          京東首頁也不例外:

          使用 JPG 呈現(xiàn)大圖,既可以保住圖片的質(zhì)量,又不會(huì)帶來令人頭疼的圖片體積,是當(dāng)下比較推崇的一種方案。

          JPG 的缺陷

          有損壓縮在上文所展示的輪播圖上確實(shí)很難露出馬腳,但當(dāng)它處理矢量圖形Logo 等線條感較強(qiáng)、顏色對比強(qiáng)烈的圖像時(shí),人為壓縮導(dǎo)致的圖片模糊會(huì)相當(dāng)明顯。

          此外,JPEG 圖像不支持透明度處理,透明圖片需要召喚 PNG 來呈現(xiàn)。

          PNG-8 與 PNG-24

          關(guān)鍵字:無損壓縮、質(zhì)量高、體積大、支持透明

          PNG 的優(yōu)點(diǎn)

          PNG(可移植網(wǎng)絡(luò)圖形格式)是一種無損壓縮的高保真的圖片格式。8 和 24,這里都是二進(jìn)制數(shù)的位數(shù)。按照我們前置知識(shí)里提到的對應(yīng)關(guān)系,8 位的 PNG 最多支持 256 種顏色,而 24 位的可以呈現(xiàn)約 1600 萬種顏色。

          PNG 圖片具有比 JPG 更強(qiáng)的色彩表現(xiàn)力,對線條的處理更加細(xì)膩,對透明度有良好的支持。它彌補(bǔ)了上文我們提到的 JPG 的局限性,唯一的 BUG 就是體積太大

          PNG-8 與 PNG-24 的選擇題

          什么時(shí)候用 PNG-8,什么時(shí)候用 PNG-24,這是一個(gè)問題。

          理論上來說,當(dāng)你追求最佳的顯示效果、并且不在意文件體積大小時(shí),是推薦使用 PNG-24 的。

          但實(shí)踐當(dāng)中,為了規(guī)避體積的問題,我們一般不用PNG去處理較復(fù)雜的圖像。當(dāng)我們遇到適合 PNG 的場景時(shí),也會(huì)優(yōu)先選擇更為小巧的 PNG-8

          如何確定一張圖片是該用 PNG-8 還是 PNG-24 去呈現(xiàn)呢?好的做法是把圖片先按照這兩種格式分別輸出,看 PNG-8 輸出的結(jié)果是否會(huì)帶來肉眼可見的質(zhì)量損耗,并且確認(rèn)這種損耗是否在我們(尤其是你的 UI 設(shè)計(jì)師)可接受的范圍內(nèi),基于對比的結(jié)果去做判斷。

          應(yīng)用場景

          前面我們提到,復(fù)雜的、色彩層次豐富的圖片,用 PNG 來處理的話,成本會(huì)比較高,我們一般會(huì)交給 JPG 去存儲(chǔ)。

          考慮到 PNG 在處理線條和顏色對比度方面的優(yōu)勢,我們主要用它來呈現(xiàn)小的 Logo、顏色簡單且對比強(qiáng)烈的圖片或背景等。

          此時(shí)我們再次把目光轉(zhuǎn)向性能方面堪稱業(yè)界楷模的淘寶首頁,我們會(huì)發(fā)現(xiàn)它頁面上的 Logo,無論大小,還真的都是 PNG 格式:

          主 Logo:

          較小的 Logo:

          顏色簡單、對比度較強(qiáng)的透明小圖也在 PNG 格式下有著良好的表現(xiàn):

          SVG

          關(guān)鍵字:文本文件、體積小、不失真、兼容性好

          SVG(可縮放矢量圖形)是一種基于 XML 語法的圖像格式。它和本文提及的其它圖片種類有著本質(zhì)的不同:SVG 對圖像的處理不是基于像素點(diǎn),而是是基于對圖像的形狀描述。

          SVG 的特性

          和性能關(guān)系最密切的一點(diǎn)就是:SVG 與 PNG 和 JPG 相比,文件體積更小,可壓縮性更強(qiáng)

          當(dāng)然,作為矢量圖,它最顯著的優(yōu)勢還是在于圖片可無限放大而不失真這一點(diǎn)上。這使得 SVG 即使是被放到視網(wǎng)膜屏幕上,也可以一如既往地展現(xiàn)出較好的成像品質(zhì)——1 張 SVG 足以適配 n 種分辨率。

          此外,SVG 是文本文件。我們既可以像寫代碼一樣定義 SVG,把它寫在 HTML 里、成為 DOM 的一部分,也可以把對圖形的描述寫入以 .svg 為后綴的獨(dú)立文件(SVG 文件在使用上與普通圖片文件無異)。這使得 SVG 文件可以被非常多的工具讀取和修改,具有較強(qiáng)的靈活性

          SVG 的局限性主要有兩個(gè)方面,一方面是它的渲染成本比較高,這點(diǎn)對性能來說是很不利的。另一方面,SVG 存在著其它圖片格式所沒有的學(xué)習(xí)成本(它是可編程的)。

          SVG 的使用方式與應(yīng)用場景

          SVG 是文本文件,我們既可以像寫代碼一樣定義 SVG,把它寫在 HTML 里、成為 DOM 的一部分,也可以把對圖形的描述寫入以 .svg 為后綴的獨(dú)立文件(SVG 文件在使用上與普通圖片文件無異)。

          將 SVG 寫入 HTML:

          將 SVG 寫入獨(dú)立文件后引入 HTML:

          <img src="文件名.svg" alt="">
          

          在實(shí)際開發(fā)中,我們更多用到的是后者。很多情況下設(shè)計(jì)師會(huì)給到我們 SVG 文件,就算沒有設(shè)計(jì)師,我們還有非常好用的 在線矢量圖形庫。對于矢量圖,我們無須深究過多,只需要對其核心特性有所掌握、日后在應(yīng)用時(shí)做到有跡可循即可。

          Base64

          關(guān)鍵字:文本文件、依賴編碼、小圖標(biāo)解決方案

          Base64 并非一種圖片格式,而是一種編碼方式。Base64 和雪碧圖一樣,是作為小圖標(biāo)解決方案而存在的。在了解 Base64 之前,我們先來了解一下雪碧圖。

          前置知識(shí):最經(jīng)典的小圖標(biāo)解決方案——雪碧圖(CSS Sprites)

          雪碧圖、CSS 精靈、CSS Sprites、圖像精靈,說的都是這個(gè)東西——一種將小圖標(biāo)和背景圖像合并到一張圖片上,然后利用 CSS 的背景定位來顯示其中的每一部分的技術(shù)。

          MDN 對雪碧圖的解釋已經(jīng)非常到位:

          圖像精靈(sprite,意為精靈),被運(yùn)用于眾多使用大量小圖標(biāo)的網(wǎng)頁應(yīng)用之上。它可取圖像的一部分來使用,使得使用一個(gè)圖像文件替代多個(gè)小文件成為可能。相較于一個(gè)小圖標(biāo)一個(gè)圖像文件,單獨(dú)一張圖片所需的 HTTP 請求更少,對內(nèi)存和帶寬更加友好。

          我們幾乎可以在每一個(gè)有小圖標(biāo)出現(xiàn)的網(wǎng)站里找到雪碧圖的影子(下圖截取自京東首頁):

          和雪碧圖一樣,Base64 圖片的出現(xiàn),也是為了減少加載網(wǎng)頁圖片時(shí)對服務(wù)器的請求次數(shù),從而提升網(wǎng)頁性能。Base64 是作為雪碧圖的補(bǔ)充而存在的。

          理解 Base64

          通過我們上文的演示,大家不難看出,每次加載圖片,都是需要單獨(dú)向服務(wù)器請求這個(gè)圖片對應(yīng)的資源的——這也就意味著一次 HTTP 請求的開銷。

          Base64 是一種用于傳輸 8Bit 字節(jié)碼的編碼方式,通過對圖片進(jìn)行 Base64 編碼,我們可以直接將編碼結(jié)果寫入 HTML 或者寫入 CSS,從而減少 HTTP 請求的次數(shù)。

          我們來一起看一個(gè)實(shí)例,現(xiàn)在我有這么一個(gè)小小的放大鏡 Logo:

          它對應(yīng)的鏈接如下:

          https://user-gold-cdn.xitu.io/2018/9/15/165db7e94699824b?w=22&h=22&f=png&s=3680
          

          按照一貫的思路,我們加載圖片需要把圖片鏈接寫入 img 標(biāo)簽:

          <img src="https://user-gold-cdn.xitu.io/2018/9/15/165db7e94699824b?w=22&h=22&f=png&s=3680">
          

          瀏覽器就會(huì)針對我們的圖片鏈接去發(fā)起一個(gè)資源請求。

          但是如果我們對這個(gè)圖片進(jìn)行 Base64 編碼,我們會(huì)得到一個(gè)很長很長的字符串,我們可以直接用這個(gè)字符串替換掉上文中的鏈接地址。你會(huì)發(fā)現(xiàn)瀏覽器原來是可以理解這個(gè)字符串的,它自動(dòng)就將這個(gè)字符串解碼為了一個(gè)圖片,而不需再去發(fā)送 HTTP 請求。

          Base64 的應(yīng)用場景

          上面這個(gè)實(shí)例,其實(shí)源自我們 掘金 網(wǎng)站 Header 部分的搜索欄 Logo:

          既然 Base64 這么棒,我們何不把大圖也換成 Base64 呢?

          這是因?yàn)椋珺ase64 編碼后,圖片大小會(huì)膨脹為原文件的 4/3(這是由 Base64 的編碼原理決定的)。如果我們把大圖也編碼到 HTML 或 CSS 文件中,后者的體積會(huì)明顯增加,即便我們減少了 HTTP 請求,也無法彌補(bǔ)這龐大的體積帶來的性能開銷,得不償失。

          在傳輸非常小的圖片的時(shí)候,Base64 帶來的文件體積膨脹、以及瀏覽器解析 Base64 的時(shí)間開銷,與它節(jié)省掉的 HTTP 請求開銷相比,可以忽略不計(jì),這時(shí)候才能真正體現(xiàn)出它在性能方面的優(yōu)勢。

          因此,Base64 并非萬全之策,我們往往在一張圖片滿足以下條件時(shí)會(huì)對它應(yīng)用 Base64 編碼:

          1. 圖片的實(shí)際尺寸很小(大家可以觀察一下掘金頁面的 Base64 圖,幾乎沒有超過 2kb 的)
          2. 圖片無法以雪碧圖的形式與其它小圖結(jié)合(合成雪碧圖仍是主要的減少 HTTP 請求的途徑,Base64 是雪碧圖的補(bǔ)充)
          3. 圖片的更新頻率非常低(不需我們重復(fù)編碼和修改文件內(nèi)容,維護(hù)成本較低)

          Base64 編碼工具推薦

          這里最推薦的是利用 webpack 來進(jìn)行 Base64 的編碼——webpack 的 url-loader 非常聰明,它除了具備基本的 Base64 轉(zhuǎn)碼能力,還可以結(jié)合文件大小,幫我們判斷圖片是否有必要進(jìn)行 Base64 編碼。

          除此之外,市面上免費(fèi)的 Base64 編解碼工具種類是非常多樣化的,有很多網(wǎng)站都提供在線編解碼的服務(wù),大家選取自己認(rèn)為順手的工具就好。

          WebP

          關(guān)鍵字:年輕的全能型選手

          WebP 是今天在座各類圖片格式中最年輕的一位,它于 2010 年被提出, 是 Google 專為 Web 開發(fā)的一種旨在加快圖片加載速度的圖片格式,它支持有損壓縮和無損壓縮。

          WebP 的優(yōu)點(diǎn)

          WebP 像 JPEG 一樣對細(xì)節(jié)豐富的圖片信手拈來,像 PNG 一樣支持透明,像 GIF 一樣可以顯示動(dòng)態(tài)圖片——它集多種圖片文件格式的優(yōu)點(diǎn)于一身。

          WebP 的官方介紹對這一點(diǎn)有著更權(quán)威的闡述:

          與 PNG 相比,WebP 無損圖像的尺寸縮小了 26%。在等效的 SSIM 質(zhì)量指數(shù)下,WebP 有損圖像比同類 JPEG 圖像小 25-34%。 無損 WebP 支持透明度(也稱為 alpha 通道),僅需 22% 的額外字節(jié)。對于有損 RGB 壓縮可接受的情況,有損 WebP 也支持透明度,與 PNG 相比,通常提供 3 倍的文件大小。

          我們開篇提到,圖片優(yōu)化是質(zhì)量與性能的博弈,從這個(gè)角度看,WebP 無疑是真正的贏家。

          WebP 的局限性

          WebP 縱有千般好,但它畢竟太年輕。我們知道,任何新生事物,都逃不開兼容性的大坑。現(xiàn)在是 2018 年 9 月,WebP 的支持情況是這樣的:

          坦白地說,雖然沒有特別慘(畢竟還有親爹 Chrome 在撐腰),但也足夠讓人望而卻步了。

          此外,WebP 還會(huì)增加服務(wù)器的負(fù)擔(dān)——和編碼 JPG 文件相比,編碼同樣質(zhì)量的 WebP 文件會(huì)占用更多的計(jì)算資源。

          WebP 的應(yīng)用場景

          現(xiàn)在限制我們使用 WebP 的最大問題不是“這個(gè)圖片是否適合用 WebP 呈現(xiàn)”的問題,而是“瀏覽器是否允許 WebP”的問題,即我們上文談到的兼容性問題。具體來說,一旦我們選擇了 WebP,就要考慮在 Safari 等瀏覽器下它無法顯示的問題,也就是說我們需要準(zhǔn)備 PlanB,準(zhǔn)備降級(jí)方案。

          目前真正把 WebP 格式落地到網(wǎng)頁中的網(wǎng)站并不是很多,這其中淘寶首頁對 WebP 兼容性問題的處理方式就非常有趣。我們可以打開 Chrome 的開發(fā)者工具搜索其源碼里的 WebP 關(guān)鍵字:

          我們會(huì)發(fā)現(xiàn)檢索結(jié)果還是挺多的(單就圖示的加載結(jié)果來看,足足有?200?多條),下面大家注意一下這些 WebP 圖片的鏈接地址(以其中一個(gè)為例):

          <img src="http://img.alicdn.com/tps/i4/TB1CKSgIpXXXXccXXXX07tlTXXX-200-200.png_60x60.jpg_.webp" alt="手機(jī)app - 聚劃算" class="app-icon">
          

          .webp 前面,還跟了一個(gè) .jpg 后綴!

          我們現(xiàn)在先大膽地猜測,這個(gè)圖片應(yīng)該至少存在 jpg 和 webp 兩種格式,程序會(huì)根據(jù)瀏覽器的型號(hào)、以及該型號(hào)是否支持 WebP 這些信息來決定當(dāng)前瀏覽器顯示的是 .webp 后綴還是 .jpg 后綴。帶著這個(gè)預(yù)判,我們打開并不支持 WebP 格式的 Safari 來進(jìn)入同樣的頁面,再次搜索 WebP 關(guān)鍵字:

          Safari 提示我們找不到,這也是情理之中。我們定位到剛剛示例的 WebP 圖片所在的元素,查看一下它在 Safari 里的圖片鏈接:

          <img src="http://img.alicdn.com/tps/i4/TB1CKSgIpXXXXccXXXX07tlTXXX-200-200.png_60x60.jpg" alt="手機(jī)app - 聚劃算" class="app-icon">
          

          我們看到同樣的一張圖片,在 Safari 中的后綴從 .webp 變成了 .jpg!看來果然如此——站點(diǎn)確實(shí)是先進(jìn)行了兼容性的預(yù)判,在瀏覽器環(huán)境支持 WebP 的情況下,優(yōu)先使用 WebP 格式,否則就把圖片降級(jí)為 JPG 格式(本質(zhì)是對圖片的鏈接地址作簡單的字符串切割)。

          此外,還有另一個(gè)維護(hù)性更強(qiáng)、更加靈活的方案——把判斷工作交給后端,由服務(wù)器根據(jù) HTTP 請求頭部的 Accept 字段來決定返回什么格式的圖片。當(dāng) Accept 字段包含 image/webp 時(shí),就返回 WebP 格式的圖片,否則返回原圖。這種做法的好處是,當(dāng)瀏覽器對 WebP 格式圖片的兼容支持發(fā)生改變時(shí),我們也不用再去更新自己的兼容判定代碼,只需要服務(wù)端像往常一樣對 Accept 字段進(jìn)行檢查即可。

          由此也可以看出,我們 WebP 格式的局限性確實(shí)比較明顯,如果決定使用 WebP,兼容性處理是必不可少的。

          近有一個(gè)業(yè)務(wù)是前端要上傳word格式的文稿,然后用戶上傳完之后,可以用瀏覽器直接查看該文稿,并且可以在富文本框直接引用該文稿,所以上傳word文稿之后,后端保存到db的必須是html格式才行,所以涉及到word格式轉(zhuǎn)html格式。

          通過調(diào)查,這個(gè)word和html的處理,有兩種方案,方案1是前端做這個(gè)轉(zhuǎn)換。方案2是把word文檔上傳給后臺(tái),后臺(tái)轉(zhuǎn)換好之后再返回給前端。至于方案1,看到大家的反饋都說很多問題,所以就沒采用前端轉(zhuǎn)的方案,最終決定是后端轉(zhuǎn)化為html格式并返回給前段預(yù)覽,待客戶預(yù)覽的時(shí)候,確認(rèn)格式?jīng)]問題之后,再把html保存到后臺(tái)(因?yàn)閣ord涉及到的格式太多,比如圖片,visio圖,表格,圖片等等之類的復(fù)雜元素,轉(zhuǎn)html的時(shí)候,可能會(huì)很多格式問題,所以要有個(gè)預(yù)覽的過程)。

          對于word中普通的文字,問題倒不大,主要是文本之外的元素的處理,比如圖片,視頻,表格等。針對我本次的文章,只處理了圖片,處理的方式是:后臺(tái)從word中找出圖片(當(dāng)然引入的jar包已經(jīng)帶了獲取word中圖片的功能),上傳到服務(wù)器,拿到絕對路徑之后,放入到html里面,這樣,返回給前端的html內(nèi)容,就可以直接預(yù)覽了。


          maven引入相關(guān)依賴包如下:

           <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轉(zhuǎn)html,對于word2003和word2007轉(zhuǎn)換方式不一樣,因?yàn)閣ord2003和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;
              }

          關(guān)于doc和docx的一些存儲(chǔ)格式介紹:

          docx 是微軟開發(fā)的基于 xml 的文字處理文件。docx 文件與 doc 文件不同, 因?yàn)?docx 文件將數(shù)據(jù)存儲(chǔ)在單獨(dú)的壓縮文件和文件夾中。早期版本的 microsoft office (早于 office 2007) 不支持 docx 文件, 因?yàn)?docx 是基于 xml 的, 早期版本將 doc 文件另存為單個(gè)二進(jìn)制文件。

          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.


          可能你會(huì)問了,明明是docx結(jié)尾的文檔,怎么成了xml格式了?

          很簡單:你隨便選擇一個(gè)docx文件,右鍵使用壓縮工具打開,就能得到一個(gè)這樣的目錄結(jié)構(gòu):


          所以你以為docx是一個(gè)完整的文檔,其實(shí)它只是一個(gè)壓縮文件。


          參考:

          https://www.cnblogs.com/ct-csu/p/8178932.html


          主站蜘蛛池模板: 亚洲av日韩综合一区二区三区 | 日韩熟女精品一区二区三区 | 奇米精品一区二区三区在| 日韩精品无码一区二区三区不卡 | 中文字幕在线一区二区在线| 国产综合视频在线观看一区 | 亚洲视频一区调教| 午夜爽爽性刺激一区二区视频| 久久99国产精品一区二区| 日韩精品一区二区三区在线观看 | 精品国产免费一区二区三区| 精品日韩一区二区三区视频| 亚洲中文字幕久久久一区| 日韩精品中文字幕无码一区| 久久久综合亚洲色一区二区三区| 一区二区三区伦理高清| 欧洲精品码一区二区三区| 精品无码国产一区二区三区51安| 日韩精品无码一区二区中文字幕| 亚洲日韩国产精品第一页一区| 国产一区在线视频| 国偷自产一区二区免费视频| 熟妇人妻一区二区三区四区| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 狠狠综合久久AV一区二区三区| 一区二区三区在线免费观看视频| 精品福利一区3d动漫| 日韩精品一区二区三区在线观看| 痴汉中文字幕视频一区| 精品无码综合一区| 国产另类TS人妖一区二区| 成人精品视频一区二区三区不卡 | 国产一区二区三区影院| 中文字幕精品一区二区| 国产成人精品一区二三区熟女| 日韩人妻无码免费视频一区二区三区| 精品人妻无码一区二区色欲产成人| 在线观看国产一区二三区| 狠狠综合久久av一区二区| 夜夜精品无码一区二区三区| 成人区精品一区二区不卡|