使用jsPDF生成PDF时希伯来语等非英语文本显示乱码如何解决
问题现象
使用jsPDF生成PDF时,英文文本渲染完全正常,传入希伯来语文本时会输出与原内容无关的乱码:输入希伯来语单词עברית,最终PDF中实际显示为âÑèÙê。检索相关资料发现多类非英语语种使用jsPDF时都存在同类问题,初步推测问题与cp1255到UTF-8的编码转换相关,但未找到可落地的解决方案。
问题复现代码:
const word= 'עברית'; // 测试用希伯来语单词 const generatePDF = () => { const pdf = new jsPDF('example', 'px', 'a4', 'false'); pdf.text(60, 60, word); pdf.save('example.pdf'); // 输出乱码âÑèÙê而非正常的עברית }; generatePDF();
问题根因
jsPDF默认加载的内置字体均为西文字体,仅支持拉丁字符集,本身没有希伯来语对应的字形映射表,默认采用的单字节编码规则无法正确解析UTF-8编码的希伯来语多字节字符,直接传入希伯来语文本时会被错误拆分为单字节西文字符解析,最终输出乱码。此前猜测的cp1255与UTF-8编码转换方向不成立,编码转换无法解决字体本身缺失对应字形的核心问题。
解决步骤
- 准备支持希伯来语字形的TTF格式字体文件,优先选择开源可商用的希伯来语字体,避免字体版权问题。
- 将准备好的TTF字体转换为jsPDF兼容的格式,通过jsPDF官方字体转换工具生成可直接引入的JS格式字体文件,转换时确保字符集覆盖希伯来语Unicode区间。
- 在业务代码中引入转换完成的字体文件,生成PDF时先注册并切换到自定义的希伯来语支持字体,再执行文本写入操作。由于希伯来语是从右到左书写的RTL语言,写入文本时需要额外开启RTL适配,避免字符顺序颠倒。
修正后的可运行代码示例:
// 引入提前转换好的希伯来语支持字体文件 import './NotoSansHebrew-normal.js'; const word= 'עברית'; const generatePDF = () => { const pdf = new jsPDF('p', 'px', 'a4'); // 切换到已加载的希伯来语支持字体 pdf.setFont('NotoSansHebrew'); // 写入文本时开启RTL适配,保证希伯来语字符顺序正确 pdf.text(60, 60, word, { rtl: true }); pdf.save('example.pdf'); }; generatePDF();
内容的提问来源于stack exchange,提问作者rozina
相关产品推荐
相关产品推荐

