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

news2025/8/13 21:42:27

在前端导出PDF,解决中文乱码一直是一个头疼的问题。要解决这个问题,需要将ttf等字体文件内容注册到页面PDF生成器中。但是之前网页是没有权限直接获取客户机器字体文件,这时就需要从服务器下载字体文件或者提示用户选择字体文件上传到页面。对于动辄数十兆(M)的中文字体文件,网络不好时并不是一个好的解决方案。

Chrome 103

提高页面性能的一种方法是对当前的使用资源经行提示。例如,预加载文件或连接到不同的服务器。

<link as="font" crossorigin="anonymous"
      href="..." rel="preload">
<link as="font" crossorigin="anonymous"
      href="..." rel="preload">
<link href="https://web-dev.imgix.net"
      rel="preconnect">

但是在服务器发送页面内容之前,浏览器是无法对提示采取行动。

服务器需要几百毫秒才能生成一个请求页面,在浏览器开始接收页面内容之前,服务器是不进行任何处理的。但是在这个等待的过程中,服务器是需要一些固定子资源,例如 CSS 文件、JavaScript 和图像内容,这个时候服务器可以立即响应新的 HTTP 103 Early Hints 状态代码,并询问浏览器预加载那些子资源,以提供高座效率。

一旦服务器生成了页面,它就可以用正常的 HTTP 200 响应发送它。当页面进入时,浏览器已经开始加载所需的资源。作为一个新 HTTP 状态代码,所以它需要更新我们服务器。

本地字体访问

Web 上的字体一直是一个挑战,尤其是允许用户创建自己的图形和设计的应用程序就是一个难点。现在应用程序只能使用网络字体,但无法获得用户在其计算机上安装的字体列表;而且,无法访问完整的字体表数据,如果我们需要实现自己的自定义文本堆栈,就很复杂。

而在新版本中,这个问题得到了很好解决。Chrome 103版本中新的字体API可以让web应用获取到用户在本地电脑上安装的所有字体信息,同时还可以获取到字体内容。

调用window.queryLocalFonts(),会返回用户安装字体的数组。

const pickedFonts = await self.queryLocalFonts();
for (const fontData of pickedFonts) {
  console.log(fontData.postscriptName);
  console.log(fontData.fullName);
  console.log(fontData.family);
  console.log(fontData.style);
}

处于安全性的考虑,获取字体信息需要获取到用户的授权。当第一调用queryLocalFonts时,Chrome会弹出权限申请:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-syugszoM-1669281002515)(https://img2022.cnblogs.com/blog/139239/202211/139239-20221124170240402-30141038.png)]

权限同意后,就可以获取所有安装字体的信息

使用navigator.permissions.query可以检查权限

async function requestPremission(){
  const { state } = await navigator.permissions.query({
    name: "local-fonts"
  });
  console.log(state)
  if (state === 'granted') {
    query();
  } else if (state === 'prompt') {
    alert("请授予权限!")
    query();
  }
  else{
    alert("没有权限获取字体")
  }
}

使用本地字体导出PDF

接下来我们介绍如何使用本地字体进行PDF导出。
选择需要使用的字体内容,注册到PDF生成工具中

使用blob 方法可以获取字体文件内容
let currentFont = fontList[fontListSelect.value];
const blob = await currentFont.blob();

使用字体名称注册

//将Blob 对象转换成 ArrayBuffer
var reader = new FileReader();
reader.onload = function (e) {
  var fontrrayBuffer = reader.result;
  var fonts = GC.Spread.Sheets.PDF.PDFFontsManager.getFont(currentFont.family) || {};
  fonts[fontType] = fontrrayBuffer;
  GC.Spread.Sheets.PDF.PDFFontsManager.registerFont(currentFont.family, fonts);
}
reader.readAsArrayBuffer(blob);

接下来导出含有本地字体的PDF:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ASByrQ4G-1669281002517)(https://img2022.cnblogs.com/blog/139239/202211/139239-20221124170417908-1269051260.png)]

这里需要注意,使用本地字体风险也是不可避免的,如果用户没有安装对应字体,在网页中浏览器会使用其他字体进行渲染,倒是PDF依旧会有出现乱码的风险。解决方法是需要从服务器中下载目标字体或使用其他字体作为替代。

拓展阅读

React + Springboot + Quartz,从0实现Excel报表自动化

电子表格也能做购物车?简单三步就能实现

使用纯前端类Excel表格控件SpreadJS构建企业现金流量表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

链接杂谈 CASPP

构建大型程序 构建大型程序&#xff0c;不可避免的一个问题是链接问题&#xff1a; - 链接器提示&#xff1a;缺少某个模块 缺少某个库 不兼容的库版本 理解全局变量的链接 你的代码可能有多个全局变量&#xff0c;有些是强变量&#xff0c;有些是弱定义&#xff0c;执行…

清除浮动的常用方法

关于浮动 我们为什么需要浮动&#xff1f; 我们想把多个块级元素放到同一行上。 打破标准流的限制。 浮动原来做图文混排效果&#xff0c;现在主要用来做网页布局的。 浮动语法 只有左浮动和右浮动。 float: left; float: right;浮动特点 1.浮动元素会脱离标准流&#x…

Win10禁止应用独占麦克风

痛点需求&#xff1a; qq和微信同时发起语音通话&#xff0c;发现只有一个qq说话对方能听到&#xff0c;但是微信却不能&#xff0c;这是典型的应用程序独占了麦克风&#xff0c;导致其他应用无法使用。 有没有办法让qq和微信同时使用麦克风呢&#xff1f; 答案是&#xff1a;有…

图的拓扑序列

拓扑序列&#xff1a; 拓扑序是按照点的先后顺序排列的。拓扑序列满足以下两点&#xff1a; 1.每个顶点在序列中出现且只出现一次。 2.若存在一条从顶点 A 到顶点 B 的路径&#xff0c;那么在序列中顶点 A 出现在顶点 B 的前面。 拓扑序列只存在于有向无环图中。可以理解成…

MCE | 肝炎病毒是如何诱发肝癌的

肝炎病毒分类 肝炎病毒是世界上最常见的肝炎病因&#xff0c;其它原因包括酗酒、某些药物、毒素、其他感染、自身免疫性疾病和非酒精性脂肪性肝炎 (NASH)。肝炎病毒共有五种主要的肝炎病毒株&#xff0c;分别为 A、B、C、D 和 E 型。目前&#xff0c;全世界大约有 3.25 亿人患…

2023中国绿色铝业国际峰会

会议背景 铝行业属于能源高度密集型行业&#xff0c;主要包括铝矿石开采、氧化铝生产、电解铝生产和铝材加工等环节。我国原铝产量自2001年以来一直占据世界首位&#xff0c;连续7年产量占比超过全球50%。然而与国际先进铝生产企业相比&#xff0c;我国铝生产企业单位原铝碳…

C# 自定义事件

一 自定义事件 例如&#xff0c;利用自定义绘制的技术&#xff0c;画出一个圆角按钮。 现在来看&#xff0c;怎么样给它添加自定义的事件。 二 要点与细节 1 Control 类本身就有继承的鼠标和键盘事件&#xff0c;这里只是一个引子&#xff0c;用于引出更复杂的自定义事件。 …

web测试——业务测试2

1.历史数据 前端&#xff1a; 组件相关  组件内部是否动过&#xff1b;  展示的数据是否受影响&#xff1b;  失焦后的校验(爆红) 页面样式相关  坐标位置、  按钮位置是否动过&#xff0c;  新版本上线对历史配置的影响 交互提示相关  新手引导的展示位置、关闭后的展…

pycharm2022.2 远程连接服务器调试代码

目的&#xff1a; 同步本地和服务器的全部或者部分文件本地debug&#xff0c;服务器跑实验 需要条件&#xff1a; 服务器上已经创建好虚拟环境你本地已经安装好pycharm 1.1 File → Settings → Project:XXX →Python Interpreter 打开之后再右边这添加解释器。选On SSH 1.2把…

简单的网页制作期末作业——电影泰坦尼克号(4页)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

小学生python游戏编程arcade----excel调用

小学生python游戏编程arcade----excel调用前言小学生python游戏编程arcade----excel调用1、excel文件1.1 excel表头1.2 excel文件1.3 文件读取函数1.4 打开excel文件读取数据,每行一个字典&#xff0c;再总存为序列1.5 打开excel文件读取数据&#xff0c;取两列存为字典1.6 游戏…

[漏洞复现] jenkins 远程代码执行 (CVE-2019-100300)

文章目录一、简介二、影响版本三、复现四、修复一、简介 拥有Overall/Read 权限的用户可以绕过沙盒保护&#xff0c;在jenkins可以执行任意代码。此漏洞需要一个账号密码和一个存在的job。 Jenkins的pipeline主要是通过一个配置文件或者job里面的pipeline脚本配置来设定每个j…

锐捷MPLS跨域方案C2实验配置

目录 配置ASBR之间的EBGP邻居 配置PE之间的Vpnv4邻居 此时配置PE与CE设备对接命令 手工配置为PE地址分配标签 MPLS隧道——跨域解决方案C1、C2讲解_静下心来敲木鱼的博客-CSDN博客https://blog.csdn.net/m0_49864110/article/details/127634890?ops_request_misc%257B%252…

数字孪生|交通运输可视化系统

交通是城市经济发展的动脉&#xff0c;与我们的日常生活息息相关。 传统交通信息管理中&#xff0c;只是做了粗略的信息发布以及简单的交通流量监测&#xff0c;早已经不能满足现代智慧交通的需求。现代的智慧交通则提供基于实时交通数据的交通信息服务&#xff0c;融入了物联网…

python离线安装module以及常见问题及解决方案

文章目录一&#xff0c;离线安装module1.1 下载module1.2 离线安装二&#xff0c;常见的问题2.1 模块缺少合适的适配&#xff1a;error: Could not find suitable distribution for Requirement.parse()2.2 install成功但发现控制台打印的最后一行显示下载module版本为0.0.0工作…

如何区分小角X射线散射和小角X射线衍射?

小角X射线散射&#xff08;SAXS&#xff09;大多数被用来测定超细粉体、纳米离子分布的有关性质&#xff0c;小角X射线衍射&#xff08;SAXD&#xff09;则主要用来测定超大晶面间距或者薄膜结构等等问题&#xff0c;在用途上两种实验并不一致&#xff0c;本篇文章将介绍小角X射…

Promise错误处理比较:使用then的第二个参数还是catch

catch是一个语法糖而己 还是通过then来处理的 如果在then的第一个函数里抛出了异常&#xff0c;后面的catch能捕获到&#xff0c;而then的第二个函数捕获不到。 catch是一个语法糖而己 还是通过then 来处理的&#xff1a; Promise.prototype.catch function(fn){return this…

Amazon Braket 与量子计算

KY1,Yankuan Pan2,Bertran Shao3,Zoey Deng41.Amazon HERO&#xff1b;2.项目架构师&#xff1b;3.开发者生态负责人;4.开发者关系 Amazon Braket 是一项完全托管式的量子计算服务&#xff0c;主要可面向研究人员、科学家和开发人员提供一些量子计算软硬件服务进行研究和开发工…

中国设备维修安装企业能力等级证书(制冷空调)

中国设备维修安装企业能力等级证书&#xff08;制冷空调&#xff09;&#xff0c;是由中国制冷学会审定&#xff0c;中国设备管理协会批准颁发&#xff0c;全国性制冷空调设备维修、安装行业能力等级证书。也是目前国内唯一能在中国招标网http://www.ctba.org.cn/查询到的制冷空…

AVX | 关于RC电路耦合、相移、滤波、微分、积分的那些事儿~

所谓RC电路&#xff0c;就是电阻R和电容C组成的一种分压电路。如下图1所示&#xff1a;输入电压加于RC串联电路两端&#xff0c;输出电压取自于电阻R或电容C。由于电容的特殊性质&#xff0c;对下图(a)和(b)不同的输出电压取法&#xff0c;呈现出不同的频率特性。 由此RC电路在…