JS DataTable中导出PDF中文乱码
JS DataTable中导出PDF中文乱码
文章目录
- JS DataTable中导出PDF中文乱码
- 一. 问题
- 二. 原因
- 三. vfs_fonts.js
- 四. pdfmake.js
- 五. 解决
- 六.参考资料
一. 问题

二. 原因
DataTable使用pdfmake,pdfmake默认字体为Roboto,不支持中文字体。添加自己的字体,需要引入对应的vfs_fonts.js文件,修改pdfmake.js。
(在我的项目中,对应datatable文件夹下的vfs_fonts.js和pdfmake.min.js,也有人是改三个文件,vfs_fonts.js,pdfmake.js和dataTable.buttons.min.js,思路对了就没问题)
主要思路依据:官网上对于添加字体的方法指导
前端页面的js内dataTable不需要改,PDF导出按钮由前端界面的JS文件中DataTable设置。

三. vfs_fonts.js
获取中文版的vfs_fonts.js主要有两种方法:自己生成和寻找资源。
- 自己生成vfs_fonts.js文件
首先需要准备字体的ttf文件。官网上对于如何生成有以下三种方法:
(1)安装pdfmake

(2)通过shell脚本
官网对于使用shell脚本生成vfs_fonts.js文件的方法指导
(3)通过php脚本
我使用的是这种方法,所以前面两种没有详细介绍。
官网对于使用php脚本生成vfs_fonts.js文件的方法指导
将字体ttf文件和该php文件放置同一目录下,生成的vfs_fonts.js文件也会在该目录中。
<?php$output = "this.pdfMake = this.pdfMake || {}; this.pdfMake.vfs = {";$phpDir=dir('.');while (($file=$phpDir->read())!==false) {if ($file!='..' && $file!='.' && $file!='makefont.php' && $file!='vfs_fonts.js') {$output .= '"';$output .= $file;$output .= '":"';$output .= base64_encode(file_get_contents($file));$output .= '",';}}$output=substr($output,0,-1);$output .= "};";if (isset($_REQUEST['tofile'])) {$fh = fopen('vfs_fonts.js', 'w') or die("CAN'T OPEN FILE FOR WRITING");fwrite($fh,$output);fclose($fh);echo 'vjs_fonts.js created';} else {echo $output;}
如果在目录下未生成vfs_fonts.js文件,在浏览器中显示文件内容,可以去掉if (isset($_REQUEST['tofile'])) {}这个判断条件。
生成的vfs_fonts.js文件如图所示:

需要将前面的"run.php"内容删除,得到:

对比原来Roboto字体的vfs_fonts.js文件,发现要设置normal、bold、italics、bolditalics样式,也是在同一个vfs_fonts.js文件中:
this.pdfMake = this.pdfMake || {}; this.pdfMake.vfs = {
"xxx-Italic.ttf":"xxxxxxxxxxxxxxxx",
"xxx-Medium.ttf":"xxxxxxxxxxxxxxxx",
"xxx-MediumItalic.ttf":"xxxxxxxxxxxxxxxx",
"xxx-Regular.ttf":"xxxxxxxxxxxxxxxx"
}
使用该方法我导出的pdf能显示部分中文字体,也只能显示部分英文字体,不知道是生成方式有问题还是我字体ttf文件有问题。于是去找现成的资源了。
- 在网上寻找vfs_fonts.js资源
资源下载地址
四. pdfmake.js
(以下内容找不到可以去dataTable.buttons.min.js找,找的时候找相似格式,主要讲个思路)
- 设置字体
搜索Roboto,找到它设置字体样式部分,在后面添加自己的字体Chinese(这里四个样式用同一份字体文件):
pdfMake.fonts = {Roboto: {normal: 'Roboto-Regular.ttf',bold: 'Roboto-Medium.ttf',italics: 'Roboto-Italic.ttf',bolditalics: 'Roboto-MediumItalic.ttf'},Chinese: {normal: 'Chinese.ttf',bold: 'Chinese.ttf',italics: 'Chinese.ttf',bolditalics: 'Chinese.ttf'}
};
- 检查createPdf()函数

确保形式是pdfMake.createPdf(docDefinition, tableLayouts, fonts, vfs)。 - 修改defaultStyle

找如下格式:

此外,将pdfmake.js里除了pdfmake.fonts = {}外所有的“Roboto”改成自己的字体“Chinese”。
五. 解决

六.参考资料
一些有用的参考资料:
导出PDF按钮在前端界面设置,而非Datatable中设置的
官网中关于非英文字符导出PDF乱码的讨论
datatable 导出无乱码中文pdf文件
pdfmake实现中文支持,解决中文乱码问题
相关文章:
JS DataTable中导出PDF中文乱码
JS DataTable中导出PDF中文乱码 文章目录 JS DataTable中导出PDF中文乱码一. 问题二. 原因三. vfs_fonts.js四. pdfmake.js五. 解决六.参考资料 一. 问题 二. 原因 DataTable使用pdfmake,pdfmake默认字体为Roboto,不支持中文字体。添加自己的字体&#…...
代码签名证书续费
代码签名证书的有效周期是1-3年,这种情况下证书到期了就要重新申请办理,最开始同样的申请验证步骤还要再走一遍,尤其是Ukey还是要CA机构重新颁发,还是要等待快递配送。OV代码签名证书、EV代码签名证书目前行业内统一采取Ukey存储&…...
机器学习之ROC与AUC
文章目录 定义ROC曲线:AUC(Area Under the ROC Curve): 定义 ROC(Receiver Operating Characteristic)曲线和AUC(Area Under the ROC Curve)是用于评估二分类模型性能的重要工具。 …...
实用篇-Eureka注册中心
一、提供者与消费者 服务提供者:一次业务中,被其他微服务调用的服务。(提供接口给其他微服务) 服务消费者:一次业务中,调用其他微服务的服务。(调用其他微服务提供的接口) 例如前面的案例中,order-service微服务是服…...
基于springboot实现篮球竞赛预约平台管理系统项目【项目源码+论文说明】
基于springboot实现篮球竞赛预约平台管理系统演示 摘要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,篮球竞赛预约平台也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大&…...
OpenHarmony docker环境搭建所见的问题和解决
【摘要】OpenHarmony docker环境搭建需要一台安装Ubuntu的虚拟机,并且虚拟机中需要有VScode。 整个搭建流程请参考这篇博客:OpenHarmony docker环境搭建-云社区-华为云 (huaweicloud.com) 上篇博主是用Ubuntu的服务器进行环境搭建的,在使用VS…...
1817_ChibiOS的RT线程
全部学习汇总: GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 1. 关于线程,有几个概念需要弄清楚:声明、生命循环、延迟、线程引用、线程队列、线程时间、优先级管理、调度。 2. 两个声明…...
牛客网刷题-(7)
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...
多模态领域的先进模型
多模态学习领域涌现了许多先进的模型,这些模型能够处理来自不同感官模态的信息并实现多模态任务。以下是一些先进的多模态学习模型: CLIP (Contrastive Language-Image Pretraining):由OpenAI开发的CLIP是一种多模态预训练模型,能…...
列表自动向上滚动
列表自动向上滚动 鼠标放上去 自动停止滚动 <div id"list-detail-main"><div class"my_table_thead_tr"><div v-for"(item, index) in header" :key"index" class"my_table_thead_th">{{ item }}</div…...
嘴笨的技术人员怎么发言
对于嘴笨的人来说,即兴发言简直就是灾难,想想自己窘迫的模样,自己都受不了,但职场又避免不了这种场合,所以,就要靠一些技巧让我们顺利打开思路了。 那么,今天就分享几个解救过我的不同场景即兴发…...
vue源码分析(三)——new Vue 的过程(详解data定义值后如何获取的过程)
文章目录 零、准备工作1.创建vue2项目2.修改main.js 一、import Vue from vue引入的vue是哪里来的(看导入node_modules包)1: 通过node_modules包的package.json文件2: 通过配置中的main入口文件进入开发环境的源码(1&a…...
软考系统架构师知识点集锦四:信息安全技术基础知识
一、考情分析 二、考点精讲 2.1信息加解密技术 2.1.1对称加密 概念:对称加密(又称为私人密钥加密/共享密钥加密) : 加密与解密使用同一密钥。特点:加密强度不高,但效率高;密钥分发困难。 (大量明文为了保证加密效率一般使用对称加密) 常见对称密钥加密算法:DES:…...
Vscode中不显示.ipynb文件单元格行号
找到设置,搜索line number: 看到下面那个Notebook: Line Numbers 控制单元格编辑器中行号的显示。,选择on即可;...
【Oracle】[INS-30131]执行安装程序验证所需的初始设置失败。
这里写目录标题 一、问题描述1 报错内容1.1 无法从节点“kotin”检索 exectask 的版本1.2 工作目录"xxx"无法在节点"kotin"上使用 2 相关环境2.1 安装软件2.2 安装系统 3 解决思路分析 二、解决方案1 方案一、 满足验证条件 - 不换系统1.1 第一步、检查文件…...
二进制部署kubernetes集群的推荐方式
软件版本: 软件版本containerdv1.6.5etcdv3.5.0kubernetesv1.24.0 一、系统环境 1.1 环境准备 角色IP服务k8s-master01192.168.10.10etcd、containerd、kube-apiserver、kube-scheduler、kube-controller-manager、kubele、kube-proxyk8s-node01后续etcd、conta…...
智能矩阵,引领商业新纪元!拓世方案:打破线上线下界限,开启无限营销可能!
在科技赋能商业大潮中,一切行业都在经历巨大变革,传统的营销策略被彻底改变,催生着无数企业去打造横跨线上线下、多维度、全方位的矩阵营销帝国。无数的成功案例已经告诉我们,营销不再只是宣传,而是建立品牌与消费者之…...
ADB原理(第四篇:聊聊adb shell ps与adb shell ps有无双引号的区别)
前言 对于经常使用adb的同学,不可避免的一定会这样用adb,比如我们想在手机里执行ps命令,于是在命令行中写下如下代码: adb shell ps -ef 或者 adb shell "ps -ef" 两种方式都可以使用,你喜欢用哪个呢&#…...
「网络编程」数据链路层协议_ 以太网协议学习
「前言」文章内容是数据链路层以太网协议的讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、以太网协议简介二、以太网帧格式(报头)三、MTU对上层协议的影响四、ARP协议4.1 ARP协议的作用4.2 ARP协议报头 一、以太网协…...
通过python操作neo4j
在neo4j中创建结点和关系 创建结点 创建电影结点 例如:创建一个Movie结点,这个结点上带有三个属性{title:‘The Matrix’, released:1999, tagline:‘Welcome to the Real World’} CREATE (TheMatrix:Movie {title:The Matrix, released:1999, tagl…...
利用Taotoken多模型聚合能力为AIGC应用提供备选方案
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken多模型聚合能力为AIGC应用提供备选方案 在构建AIGC内容生成应用时,开发者通常会选择一个主流模型作为服务…...
Unity URP下缺失的MipMap可视化?手把手教你用Rendering Debugger和自定义Shader搞定
Unity URP下实现MipMap可视化的专业解决方案在Unity的URP(Universal Render Pipeline)环境中,纹理MipMap的调试一直是开发者面临的痛点。与Built-in管线不同,URP默认不提供直观的MipMap级别可视化工具,这使得性能优化过…...
ChartGPT深度解析:基于AI的自然语言图表生成架构设计与企业级应用
ChartGPT深度解析:基于AI的自然语言图表生成架构设计与企业级应用 【免费下载链接】chart-gpt AI tool to build charts based on text input 项目地址: https://gitcode.com/gh_mirrors/ch/chart-gpt ChartGPT是一款创新的AI驱动图表生成工具,通…...
pi.dev 域名获赠,一文了解 Pi Agent Harness 项目开发、贡献等全方面信息
pi.dev 域名由 exe.dev 慷慨捐赠新贡献者提交的新问题和拉取请求(PR)默认会自动关闭。维护者会每天审核自动关闭的问题,详情请参阅 CONTRIBUTING.md。Pi Agent Harness 单仓库这里是 pi agent harness 项目的主页,其中包含我们可自…...
基于MLP误差预测的自适应多尺度模拟:原理、实现与应用
1. 项目概述:当多尺度模拟遇见机器学习在计算材料科学、流体力学乃至生物物理领域,我们常常面临一个经典的两难困境:追求物理真实性的高精度模型(比如基于粒子的分子动力学模拟)计算成本高得吓人,而计算高效…...
华硕笔记本终极优化指南:如何用G-Helper轻量级工具全面提升使用体验
华硕笔记本终极优化指南:如何用G-Helper轻量级工具全面提升使用体验 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook…...
物理信息神经网络建模自诱导随机共振:噪声驱动相干振荡的PINN实现
1. 项目概述:当噪声成为秩序的“推手”在神经科学和复杂系统的研究中,我们常常将噪声视为需要被滤除的“杂质”。然而,一个反直觉的现象是,在特定的非线性动力学系统中,随机噪声不仅不会破坏秩序,反而能诱导…...
随机森林与保形预测:构建可解释、可信赖的通胀预测模型
1. 项目概述:当机器学习遇见通胀预测通胀预测一直是宏观经济分析和货币政策制定的核心挑战。传统的计量经济学模型,如基于菲利普斯曲线的线性回归,在处理复杂、非线性的经济关系时常常力不从心,尤其是在经济结构发生转变或面临外部…...
机器学习赋能冷等离子体种子处理:Extra Trees模型精准预测发芽率提升
1. 项目概述与核心价值 在精准农业的探索前沿,我们常常面临一个看似简单却极其关键的挑战:如何在不损伤种子的前提下,有效提升其发芽率和幼苗活力?传统方法依赖大量重复的田间试验,周期长、成本高,且结果受…...
告别瞎猜!用DBSCAN和K-means搞定毫米波雷达点云聚类,附完整Matlab代码与数据集
毫米波雷达点云聚类实战:DBSCAN与K-means算法深度对比与Matlab实现在自动驾驶和智能感知领域,毫米波雷达因其全天候工作能力和稳定的性能表现,成为环境感知系统中不可或缺的传感器。然而,原始雷达点云数据往往呈现出稀疏、噪声多且…...
