1. 问题背景与现象分析
最近在开发一个数据报表系统时,遇到了一个典型的前端导出问题:使用jsPDF库将表格数据导出为PDF时,中文字符全部显示为乱码。这个问题看似简单,实则涉及字符编码、字体嵌入、PDF生成原理等多个技术点。作为一名经历过多次类似坑的前端开发者,我想把完整的解决方案和经验总结分享给大家。
先描述下具体现象:当我们用jsPDF的autoTable插件生成包含中文的表格时,输出的PDF文件中所有中文都变成了"口口口"或者完全不可识别的乱码字符。这个问题在纯英文环境下不会出现,只有在包含中文、日文等非拉丁字符时才暴露出来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 乱码问题的根本原因
2.1 jsPDF的默认字体限制
jsPDF默认使用的是标准PDF字体(Helvetica),这些字体只包含基本的拉丁字符集。当遇到中文字符时,由于字体中不存在对应的字形,PDF阅读器就会显示为乱码或方框。
重要提示:PDF文件本身并不存储字体文件,而是引用系统或嵌入的字体。如果引用的字体不包含对应字符,就会显示异常。
2.2 字体嵌入的必要性
要让PDF正确显示中文,必须满足两个条件:
- 使用包含中文字形的字体
- 将该字体嵌入到PDF文件中
3. 完整解决方案
3.1 准备中文字体文件
首先需要获取一个合法的中文字体文件(.ttf格式)。推荐使用以下免费字体:
- 思源黑体(Source Han Sans)
- 阿里巴巴普惠体
- 站酷酷圆体
将字体文件放入项目的/public/fonts目录下。
3.2 创建字体加载工具函数
javascript复制// utils/loadFont.js
export async function loadChineseFont() {
const fontUrl = '/fonts/SourceHanSansCN-Regular.ttf';
const fontName = 'SourceHanSansCN';
const response = await fetch(fontUrl);
const fontData = await response.arrayBuffer();
return {
fontName,
fon
