PPT 字體嵌入

首發於https://zhuanlan.zhihu.com/p/90706046
上一篇介紹了 PPT 的文檔結構,但是當用戶下載下來會發現很多字體不能正常顯示或者替換成了默認字體,對於最終呈現的效果就會大打折扣,這是因爲用戶電腦上沒有安裝對應的字體,所以最好能在下載 PPT 的同時將字體也嵌入進去。

目前 Microsoft PowerPoint 2019 之前的版本只支持 windows 版本的字體嵌入,2019 之後,Mac 也能嵌入,所以並沒有進行版本判斷,無法正常嵌入的會在打開彈出提示框。

WPS 都支持嵌入字體,但有些字體無法識別,大多是因爲大小寫的問題,比如之前嵌入“思源黑體”,字體名爲英文,Microsoft 可以識別,WPS 不能識別,換成中文,WPS 能識別,Microsoft 有不能。很氣。

第一步:下載字體。

因爲只能嵌入 EOT 格式的字體,所以要考慮是否需要進行字體格式的轉換。

EOT 是微軟設計用來在 web 使用的,對字體進行壓縮和裁剪使得文件體積更小,同時避免了受版權保護的字體被隨意複製。

由於網頁在顯示模板的時候會下載一次相關 WOFF 格式的相關字體,所以爲了節省下載時間,就直接將 WOFF 轉成 EOT。

WOFF(Web Open Font Format) 由 Mozilla 聯合其他幾大組織共同開發,使用了 OpenType 和 TrueType 字體的存儲結構和壓縮算法,所以加載比較快。

好像不能直接將 WOFF 轉成 EOT,所以繞了一步,先將 WOFF 轉成 TTF,再進一步轉成 EOT。可以直接調用相關庫實現轉換。

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 中

從 PPT 的文件結構可知,文字是專門放在一個fonts文件夾中,以 fntdata 後綴名保存

zip.file(`ppt/fonts/font1.fntdata`, blob);
第三步:引用字體

在 ppt/presentation.xml 中聲明嵌入字體

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 中聲明關係

xml += `
    <Relationship Id="rId1" Target="fonts/font1.fntdata" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/font">`

最重要!一定要在 [Content_Types.xml] 列出所有用到的文件格式

xml += `<Default Extension="fntdata" ContentType="application/x-fontdata" />`

到這裏就成功將字體嵌入到了 PPT 中,只要在寫入文字的時候直接引用字體名就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章