pdfkit对UTF-8全字符(含阿拉伯、韩、中文等)支持失效求助
解决PDFKit无法渲染阿拉伯语、韩语、中文等UTF-8字符的问题
核心原因
PDFKit自带的标准字体(如Helvetica、Times-Roman)仅覆盖基本ASCII及少量西方字符,不支持东亚、阿拉伯语这类复杂字符集,必须嵌入包含对应字符的TrueType/OpenType字体才能正常渲染。
具体解决方案
- 选择支持多语言的字体:推荐使用Google开源的Noto系列字体(如Noto Sans),它支持几乎所有UTF-8字符,涵盖中文、韩语、阿拉伯语等多种语言;也可根据需求选择专用字体(如Noto Sans SC、Noto Sans KR)。
- Node.js环境嵌入字体:
将字体文件放置在项目目录中,通过font()方法加载并嵌入:const PDFDocument = require('pdfkit'); const fs = require('fs'); const doc = new PDFDocument(); doc.pipe(fs.createWriteStream('multi-language.pdf')); // 加载本地Noto Sans字体 doc.font('./NotoSans-Regular.ttf') .fontSize(14) .text('中文测试文本') .text('한글 테스트 문자') .text('العربية اختبار نص') .text('ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎㅏ ㅑ ㅓ ㅕ ㅗ ㅛ ㅜ ㅠ ㅡ ㅣ'); doc.end(); - 浏览器环境嵌入字体:
通过Fetch API加载字体文件转为ArrayBuffer后传入PDFKit:import PDFDocument from 'pdfkit'; import blobStream from 'blob-stream'; async function generateMultiLangPDF() { // 加载字体文件 const fontBuffer = await fetch('/fonts/NotoSans-Regular.ttf').then(res => res.arrayBuffer()); const doc = new PDFDocument(); const stream = doc.pipe(blobStream()); doc.font(fontBuffer) .fontSize(14) .text('多语言渲染测试:中文、韩语、阿拉伯语'); doc.end(); // 生成下载链接 stream.on('finish', () => { const blob = stream.toBlob('application/pdf'); const downloadLink = document.createElement('a'); downloadLink.href = URL.createObjectURL(blob); downloadLink.download = 'multi-lang.pdf'; downloadLink.click(); }); } - 阿拉伯语额外处理:阿拉伯语是从右到左(RTL)的书写系统,PDFKit原生对RTL排版支持不足,需借助
rtl-converter等工具调整字符顺序后再渲染,确保文本排版符合阅读习惯。
验证
替换字体后重新生成PDF,检查各类UTF-8字符是否正常显示,可直接用你提供的韩语字符集测试验证。
内容的提问来源于stack exchange,提问作者Stefan Brendle
相关产品推荐
相关产品推荐

