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…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
