jspdf添加宋体_JSPDF支持中文(思源黑体)采坑之旅,JSPDF中文字体乱码解决方案...
我拍个砖,通常标称自己文章完美解决何种问题的,往往就是解决不了任何问题!
众所周知,JSPDF是一个开源的,易用的,但是对中文支持非常差的PDF库。
下面,我教大家,如何在pdf中使用思源黑体。思源黑体是开源字体。思源黑体具有很广泛使用性,实用性,也是规避字体版权风险的重要选择!请严格按照我说的做!
1、准备思源黑体的ttf文件,不要用otf文件,如下
https://github.com/be5invis/source-han-sans-ttf/releases
.
2、把下载的字体命名统统改为小写,如下
为什么改为小写,见 issues2465 ,命名为大写的统统失效~
3、于是,我们得到这2个文件
PS:字体是bold字体,网站的fontStyle你就选bold,normal也是这样!
用记事本(win)打开这2个文件,不要用编辑器,会异常卡,除非你内存高,mac爱什么打开什么打开,双击选中那串长的,ctrl+c。
你的项目新建font.js,内容如下
export functionaddfont(pdf) {var font = 'AADSSDDT12......' //←就是很长那串
pdf.addFileToVFS('bolds', font)
return true;
}
使用方法:(我的项目是ant-design pro 4.0)
import { addfont } from '@/font/font'
//前面只是添加了字体,还要注册字体,addfont第3个参数一定是normal,即使你add的字体是bold的,也要设置为normal
addfont(doc)
doc.addFont('bolds', 'b', 'normal')//使用字体时,使用这句即可
doc.setFont('b');
坑:
1、autoTable需要使用默认字体,是一种叫做NotoSansCJKtc-Regular.ttf的字体,否则乱码,或者你改源码,使之兼容
doc.addFont('NotoSansCJKtc-Regular.ttf', 'NotoSansCJKtc', 'normal');
doc.setFont('NotoSansCJKtc');
2、因为字体文件太大,导致JS运行时内存溢出 JavaScript heap out of memory
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
资料:https://stackoverflow.com/questions/38558989/node-js-heap-out-of-memory
解决办法:https://lwjandmy.github.io/myblog/articles/+.+category+.+%E7%BC%96%E7%A8%8BJavaScript+.+title+.+node%20%E5%87%BA%E7%8E%B0heap%20out%20of%20memory%E9%97%AE%E9%A2%98+.+createtime+.+20181228%E4%B8%80190612+.+lastmodifiedtime+.+20181228%E4%B8%80190612+.+.html
由于我用了umi,因此改umi.cmd,如下
@IF EXIST "%~dp0\node.exe"("%~dp0\node.exe" "%~dp0\..\umi\bin\umi.js" %*) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%node--max-old-space-size=4096 "%~dp0\..\umi\bin\umi.js" %*)
若你是用webpack,改webpack.cmd
3、最后不得不说句,我把字体放在前端项目,是因为我的项目要打包为electron的,若你的项目是发布到线上,最好做cdn或者考虑使用默认一种字体~!
由于字体文件实在太大,执行打包时必定触发V8的内存限制,我使用umi打包时,8G内存直接爆了,--max-old-space-size=7000也不起作用,换成mac的16G内存一样爆了,问题在哪?思维错了!我们不能苛求webpack/umi能够具有打包系统级文件的能力:如大型音视频,字体包,压缩文件,msi等,此时只有使用系统的文件管理能力来加持,因此,ele的原生能力就要发挥作用。
用到线程通信和node的文件读取能力即可
//在主进程中.
const { ipcMain } = require('electron')
ipcMain.on('asynchronous-message', (event, arg) =>{
console.log(arg)//prints "ping"
event.reply('asynchronous-reply', 'pong')
})
ipcMain.on('synchronous-message', (event, arg) =>{
console.log(arg)//prints "ping"
event.returnValue = 'pong'})
//在渲染器进程 (网页) 中。
const { ipcRenderer } = require('electron')
console.log(ipcRenderer.sendSync('synchronous-message', 'ping')) //prints "pong"
ipcRenderer.on('asynchronous-reply', (event, arg) =>{
console.log(arg)//prints "pong"
})
ipcRenderer.send('asynchronous-message', 'ping')
所谓渲染器进程就是你的前端项目,下面说一下的处理方式
1 准备字体文件
2.由于不是项目主要部分,而是支持性部分,因此我就用了一个回调地狱 /滑稽
var fs = require("fs");
ipcMain.on('asynchronous-message', (event, arg) =>{
console.log('main', arg) //请求的消息
//使用通信方式输送字体给前端
let filePath = path.join(__dirname, ".", "font/font.js");
let filePath2= path.join(__dirname, ".", "font/font2.js");
let filePath3= path.join(__dirname, ".", "font/font3.js");
console.log(filePath,"filePath")
fs.readFile(filePath, { encoding:"utf-8" }, function(err, fr) {//readFile回调函数
//if (err) {
//console.log(err);
//}
fs.readFile(filePath2, { encoding:"utf-8" }, function(err, fr2) {//readFile回调函数
fs.readFile(filePath3, { encoding:"utf-8" }, function(err, fr3) {//readFile回调函数
event.reply('asynchronous-reply', {
addFont: fr,
addFont2: fr2,
addFont3: fr3,
})
})
})
})
})
前端调用
const { ipcRenderer } = require('electron')
ipcRenderer.send('asynchronous-message', 'ping')
ipcRenderer.on('asynchronous-reply', (event, arg) =>{//console.log('web', arg) // prints "pong"
const {
addFont,
addFont2,
addFont3
}=argthis.setState({
addFont,
addFont2,
addFont3
})
})
使用字体
doc.addFileToVFS('bolds', this.state.addFont)
doc.addFileToVFS('normals', this.state.addFont2)
doc.addFont('bolds', 'b', 'normal')
doc.addFont('normals', 'n', 'normal')
...
doc.setFont('n');
...
doc.setFont('b');
jspdf添加宋体_JSPDF支持中文(思源黑体)采坑之旅,JSPDF中文字体乱码解决方案...相关推荐
- jspdf添加宋体_jspdf下载pdf文件模糊,字体加粗等样式失效
jspdf下载pdf文件模糊,字体加粗等样式失效 exportPDF = () => {let { shop } = this.props; let element = document.get ...
- react-native-webrtc之采坑之旅
目标 1.实现APP与WEB端安全帽功能通过摄像头的实时通信,再web端可以查看手机摄像头获取的图像,手机上也可实时显示画面: 2.连接.下线 3.切换分辨率.前后摄像头 使用的相关工具(没有一个不踩 ...
- css中文字体乱码解决方案:
把css编码和html页面编码统一起来.如果html页面是utf-8.css.js也统一成utf-8编码.如果html页面是gb2312.css.js也统一成gb2312编码.UTF-8和GB2312 ...
- jspdf添加宋体_pdfjs 引入字体失败
这个pdf是宋体 使用的pdfjs-dist 2.0.943 ref="container" class="page-container" :style=&qu ...
- esxi直通 gen8_HP MicroServer Gen8与ESXI采坑之旅
安装镜像下载 最新的 ESXI 6.5 的 HP 定制镜像可以在这个 URL 进行下载: https://my.vmware.com/web/vmware/details?productId=614& ...
- 小爱音箱提示“系统出现点问题,请检查配置。。。“采坑之旅
起因:用着好好的突然就不好使了,语音问小爱音箱提示"系统遇到点问题,请检查配置或者稍后重试" 这个问题实质是小爱音箱连接WiFi失败 到目前为止,试了好几个方法,记录一下. 1.首 ...
- 从APP跳转到微信指定联系人聊天页面功能的实现与采坑之旅
起因: 最近做的APP中有一个新功能:已知用户微信号,可点击直接跳转到当前用户微信聊天窗口页面. 当时第一想法是使用无障碍来做,并且觉得应该不难,只是逻辑有点复杂.没想到最终踩了好多坑,特地把踩过的坑 ...
- css汉字注释乱码,css font-family属性设置中文字体乱码
一般设置字体,个人都喜欢用中文,比如:font-family:"微软雅黑":但是偶尔会出现设置以后字体显示乱码的问题 解决方法[1]: 看看你的CSS文件的第一行有没有:@char ...
- (原创)修改BIOS让华硕Z87-A老主板支持NVMe硬盘启动(采坑实录)
当年经典的华硕Z87-A主板至今仍然老当益壮,美中不足就是不支持NVMe SSD作为启动盘.由于工作生活繁忙,2年多来陆陆续续查了好多资料,再加上有CH341A编程器加持,自认已经准备得够充分.最近乘 ...
最新文章
- 如何在网站上同步查看BCH数据
- php和java融合_Java上的PHP,真的融合
- Spring 3使用JUnit 4进行测试– ContextConfiguration和AbstractTransactionalJUnit4SpringContextTests...
- redis概念、做什么及其应用场景
- php大作业含代码_目标检测 | 目标检测技巧大汇总(含代码与解读)
- 如何根据对象获取到对应的表名_Hands-on! 如何给 TiDB 添加新系统表
- java svg to png_如何用Image Magick将SVG转换为PNG?
- ArcGIS教程 - 8 空间数据拓扑处理
- tar包安装vsftpd
- Python 爬虫学习笔记(十(2))scrapy爬取图书电商实战详解
- 微型机器人正迎来发展,三大领域应用大有可为
- IDEA生成jar工具包
- android listview视差滚动,android – ListView在滚动时覆盖另一个布局
- 利用计算机进行数值模拟计算,数值模拟法
- Mysql 安装与基础
- 田纳西大学计算机科学,田纳西大学
- Oracle表中数据小数写到前台是百分数显示
- DataSong大数据智能管理平台 用户手册-开发部分
- mysql数据库连接失败_mysql数据库连接失败问题排查
- Polygon zkEVM中的Merkle tree