码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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主要有两种方法:自己生成和寻找资源。

    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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    如果在目录下未生成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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. 检查createPdf()函数
      在这里插入图片描述
      确保形式是pdfMake.createPdf(docDefinition, tableLayouts, fonts, vfs)。
    2. 修改defaultStyle
      在这里插入图片描述
      找如下格式:
      在这里插入图片描述
      此外,将pdfmake.js里除了pdfmake.fonts = {}外所有的“Roboto”改成自己的字体“Chinese”。
    五. 解决

    在这里插入图片描述

    六.参考资料

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

  • 相关阅读:
    ChatGPT如何应对用户的情感和心理需求?
    selenium4.0的一些基本用法
    伊顿将在汉诺威国际商用车展上重点推介可持续商用车技术
    Python实现基于深度学习的图像风格迁移
    基于JSP的房屋租赁系统
    【Ruoyi管理后台】用户登录强制修改密码
    UG NX11.0 软件安装教程
    基于Ascend910+PyTorch1.11.0+CANN6.3.RC2的YoloV5训练推理一体化解决方案
    ES6的重要特性
    oracle框架
  • 原文地址:https://blog.csdn.net/X_To_Y/article/details/134026399
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号