找回密码
 立即注册

QQ登录

只需一步,快速开始

dexteryao 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2024-12-10 10:46  /   查看:68  /  回复:2
本帖最后由 dexteryao 于 2024-12-10 10:47 编辑

SpreadJS 在导出PDF前需要为使用到的字体注册对应的字体文件以防止乱码。
但是字体文件并不会包含所有字符的字型描述。
例如英文字体并不会包含中文的字型,中文字体也不包含所有的中文文字。
所以对于特殊的字符即使注册了某个字体,如果字体中不包含该字符的字型描述也还会出现乱码。


那么为了防止出现此类情况,可以在导出前对于用到的字符做检查,判断是对应字体是否包含该字型,如果不存在可以给出提示,或者检测其他字体是否包含,通过富文本的方式更改某一个字符为其他字体。


检测字体可以使用fontkithttps://github.com/foliojs/fontkit组件,它支持在node和浏览器环境中,对字体进行多种操作。
提供了hasGlyphForCodePoint接口,可以检查字型。


具体使用参考代码如下:
安装:
  1. npm install fontkit
复制代码
引入:
  1. import * as fontkit from 'fontkit';
复制代码
创建fontkit中的font对象
  1. const buf = new Uint8Array(arrayBuffer);
  2. const font = fontkit.create(buf);
复制代码
这里的arrayBuffer是注册过的字体文件
可以通过getFont拿到
  1. var fonts = GC.Spread.Sheets.PDF.PDFFontsManager.getFont("微软雅黑");
  2. var arrayBuffer = fonts["normal"]
复制代码
或者是之前请求过的字体
  1. const response = await fetch(url);
  2.   const arrayBuffer = await response.arrayBuffer();
复制代码


然后就可以使用hasGlyphForCodePoint检查了
  1. console.log(font.hasGlyphForCodePoint(65))
  2.   console.log(font.hasGlyphForCodePoint("".charCodeAt(0)))
  3.   console.log(font.hasGlyphForCodePoint("葡".charCodeAt(0)))
复制代码


中文字体文件本身就比较大,字符检查也会耗费较大的资源,如果对于复杂的内容还是建议在服务端通过GCExcel来做PDF的生成。
GCExcel会自动的检查字符,在字型不存在的情况下也会自动找到替代字型,无需自定义的代码检查操作。

2 个回复

倒序浏览
不吐葡萄皮
初级会员   /  发表于:2024-12-10 10:55:55
沙发
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-12-10 11:25:52
板凳
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部