当前位置: 首页 > Web前端 > JavaScript

Chrome103支持使用本地字体,纯前端导出PDF优化_0

时间:2023-03-27 11:57:28 JavaScript

前端导出PDF,解决中文乱码一直很头疼。要解决这个问题,需要将ttf等字体文件的内容注册到页面PDF生成器中。但是在网页没有权限直接获取客户端机器的字体文件之前,需要从服务器下载字体文件或者提示用户选择字体文件上传到页面。对于几十兆字节(M)的中文字体文件,在网络不好的情况下不是一个好的解决方案。Chrome103Chrome103中新的字体API允许Web应用程序获取用户在本地计算机上安装的所有字体信息,以及字体内容。调用window.queryLocalFonts()将返回用户安装的字体数组。constpickedFonts=awaitself.queryLocalFonts();for(constfontDataofpickedFonts){console.log(fontData.postscriptName);console.log(fontData.fullName);console.log(fontData.family);console.log(fontData.style);}出于安全考虑,获取字体信息需要用户授权。首次调用queryLocalFonts时,Chrome会弹出权限申请:同意后,即可获取所有安装的字体信息。使用navigator.permissions.query检查权限asyncfunctionrequestPremission(){const{state}=awaitnavigator.permissions.查询({名称:“本地字体”});console.log(state)if(state==='granted'){query();}elseif(state==='prompt'){alert("请授予权限!")query();}else{alert("Nopermissiontoobtainfonts")}}UselocalfontstoexportPDF选择要使用的字体内容,注册到PDF生成工具中,使用blob方法获取字体文件内容让currentFont=fontList[fontListSelect.value];constblob=awaitcurrentFont.blob();用字体名称注册//将Blob对象转换为ArrayBuffervarreader=newFileReader();reader.onload=function(e){varfontrrayBuffer=reader.result;varfonts=GC.Spread.Sheets.PDF.PDFFontsManager.getFont(currentFont.family)||{};字体[字体类型]=fontrrayBuffer;GC.Spread.Sheets.PDF.PDFFontsManager.registerFont(currentFont.family,fonts);}reader.readAsArrayBuffer(blob);导出包含本地自定义字体的PDF:注意:使用本地字体存在风险。如果用户没有安装必要的字体,浏览器会在网页中使用其他字体渲染但导出PDF可能会很混乱。这时候需要从服务器下载字体或者替换成其他字体文件