首發於https://zhuanlan.zhihu.com/p/90706046
上一篇介紹了 PPT 的文檔結構,可是當用戶下載下來會發現不少字體不能正常顯示或者替換成了默認字體,對於最終呈現的效果就會大打折扣,這是由於用戶電腦上沒有安裝對應的字體,因此最好能在下載 PPT 的同時將字體也嵌入進去。web
目前 Microsoft PowerPoint 2019 以前的版本只支持 windows 版本的字體嵌入,2019 以後,Mac 也能嵌入,因此並無進行版本判斷,沒法正常嵌入的會在打開彈出提示框。算法
WPS 都支持嵌入字體,但有些字體沒法識別,大可能是由於大小寫的問題,好比以前嵌入「思源黑體」,字體名爲英文,Microsoft 能夠識別,WPS 不能識別,換成中文,WPS 能識別,Microsoft 有不能。很氣。windows
由於只能嵌入 EOT 格式的字體,因此要考慮是否須要進行字體格式的轉換。app
EOT 是微軟設計用來在 web 使用的,對字體進行壓縮和裁剪使得文件體積更小,同時避免了受版權保護的字體被隨意複製。
因爲網頁在顯示模板的時候會下載一次相關 WOFF 格式的相關字體,因此爲了節省下載時間,就直接將 WOFF 轉成 EOT。字體
WOFF(Web Open Font Format) 由 Mozilla 聯合其餘幾大組織共同開發,使用了 OpenType 和 TrueType 字體的存儲結構和壓縮算法,因此加載比較快。
好像不能直接將 WOFF 轉成 EOT,因此繞了一步,先將 WOFF 轉成 TTF,再進一步轉成 EOT。能夠直接調用相關庫實現轉換。fetch
fetch(font.woff).then(res => { return res.arrayBuffer(); }) .then(buffer => { const eotBuffer = woff2eot(buffer); const unit8Array = new Unit8Array(eotBuffer); const blob = new Blob([unit8Array], { type: 'font/opentype' }); return blob; })
從 PPT 的文件結構可知,文字是專門放在一個fonts
文件夾中,以 fntdata
後綴名保存設計
zip.file(`ppt/fonts/font1.fntdata`, blob);
在 ppt/presentation.xml 中聲明嵌入字體code
xml += ` <p:embeddedFontLst> <p:embeddedFont> <p:font typeface="fontFamily" panose="02010601030101010101" pitchFamily="2" charset="-122" /> <p:regular r:id="rId1" /> </p:embeddedFont> </p:embeddedFontLst>`
在 ppt/_rels/presentation.xml.rels 中聲明關係orm
xml += ` <Relationship Id="rId1" Target="fonts/font1.fntdata" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/font">`
最重要!必定要在 [Content_Types.xml] 列出全部用到的文件格式xml
xml += `<Default Extension="fntdata" ContentType="application/x-fontdata" />`
到這裏就成功將字體嵌入到了 PPT 中,只要在寫入文字的時候直接引用字體名就能夠了