You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bootstrap-table导出PDF西班牙语特殊字符乱码问题求助

解决Bootstrap-table导出PDF时西班牙语特殊字符乱码问题

问题背景

在Visual Studio的.NET项目中,使用Bootstrap-table结合tableExport.js(依赖jsPDF)生成PDF时,西班牙语特殊字符(á、é、í、ó、ú、ñ)显示异常。原因是PDF标准14种字体仅支持ASCII编码,需集成含UTF-8字形的自定义字体,但由于未直接实例化jsPDF,无法将字体配置与Bootstrap-table的导出流程结合。

现有代码

$(function () {
    function DoCellData(cell, row, col, data) { }
    function DoBeforeAutotable(table, headers, rows, AutotableSettings) { }

    $("#frm-Search").on("submit", function (event) {
        event.preventDefault();
        var $frm = $(this);
        var formData = $frm.serializeObject();
        if ($frm.valid()) {
            /*loading(true);*/
            GetSpanishData(formData).then(function (result) {
                $("#tbReport").bootstrapTable({
                    search: true,
                    pagination: true,
                    export: true,
                    exportOptions: {
                        fileName: 'TheSpanishReport',
                        jspdf: {
                            format: 'bestfit',
                            margins: { left: 20, right: 20, top: 20, bottom: 20 },
                            autotable: {
                                styles: { overflow: 'linebreak' },
                                tableWidth: 'wrap',
                                tableExport: {
                                    onBeforeAutotable: DoBeforeAutotable,
                                    onCellData: DoCellData
                                }
                            }
                        },
                    },
                    exportTypes: ['csv', 'excel', 'pdf'],
                    data: result
                });
                $("#tbReport").bootstrapTable('refreshOptions', {
                    data: result
                });
                $("#tableReport").attr("hidden", false);
            });
        }
        return false;
    }).validate();
});

function GetSpanishData(data) {
    return $.ajax({
        url: ServerAdress/GetSpanishData',
        type: 'POST',
        dataType: 'json',
        data: AntiForgeryToken(data)
    });
}

尝试过的无效配置

直接在jspdf根配置中添加setFont未生效:

jspdf: {
    setFont:'MyFontName',
    format: 'bestfit',
    margins: { left: 20, right: 20, top: 20, bottom: 20 },
    autotable: {
        styles: { overflow: 'linebreak' },
        tableWidth: 'wrap',
        tableExport: {
            onBeforeAutotable: DoBeforeAutotable,
            onCellData: DoCellData
        }
    }
},

解决方案

步骤1:转换并引入自定义字体

  • 选择支持西班牙语所有特殊字符的TTF字体(如Arial Unicode MS、Noto Sans等)
  • 使用jsPDF自带的/fontconverter/fontconverter.html工具,将TTF文件转换为包含base64编码及字体注册代码的JS文件
  • 在项目中引入该JS文件(确保加载顺序在jsPDF、tableExport.js、Bootstrap-table之后)

步骤2:通过钩子函数配置字体

修改DoBeforeAutotable函数,直接操作jsPDF实例和表格样式:

function DoBeforeAutotable(table, headers, rows, AutotableSettings) {
    // 获取导出用的jsPDF实例
    const doc = AutotableSettings.doc;
    // 设置自定义字体(名称需与转换后的JS文件中定义的一致)
    doc.setFont("MyFont", "normal");
    // 强制表格使用自定义字体,覆盖默认样式
    AutotableSettings.styles.font = "MyFont";
    AutotableSettings.styles.fontSize = 10; // 按需调整字号
}

步骤3:确认配置关联

确保Bootstrap-table的exportOptions.jspdf.autotable.tableExport.onBeforeAutotable仍指向修改后的DoBeforeAutotable函数,无需保留根配置中的setFont项。

关键注意事项

  • 转换后的字体JS文件会自动执行addFileToVFS和addFont,无需手动调用
  • 必须验证所选字体包含西班牙语特殊字符的字形,否则仍会出现乱码
  • onBeforeAutotable是Bootstrap-table导出PDF时唯一能直接操作jsPDF实例的入口,是实现字体配置的核心

内容的提问来源于stack exchange,提问作者David Lazaro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:50:32