JS DataTable中导出PDF中文乱码

JS DataTable中导出PDF中文乱码

一. 问题

在这里插入图片描述

二. 原因

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主要有两种方法:自己生成和寻找资源。

  1. 自己生成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文件有问题。于是去找现成的资源了。

  1. 在网上寻找vfs_fonts.js资源
    资源下载地址
四. pdfmake.js

(以下内容找不到可以去dataTable.buttons.min.js找,找的时候找相似格式,主要讲个思路)

  1. 设置字体
    搜索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'
  }
};
  1. 检查createPdf()函数
    在这里插入图片描述
    确保形式是pdfMake.createPdf(docDefinition, tableLayouts, fonts, vfs)
  2. 修改defaultStyle
    在这里插入图片描述
    找如下格式:
    在这里插入图片描述
    此外,将pdfmake.js里除了pdfmake.fonts = {}外所有的“Roboto”改成自己的字体“Chinese”。
五. 解决

在这里插入图片描述

六.参考资料

一些有用的参考资料:
导出PDF按钮在前端界面设置,而非Datatable中设置的
官网中关于非英文字符导出PDF乱码的讨论
datatable 导出无乱码中文pdf文件
pdfmake实现中文支持,解决中文乱码问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
自己写的C#常用类库,使用时请先添加引用:UsrCustomFun.dll、DevComponents.DotNetBar2.dll,压缩包内的其他文件请与UsrCustomFun.dll放置同一目录,然后在程序引用命名空间:using UsrCustomFun;包括: 1.自定义MessageBox,消息内容与错误代码分开,使用了6个重载方式。调用方法例子: UserMessageBox.UsrShow("执行SQL查询出错!", "数据库错误", ec.Message.ToString()); 2.等待提示窗口,使用了3个重载方法。 打开:UserWaitBox.UsrShow("等待信息"); 关闭:UserWaitBox.UsrClose(); 3.打印DataGridView,使用了9个重载方式,可自定义标题与打印样式: DataGridViewPrint.PrintDgv(dataGridView); 4.DataTable导出为Excel,3个重载方式: DataTableToExcel.DtToExcel(DataTable); 5.DataTable生成Pdf文件,6个重载方式: UsrExport.ExPdf(dataTable); 6.XML文件操作,可根据XML文件节点、路径来读取、修改、写入XML: UserXml.ReadXml(string XML的路径); UserXml.ReadXmlElement(string XML的路径,节点名称); UserXml.WriteXmlElement(XML路径,节点名称,内容); 7.数据库操作,目前有Access、SqlServer、Oracel (7.1)先配置数据库连接字符串: UsrCustomFun.SqlConn.SqlParameters下根据数据库类型返回一个数据库连接字符串。 (7.2)再执行数据库操作: (7.2.1)UsrCustomFun.SqlConn.SqlConnAccess下为Access的数据库操作,可根据SQL返回int型、string型、DataTable、DataReader、DataSet及无返回操作。 (7.2.2)UsrCustomFun.SqlConn.SqlConnOracle,操作类型同7.2.1 (7.2.3)UsrCustomFun.SqlConn.SqlConnSqlServer,操作类型同7.2.1

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X to Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值