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主要有两种方法:自己生成和寻找资源。
<?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文件有问题。于是去找现成的资源了。
(以下内容找不到可以去dataTable.buttons.min.js找,找的时候找相似格式,主要讲个思路)
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'
}
};
pdfMake.createPdf(docDefinition, tableLayouts, fonts, vfs)
。一些有用的参考资料:
导出PDF按钮在前端界面设置,而非Datatable中设置的
官网中关于非英文字符导出PDF乱码的讨论
datatable 导出无乱码中文pdf文件
pdfmake实现中文支持,解决中文乱码问题