You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

DataTable jQuery导出PDF时阿拉伯语内容显示方向异常问题

Fix Arabic Text Reversal & Direction Issues When Exporting DataTables to PDF

我之前帮朋友解决过一模一样的问题——DataTables里阿拉伯语显示正常,但导出PDF就顺序颠倒、方向乱掉。这本质是因为默认的PDF导出工具(pdfmake)没正确处理RTL(从右到左)语言的排版规则,下面是几个亲测有效的解决办法:

方案1:配置pdfmake的RTL模式与阿拉伯语字体支持

这是最核心的解决步骤,需要同时开启PDF文档的RTL方向,并加载支持阿拉伯语的字体:

  1. 先确保引入必要的资源
    除了DataTables和Buttons插件,还要引入pdfmake和对应的字体文件(推荐用AmiriNoto Naskh Arabic这类专门的阿拉伯语字体)。如果用CDN,可以在页面里添加:

    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
    
  2. 自定义字体配置
    在初始化DataTables前,先告诉pdfmake要使用的阿拉伯语字体(这里以Amiri为例,你需要把字体文件放在项目对应路径,或者用base64编码嵌入):

    pdfMake.fonts = {
      Amiri: {
        normal: 'Amiri-Regular.ttf',
        bold: 'Amiri-Bold.ttf',
        italics: 'Amiri-Italic.ttf',
        bolditalics: 'Amiri-BoldItalic.ttf'
      }
    };
    
  3. 在DataTables导出配置中开启RTL
    初始化表格时,给PDF按钮添加自定义配置,设置文档和表格的方向,同时指定字体:

    $('#your-table-id').DataTable({
      dom: 'Bfrtip', // 显示导出按钮
      buttons: [
        {
          extend: 'pdfHtml5',
          text: '导出PDF',
          customize: function(doc) {
            // 设置整个文档为RTL方向
            doc.defaultStyle.direction = 'rtl';
            // 单独设置表格的RTL方向
            doc.content[1].table.direction = 'rtl';
            // 给所有文本设置阿拉伯语字体
            doc.defaultStyle.font = 'Amiri';
            doc.styles.title.font = 'Amiri';
            doc.styles.header.font = 'Amiri';
            // 确保表格单元格右对齐
            doc.content[1].table.body.forEach(row => {
              row.forEach(cell => {
                cell.alignment = 'right';
              });
            });
          },
          // 确保导出时使用专门的渲染值(配合后续的render处理)
          exportOptions: {
            orthogonal: 'export'
          }
        }
      ]
    });
    

方案2:添加双向文本控制字符

如果某些混合语言(阿拉伯语+英语)的文本还是乱序,可以在导出前给阿拉伯语文本强制添加RTL控制字符,避免排版混乱:

在表格的列配置里,给阿拉伯语列添加渲染规则:

columns: [
  {
    data: 'arabic_content',
    render: function(data, type) {
      // 仅在导出时添加控制字符
      if (type === 'export') {
        // \u202B 强制开启RTL嵌入,\u202C 结束嵌入
        return '\u202B' + data + '\u202C';
      }
      // 页面显示时保持原样
      return data;
    }
  }
]

方案3:升级插件版本

旧版本的DataTables或pdfmake对RTL语言的支持有bug,建议升级到最新稳定版:

  • DataTables:升级到1.13.x及以上版本
  • pdfmake:升级到0.2.x及以上版本

这些步骤应该能解决你遇到的文本颠倒和方向问题,我当时就是用方案1+方案2搞定的~

内容的提问来源于stack exchange,提问作者Nanji Mange

火山引擎 最新活动