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

DataTable表格图片/图标在PDF及打印视图不显示的解决咨询

解决DataTable表格内图标/图片在PDF和打印视图不显示的问题

问题分析

表格内的<img>图标和FontAwesome图标无法在PDF/打印视图显示,而附加的logo正常,核心原因是:

  • PDF导出依赖pdfmake,它对图片的引用方式要求严格,相对路径的本地图片无法直接被解析;
  • 打印视图可能存在CSS优先级或图片加载的问题,FontAwesome图标本质是字体,需要确保打印样式中包含字体文件。

一、解决PDF导出时的图标显示问题

1. 将本地图片转为Base64编码

pdfmake无法直接读取本地相对路径的图片,需要把edit.png转为Base64格式(可通过在线工具完成转换),之后在DataTable的PDF自定义配置中处理表格内的图片。

2. 修改PDF按钮的自定义逻辑

在customize函数中遍历表格内容,替换图片的src为Base64编码:

{
    extend: 'pdfHtml5',
    customize: function (doc) {
        // 添加logo(保留原有逻辑)
        doc.content.splice(1, 0, {
            margin: [0, 0, 0, 12],
            alignment: 'center',
            image: '你的logo的Base64编码'
        });
        
        // 处理表格内的edit.png
        doc.content[2].table.body.forEach(row => {
            row.forEach(cell => {
                if (cell && cell.text && cell.text.includes('edit.png')) {
                    cell.image = 'edit.png的Base64编码';
                    delete cell.text; // 移除原有文本引用
                    cell.width = 25; // 设置图片宽度
                }
            });
        });
    }
}

3. FontAwesome图标处理

如果使用FontAwesome图标(如<i class="fa fa-edit"></i>),需将图标对应的Unicode字符直接写入,同时确保pdfmake包含FontAwesome字体:

customize: function (doc) {
    doc.defaultStyle.font = 'Roboto';
    doc.styles.title.font = 'Roboto';
    // 添加FontAwesome字体配置
    doc.fonts = {
        Roboto: {
            normal: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Regular.ttf',
            bold: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Medium.ttf',
            italics: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Italic.ttf',
            bolditalics: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-MediumItalic.ttf'
        },
        FontAwesome: {
            normal: 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf'
        }
    };
    // 遍历表格替换FontAwesome图标
    doc.content[2].table.body.forEach(row => {
        row.forEach(cell => {
            if (cell && cell.text && cell.text.includes('fa-edit')) {
                cell.text = '\uf044'; // fa-edit对应的Unicode
                cell.font = 'FontAwesome';
                cell.fontSize = 16;
            }
        });
    });
}

二、解决打印视图的图标显示问题

1. 修复<img>标签的打印样式

现有打印CSS用background设置图片,与原HTML的<img>标签冲突,修改打印CSS:

@media print {
    #example {
        margin-top: 100px;
    }
    .edit-icon {
        display: inline-block !important;
        width: 25px;
        height: 25px;
        padding: 5px;
        border-radius: 4px;
        background: none !important; /* 移除冲突的背景设置 */
    }
    img.edit-icon {
        visibility: visible !important; /* 确保图片不被隐藏 */
    }
}

2. FontAwesome图标打印处理

FontAwesome是字体,需确保打印样式中允许加载字体,添加以下CSS:

@media print {
    @font-face {
        font-family: 'FontAwesome';
        src: url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf') format('truetype');
    }
    .fa {
        font-family: 'FontAwesome' !important;
        visibility: visible !important;
    }
}

3. 打印按钮的自定义优化

确保打印窗口能正确加载图片和字体,修改打印按钮的customize函数:

{
    extend: 'print',
    customize: function (win) {
        // 预加载图片避免打印时加载失败
        $(win.document.body).prepend('<img src="edit.png" style="display:none;">');
        // 引入FontAwesome样式到打印窗口
        $(win.document.head).append('<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">');
        // 添加logo(保留原有逻辑)
        $(win.document.body).prepend('<img src="image.png" style="margin-bottom:20px;">');
    }
}

三、额外注意事项

  • 确保所有图片路径正确,或统一使用Base64编码避免路径问题;
  • 若使用FontAwesome 5+版本,需对应调整字体文件URL和Unicode字符;
  • 移除重复引入的资源(当前代码中重复引入了DataTables和pdfmake,建议只保留最新版本)。

内容的提问来源于stack exchange,提问作者Chandan Kumar Panigrahi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:55:07